当前位置: 主页 > 生物技术 > 软件工具与数据库 > 编程与数值计算

MATLAB 曲线拟合与插值

2026-04-05 11:45 bioguider Internet 阅读 0

基本概念

在大量的应用领域中,人们经常面临用一个解析函数描述数据(通常是测量值)的任务。对这个问题有两种方法:

 
 
方法 特点
插值法 数据假定是正确的,要求以某种方法描述数据点之间所发生的情况
曲线拟合(回归) 设法找出某条光滑曲线,最佳地拟合数据,但不必要经过任何数据点

图示说明

图11.1 展示了这两种方法的区别:

  • 标有 o 的是数据点

  • 实线:连接数据点,描绘了线性内插

  • 虚线:数据的最佳拟合曲线


曲线拟合的核心问题

  1. 最佳拟合意味着什么?

  2. 应该用什么样的曲线?

最小二乘曲线拟合

最佳拟合被解释为数据点的误差平方和最小,且所用的曲线限定为多项式时,曲线拟合是相当简捷的。数学上称为多项式的最小二乘曲线拟合

误差:虚线和数据点之间的垂直距离
误差平方和:对各数据点距离求平方,再全部加起来
最小二乘:使误差平方和最小的省略说法


MATLAB中的曲线拟合函数

polyfit 函数

MATLAB中,函数 polyfit 求解最小二乘曲线拟合问题。

示例:2阶曲线拟合

原始数据:

matlab
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阶多项式拟合:

matlab
n = 2;                    % 多项式阶次
p = polyfit(x, y, n)

输出结果:

text
p = -9.8108   20.1293   -0.0317

拟合曲线方程:y = -9.8108x² + 20.1293x - 0.0317

绘制拟合曲线与数据点对比:

matlab
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阶的多项式。

高阶多项式的问题

  1. 数值特性差

  2. 近似不够光滑(较高阶次多项式在变零前可多次求导)

  3. 产生纹波现象(尤其在数据区间两端)

示例:10阶多项式拟合

matlab
pp = polyfit(x, y, 10);
format short e
pp.'      % 显示多项式系数(列向量)

系数输出:

text
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个数量级

绘制对比图:

matlab
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个等间隔点
 
 

    发表评论