MatLab和R中的正弦拟合

问题描述 投票:0回答:1

我正在将代码从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);

但是xdata没有定义。这是令我感到困惑的步骤。在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.4408x = 0 30 60 90 120 150 180 210 240 270 300 330

以及coeff的输出: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]
r matlab translate
1个回答
1
投票

fit_sine是用户定义的函数,需要两个输入:xxdata。就像在R中一样,不需要在函数外部使用相同的名称。 fit_sine函数是用于进行最小二乘曲线拟合的非线性函数。 lsqcurvefit接受输入(a function, x0, x, y)和其他输入。在文档中,

lsqcurvefit(fun,x0,xdata,ydata)从x0开始,并找到系数x,以使非线性函数fun(x,xdata)最适合数据ydata(在最小二乘意义上)。 ydata的大小必须与fun返回的向量(或矩阵)F的大小相同。

在这种情况下,编写fit_sine函数的人都将x0定义为x,将x定义为xdata,大概是为了匹配MATLAB文档。

© www.soinside.com 2019 - 2024. All rights reserved.