MatLab 和 R 中的正弦拟合
Sine Fitting in MatLab and R
我正在努力将代码从 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的输出:
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]
fit_sine
是一个用户定义的函数,它接受两个输入:x
和 xdata
。就像在 R 中一样,这些不需要在函数外命名。 fit_sine
函数是用于进行最小二乘曲线拟合的非线性函数。 lsqcurvefit
接受输入 (a function, x0, x, y)
加上其他。从文档中,
lsqcurvefit(fun,x0,xdata,ydata) starts at x0 and finds coefficients x to best fit the nonlinear function fun(x,xdata) to the data ydata (in the least-squares sense). ydata must be the same size as the vector (or matrix) F returned by fun.
在这种情况下,编写 fit_sine
函数的人将 x0
定义为 x
,将 x
定义为 xdata
,大概是为了匹配 MATLAB 文档。
我正在努力将代码从 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的输出:
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]
fit_sine
是一个用户定义的函数,它接受两个输入:x
和 xdata
。就像在 R 中一样,这些不需要在函数外命名。 fit_sine
函数是用于进行最小二乘曲线拟合的非线性函数。 lsqcurvefit
接受输入 (a function, x0, x, y)
加上其他。从文档中,
lsqcurvefit(fun,x0,xdata,ydata) starts at x0 and finds coefficients x to best fit the nonlinear function fun(x,xdata) to the data ydata (in the least-squares sense). ydata must be the same size as the vector (or matrix) F returned by fun.
在这种情况下,编写 fit_sine
函数的人将 x0
定义为 x
,将 x
定义为 xdata
,大概是为了匹配 MATLAB 文档。