这里的任何人可以帮我解决以下问题吗? 以下代码计算适合给定数据集的最佳多项式,即:指定度数的多项式。
不幸的是,无论数据集是什么,通常是6级或更高,MATLAB都会完全错误。通常,拟合曲线完全远离数据,以一种向前看的方式向下。 (参见示例:degree = 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
提前致谢。
答案 0 :(得分:4)
首先,一些评论:对于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} \ {端方程} 解决问题更好 \开始{}方程 (A ^ \ mathrm {T} A)a = A ^ \ mathrm {T} y ^ \ mathrm {T} \ {端方程} 通过其他方式。在您的MATLAB代码中,您可以替换
a=inv((transpose(A)*A))*transpose(A)*y';
通过
a = (transpose(A) * A) \ (transpose(A) * y');
通过对代码的这种修改,我获得了通过数据点的拟合。