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

时间:2018-11-27 12:39:59

标签: matlab curve-fitting polynomials

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

Plot of measurements

现在,我想将二阶多项式拟合到此曲线。因此,在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完全符合多项式:

Badly fitted curve

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

2 个答案:

答案 0 :(得分:3)

尽管您没有使用它们,但是当您指定其他输出时,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的相关摘录:

enter image description here

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

enter image description here

答案 1 :(得分:2)

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

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

选项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);

输出

enter image description here