MatLab和R语言中的正弦拟合
我正在将代码从MatLab翻译成R,但是我对MatLab完全陌生。我很难理解MatLab代码中发生了什么以及如何将其转换为R。问题是: 在代码中,一个函数调用另一个名为@fit_sine的函数MatLab和R语言中的正弦拟合,r,matlab,translate,R,Matlab,Translate,我正在将代码从MatLab翻译成R,但是我对MatLab完全陌生。我很难理解MatLab代码中发生了什么以及如何将其转换为R。问题是: 在代码中,一个函数调用另一个名为@fit_sine的函数 x0=[max(y),2*3.14159/360,0.01,mean(y)]; options = optimset('Display','off'); coeff=lsqcurvefit(@fit_sine,x0,x,y,[],[],options); fit=coeff(1).*sind(coeff
x0=[max(y),2*3.14159/360,0.01,mean(y)];
options = optimset('Display','off');
coeff=lsqcurvefit(@fit_sine,x0,x,y,[],[],options);
fit=coeff(1).*sind(coeff(2).*x+coeff(3))+coeff(4);
这是函数@fit_sine:
function F=fit_sine(x,xdata)
F=x(1).*sind(x(2).*xdata+x(3))+x(4);
然而,没有定义扩展数据。这一步让我感到困惑。在R中有一个类似于lsqcurvefit的函数,它是nls,但我无法再现与此MatLab代码类似的结果
以下是用于x和y的数据:y=-0.4764-1.0880-1.0115-0.8586-0.7822-0.7058-0.4000 0.3644 0.8231 0.7466 0.5173 0.4408
x=0 30 60 90 120 150 180 210 240 270 300 330
以及系数的输出:coeff=0.9098 0.8974-157.6722-0.1853
编辑:
解决方案:
fp <- function(x0, x) (x0[1]*sin((x0[2]*x+x0[3])*(pi/180))+x0[4])
library(pracma)
coeff <- lsqcurvefit(fp, x0, x, y)
fit=coeff$x[1]*sin((coeff$x[2]*x+coeff$x[3])*(pi/180))+coeff$x[4]
fpfit_sine
是一个用户定义的函数,它接受两个输入:x
和xdata
。就像在R中一样,这些函数不需要在函数外部命名为相同的名称。fit_sine
函数是用于进行最小二乘曲线拟合的非线性函数lsqcurvefit
接受输入(函数x0,x,y)
和其他输入。根据文件
lsqcurvefit(fun,x0,扩展数据,ydata)从x0开始,并找到系数x,以使非线性函数fun(x,扩展数据)最适合数据ydata(在最小二乘意义上)。ydata必须与fun返回的向量(或矩阵)F大小相同
在这种情况下,编写fit_sine
函数的人将x0
定义为x
和x
定义为xdata
,可能是为了匹配MATLAB文档。谢谢,你知道这是怎么被翻译成R的吗?@megmac你可以用R定义函数fit\u sine
,就像你在R中定义任何函数一样。我想你提到过lsqcurvefit
也存在于R中,所以转换起来应该很简单。