基本概念
在大量的应用领域中,人们经常面临用一个解析函数描述数据(通常是测量值)的任务。对这个问题有两种方法:
| 方法 | 特点 |
|---|---|
| 插值法 | 数据假定是正确的,要求以某种方法描述数据点之间所发生的情况 |
| 曲线拟合(回归) | 设法找出某条光滑曲线,最佳地拟合数据,但不必要经过任何数据点 |
图示说明
图11.1 展示了这两种方法的区别:
-
标有
o的是数据点 -
实线:连接数据点,描绘了线性内插
-
虚线:数据的最佳拟合曲线
曲线拟合的核心问题
-
最佳拟合意味着什么?
-
应该用什么样的曲线?
最小二乘曲线拟合
当最佳拟合被解释为数据点的误差平方和最小,且所用的曲线限定为多项式时,曲线拟合是相当简捷的。数学上称为多项式的最小二乘曲线拟合。
误差:虚线和数据点之间的垂直距离
误差平方和:对各数据点距离求平方,再全部加起来
最小二乘:使误差平方和最小的省略说法
MATLAB中的曲线拟合函数
polyfit 函数
MATLAB中,函数 polyfit 求解最小二乘曲线拟合问题。
示例:2阶曲线拟合
原始数据:
x = [0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1]; y = [-0.447 1.978 3.28 6.16 7.08 7.34 7.66 9.56 9.48 9.30 11.2];
2阶多项式拟合:
n = 2; % 多项式阶次 p = polyfit(x, y, n)
输出结果:
p = -9.8108 20.1293 -0.0317
拟合曲线方程:
y = -9.8108x² + 20.1293x - 0.0317
绘制拟合曲线与数据点对比:
xi = linspace(0, 1, 100); % 绘图用的x轴数据 z = polyval(p, xi); % 计算多项式在xi点的值 plot(x, y, 'o', xi, z, ':') xlabel('x'), ylabel('y=f(x)') title('Second Order Curve Fitting')
结果如图11.1所示。
多项式阶次的选择
| 数据点数量 | 可确定的最高阶多项式 |
|---|---|
| 2点 | 1阶(直线) |
| 3点 | 2阶(平方) |
| n+1点 | n阶 |
注意:在本例中有11个数据点,理论上可选择高达10阶的多项式。
高阶多项式的问题
-
数值特性差
-
近似不够光滑(较高阶次多项式在变零前可多次求导)
-
产生纹波现象(尤其在数据区间两端)
示例:10阶多项式拟合
pp = polyfit(x, y, 10); format short e pp.' % 显示多项式系数(列向量)
系数输出:
ans =
-4.6436e+005
2.2965e+006
-4.8773e+006
5.8233e+006
-4.2948e+006
2.0211e+006
-6.0322e+005
1.0896e+005
-1.0626e+004
4.3599e+002
-4.4700e-001
最小系数(-4.4700e-001)与最大系数(5.8233e+006)之间相差7个数量级
绘制对比图:
zz = polyval(pp, xi); % 计算10阶多项式值 plot(x, y, 'o', xi, z, ':', xi, zz) xlabel('x'), ylabel('y=f(x)') title('2nd and 10th Order Curve Fitting')
结果如图11.2所示:
-
原始数据:标以
o -
2阶曲线拟合:虚线
-
10阶拟合:实线
结论:在10阶拟合中,左右两端极值处出现大的纹波。这表明:"越多就越好"的观念在这里不适用。
关键函数总结
| 函数 | 用途 |
|---|---|
polyfit(x, y, n) |
求解最小二乘曲线拟合,返回多项式系数 |
polyval(p, xi) |
计算多项式在指定点的值 |
linspace(a, b, n) |
生成从a到b的n个等间隔点 |