Подгонка параметрических уравнений к данным
Я должен реализовать эту методологию, используя мои данные. Подгонка известного уравнения к данным. Как бы то ни было, у меня есть 6 различных уравнений для разных интервалов х.
Ниже приведена функция, которую я использую, чтобы соответствовать уравнениям
Func <- function(t,t1,t2,t3,t4,t5,t6,a1,a2,a3,a4,a5,a6,b1,b2,c1,c2,c3,c4,c5,c6){
if(t<t1){
t*0
}
else if(t>=t1&t<t2){
a1*t+c1
}
else if(t>=t2&t<t3){
a3*t+c2
}
else if(t>=t3&t<t4){
a3*t+c3
}
else if(t>=t4&t<t5){
a4*t**2 + b1*t+c4
}
else if(t>=t5&t<t6){
a5*t**2 + b2*t+c5
}
else if(t>=t6){
a6*t+c6
}
}
plot(t,w)
curve(Func(t,1.4,14.4,41.8,60.3,194.3,527,0.0022,0.0029,0.0016,0.00001,0.00001,0.0168,0.0001,-0.0006,0.0063,-0.0433,-0.0022,0.00408,0.2337,-5.3732),add=TRUE)
При выполнении функции кривой я получаю ошибку:
Error in curve(Func(t, 1.4, 14.4, 41.8, 60.3, 194.3, 527, 0.0022, 0.0029, :
'expr' must be a function, or a call or an expression containing 'x'
1 ответ
Решение
curve
нужна векторизованная функция и if
не векторизован. Ты можешь использовать ifelse
, но более читабельно и эффективно использовать то, что R может использовать логические значения в вычислениях, приводя их к 0/1.
Func <- function(t,t1,t2,t3,t4,t5,t6,a1,a2,a3,a4,a5,a6,b1,b2,c1,c2,c3,c4,c5,c6){
(t<t1) * t * 0 +
(t>=t1&t<t2) * (a1*t+c1) +
(t>=t2&t<t3) * (a3*t+c2) +
(t>=t3&t<t4) * (a3*t+c3) +
(t>=t4&t<t5) * (a4*t**2 + b1*t+c4) +
(t>=t5&t<t6) * (a5*t**2 + b2*t+c5) +
(t>=t6) * (a6*t+c6)
}
t <- (1:10000)/10
plot(t, t/100)
#you must use x here
curve(Func(x,1.4,14.4,41.8,60.3,194.3,527,0.0022,0.0029,0.0016,0.00001,0.00001,0.0168,
0.0001,-0.0006,0.0063,-0.0433,-0.0022,0.00408,0.2337,-5.3732),add=TRUE)