
Matlab数据拟合:曲线拟合、线性/非线性拟合、贝塞尔曲线、B样条曲线及迭代法、梯
度法、牛顿插值、拉格朗日插值与三次样条等
某个深夜调试温度传感器时,我盯着采集到的13组离散数据点突然意识到——数据拟合本质上是在
混乱中创造秩序的行为。就像用乐高积木搭建曲线桥,不同的拼接手法会呈现出截然不同的建筑美学。今
天咱们来聊聊Matlab工具箱里的这些"积木块",看看它们如何把离散点变成优雅的曲线。
先来点基本功。线性拟合就像用直尺画线,polyfit函数是得力助手:
```matlab
x = 1:0.5:7;
y = 2.3*x + randn(size(x))*0.8; % 带噪声的线性数据
p = polyfit(x,y,1);
fit_line = polyval(p,x);
plot(x,y,'o',x,fit_line,'-r')
```
那个神秘数字'1'指定多项式阶数,改成2就变成抛物线拟合。但真实世界往往更复杂——某次处理卫
星轨道数据时,指数型衰减模型让我卡壳三天:
```matlab
modelfun = @(b,x) b(1)*exp(-b(2)*x) + b(3);
beta0 = [1, 0.1, 0.2]; % 初始猜想值
beta = lsqcurvefit(modelfun,beta0,x,y);
```
这里beta0的选择充满玄学,有次误把衰减系数初始值设为10,结果迭代直接飞向无穷大。后来发现
用半衰期倒推初始值更靠谱,这大概就是理论与实战的差距。
说到插值,拉格朗日像是用橡皮泥捏曲线,每个点都精确穿过:
```matlab
xi = linspace(min(x),max(x),100);
yi_lagrange = interp1(x,y,xi,'linear'); % 其实这是分段线性
yi_spline = interp1(x,y,xi,'spline');
```
但遇到陡峭变化时,高次多项式会像过山车般震荡。有次处理ECG信号时,三次样条插值成功避免了
这种"龙格现象",秘诀在于分段低次多项式+连续导数的约束。