R 数据拟合参数方程

R 数据拟合参数方程,r,curve-fitting,parametric-equations,R,Curve Fitting,Parametric Equations,我将使用我的数据实施此方法。 . 对于不同的x间隔,我有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*

我将使用我的数据实施此方法。 . 对于不同的x间隔,我有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)
曲线需要一个矢量化函数,如果没有矢量化。您可以使用ifelse,但更具可读性和效率的是,通过将布尔值强制为0/1,R可以在计算中使用布尔值

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)

作为第一步,您需要对函数进行矢量化。那么,curve需要的是x的函数或表达式,而不是函数调用。@Roland请您详细说明如何向量化函数好吗?现在nls函数出现错误nlsw~Funct,t1,t2,t3,t4,t5,t6,a1,a2,a3,a4,a5,a6,b1,b2,c1,c2,c3,c4,c5,c6,start=listt1=1.4,t2=14.4,t3=41.8,t4=60.3,t5=194.3,t6=527.0,a1=0.0022,a2=0.0029,a3=0.0016,a4=0.00001,a5=0.00001,a6=0.0168,b1=0.0001,b2=-0.0006,c1=0.0063,c2=-0.0433,c3=-0.0022,c4=0.00408,c5=0.2337,c6=-5.3732您应该放弃使用nls拟合此函数的所有希望。是否有其他方法拟合曲线?如果您有大量数据,可能类似分段回归。
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)