【问题标题】:Sine Fitting in MatLab and RMatLab 和 R 中的正弦拟合
【发布时间】:2020-04-15 03:04:13
【问题描述】:

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

【问题讨论】:

    标签: r matlab translate


    【解决方案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 文档。

    【讨论】:

    • 谢谢,你知道这会如何被偶然翻译成R吗?
    • @megmac 您可以在 R 中定义函数 fit_sine,就像在 R 中定义任何函数一样。我想您提到 lsqcurvefit 也存在于 R 中,所以应该很漂亮易于转换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    相关资源
    最近更新 更多