【问题标题】:Fitting a line that passes through the origin (0,0) to data将穿过原点 (0,0) 的线拟合到数据
【发布时间】:2023-03-25 20:09:01
【问题描述】:

我有一组点(x,y),我需要使用 MATLAB 找到穿过原点的最佳拟合线。

【问题讨论】:

  • 您如何定义“最合适”的标准?最小二乘误差?
  • 是的,没错——感谢您指出这一点很重要。

标签: algorithm matlab numerical curve-fitting least-squares


【解决方案1】:

简而言之:你的函数必须是y=ax+0的形式,这样polyfit就没用了。但是你可以使用最小二乘法:

 a = x(:)\y(:);

解释:

您有n 方程和一个需要找到的变量a

 a*x1 = y1;
 a*x2 = y2;
 ...
 a*xn = yn;

运算符\ 找到最小二乘解。

或者,您可以手动找到解决方案:

 a = (x'*x) \ (x'*y);

或在伪代码中:

     (x1*y1 + x2*y2  + ... xn*yn)
a =  ----------------------------
     (x1*x1 + x2*x2  + ... xn*xn)

如果您不使用 Matlab - 例如在 C 代码中,这很有用。


示例和代码sn-p:

function FindLSSolution()
    a = 2.5;
    x = rand(100,1)*10;
    y = a*x + randn(100,1);
    figure;scatter(x,y);

    A = x(:)\y(:);
    hold on;plot(x, A*x,'g');
end

【讨论】:

  • @dr_rk,是的,但不推荐,因为它的速度较慢且数值不稳定
【解决方案2】:

如果你有“曲线拟合工具箱”,你可以使用

f = fit( x, y, 'a*x' );

【讨论】:

    【解决方案3】:

    一般来说,最佳拟合线穿过数据的质心(平均 x 和平均 y)。所以找到质心并绘制从原点到质心的线。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-19
      相关资源
      最近更新 更多