【问题标题】:MATLAB curve fitting - least squares method - wrong "fit" using high degreesMATLAB曲线拟合 - 最小二乘法 - 使用高度的错误“拟合”
【发布时间】:2015-02-14 23:37:29
【问题描述】:

这里有人可以帮助我解决以下问题吗? 以下代码计算适合给定数据集的最佳多项式,即;指定次数的多项式。

不幸的是,无论数据集是什么,通常是 6 级或更高,MATLAB 完全不适合。通常拟合曲线完全远离数据以一种向下看的指数方式。 (参见示例:度数 = 8)。

x=[1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5] % experimental x-values
y=[4.3 6.2 10.1 13.5 19.8 22.6 24.7 29.2] % experimental y-values

degree=8; % specify the degree
A = zeros(length(x),degree);
for exponent=0:degree;
for data=1:length(x);
   A(data,exponent+1)=x(data).^exponent; % create matrix A
end;
end;

a=inv((transpose(A)*A))*transpose(A)*y'; % a are the coëfficients of the polynom
a=flipud(a);
fitpolynoom=polyval(a,x);
error=sum((y-fitpolynoom).^2); % calculates the fit-error using the least-squares method
fitpolynoom=polyval(a,x);

figure;
plot(x,y,'black*',x,fitpolynoom,'g-');

error % displays the value of the fit-error in the Matlab command window

提前致谢。

【问题讨论】:

    标签: matlab least-squares curve-fitting


    【解决方案1】:

    首先,请注意:对于 Matlab 中的最小二乘拟合多项式,您可以改用现有的polyfit 函数。此外(这可能取决于您的应用程序)您可能不应该拟合 8 美元的多项式,尤其是当您有 8 美元的数据点时。在这个答案中,我假设您有充分的理由将多项式拟合到您的数据中(例如,仅出于自学目的)。

    这个问题是由矩阵求逆引起的数值问题。对于求解 $Ax=b$ 类型的方程,其中 $A$ 是方阵,实际上不建议对 $A$ 求逆(请参阅Blogpost 'Don't invert that matrix' by John D. Cook)。在最小二乘情况下,而不是 \开始{方程} a = (A^\mathrm{T} A)^{-1} A^\mathrm{T} y^\mathrm{T} \end{方程} 最好解决 \开始{方程} (A^\mathrm{T} A)a = A^\mathrm{T} y^\mathrm{T} \end{方程} 通过其他方式。在您的 MATLAB 代码中,您可以替换

    a=inv((transpose(A)*A))*transpose(A)*y';
    

    通过

    a = (transpose(A) * A) \ (transpose(A) * y');
    

    通过对您的代码的这种修改,我通过数据点获得了拟合。

    【讨论】:

    • 非常感谢!我不知道。其他人使用不同的方法解决了这个问题:math.stackexchange.com/questions/1070670/… 两种方法的拟合误差不同,但我想知道其中哪一种是“最现实的”?也许其中一个使用更高次多项式的振荡峰值也不那么剧烈(这似乎主要发生在数据向量的最后(或第一个)元素处,我想知道为什么以及更多:这些振荡不能避免或平均化吗? )?
    • 我真的建议你阅读@JuhoKokkala 发布的博文。
    • 我已经读过了。这很有趣,但不清楚作者在谈论哪种因式分解。此外,在文章的 cmets 中,有一个有趣的链接指向一篇有趣的文章,指出矩阵求逆不应该不太准确http://arxive...
    • 在最小二乘的情况下,通过执行 A 的 QR 因式分解来求解意味着您不必形成矩阵 A'*A。后一个矩阵的条件数将是 A 的条件数的平方,这意味着您将失去准确性。
    猜你喜欢
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    相关资源
    最近更新 更多