如何使用 Matlab 的 polyfit 获得合适的曲线拟合?

How to get a proper curve fit using Matlab's polyfit?

我正在尝试在 Matlab 中拟合一条简单的多项式曲线。我有测量数据(可以下载 here),看起来像这样:

现在我想用二次多项式拟合这条曲线。所以在 Matlab 中我做了以下操作:

load vel.csv
load dp.csv
[p, ~, ~] = polyfit(vel, dp, 2);

figure()
scatter(vel, dp);
hold on;
plot(vel,polyval(p,vel));
hold off;

但是结果看起来不像 Matlab 完全符合多项式:

如何使用 Matlab 的 polyfit 函数获得合适的曲线拟合?

polyfit 的使用是正确的,但是您在绘制多项式时忘记包括 S and mu

有两种方法可以修复您的代码:

选项 1

改变

[p, ~, ~] = polyfit(vel, dp, 2);
plot(vel,polyval(p,vel));

成为

[p, S, mu] = polyfit(vel, dp, 2);
plot(vel,polyval(p,vel,S,mu));

选项2

不要指定 Smu。变化

[p, ~, ~] = polyfit(vel, dp, 2);

成为

p = polyfit(vel, dp, 2);

输出

虽然您不使用它们,但当您指定附加输出时,polyfit 会在执行多项式拟合之前对 x 数据进行居中和缩放,这会导致不同的多项式系数:

>> [p, ~, ~] = polyfit(vel, dp, 2)
p =

    1.4683   35.7426   68.6857

>> p = polyfit(vel, dp, 2)
p =

   0.022630   3.578740  -7.354133

这是 polyfit documentation 的相关摘录:

如果您选择该选项,则在调用 polyval 时需要使用第三个输出来居中和缩放数据,然后再应用多项式系数。我的建议是坚持对 polyfit 的第二次调用,它给出正确的多项式并生成正确的图,除非你真的需要居中和缩放数据: