Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MatLab和R语言中的正弦拟合_R_Matlab_Translate - Fatal编程技术网

MatLab和R语言中的正弦拟合

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

我正在将代码从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(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]

fp
fit_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中,所以转换起来应该很简单。