插值拟合和数据拟合都是数据分析和模型构建中常见的方法,其区别主要在于以下几点:
1. 对于给定的数据点,插值拟合通过构造插值函数来精确地穿过每个数据点,从而得到一条平滑的曲线,其拟合误差为零。而数据拟合则是通过构建一个函数模型来近似拟合数据点,这个模型在数据点处的拟合误差不一定为零。
2. 插值拟合对数据点的位置十分敏感,如果数据点在插值区间内存在偏差或噪声,插值曲线会受到很大影响。而数据拟合则通过拟合模型来平滑噪声或异常值的影响,具有一定的鲁棒性。
3. 插值拟合所得到的函数只能在已知数据点处进行插值计算,而无法在插值区间外进行外推。而数据拟合则可以通过模型预测未知区间内的数据。
因此,插值拟合和数据拟合各有优缺点,根据具体情况选择合适的方法进行数据分析和模型构建。
线性最小二乘拟合
工具箱操作
某观测站测得某日6:00~18:00之间每隔2小时的室内温度如下表所示,用样条值分别求得该室内6:30~17:30之间每隔2小时各点的近似温度值。
时间h | 6:00 | 8:00 | 10:00 | 12:00 | 14:00 | 16:00 | 18:00 |
室内温度c | 18.0 | 20.2 | 22.0 | 25.1 | 30.2 | 29.5 | 21.5 |
h=6:2:18;
c=[18.0 20.2 22.0 25.1 30.2 29.5 21.5];
plot(h,c,'ro--')
grid on
运行以上代码可得以下图形,咱们接下来用工具做最小二乘法的拟合。
点击工具点击最下方的基本拟合勾选三次方
拟合完成
函数法
h=6:2:18;
c=[18.0 20.2 22.0 25.1 30.2 29.5 21.5];
a=polyfit(h,c,3)
可以看出和上面的多项式系数a1,a2,a3,a4 是一样的。
系数出来了,接下来我们可以拟合作图看看效果
h=6:2:18;
c=[18.0 20.2 22.0 25.1 30.2 29.5 21.5];
a=polyfit(h,c,3)
y1=a(1)*h.^3+a(2)*h.^2+a(3)*h+a(4)*1
plot(h,c,'ro--',h,y1)
legend('原数据','拟合数据')
也可以用ployval来做计算拟合多项式的函数值,即上面的y1,一样的效果
h=6:2:18;
c=[18.0 20.2 22.0 25.1 30.2 29.5 21.5];
a=polyfit(h,c,3)
y1=polyval(a,h)
plot(h,c,'ro--',h,y1)
legend('原数据','拟合数据')
非线性最小二乘拟合
lsqcurvefit
[x,resnorm]= lsqcurvefit(fun,x0,xdata,ydata)
fun为需要拟合的函数(需要编写m文件,也可以不编写m文件用内置函数inline)
x0为对函数中各个参数的初始值
xdata为已知x轴的数据
ydata为已知y轴的数据
x为各个参数的最优解
resnorm为误差的平方和
已知实测一组数据
x | 0.1 | 0.2 | 0.3 | 0.4 | 0.5 | 0.6 | 0.7 | 0.8 | 0.9 | 1 |
y | 2.32 | 2.64 | 2.97 | 3.28 | 3.60 | 3.91 | 4.21 | 4.52 | 4.82 | 5.12 |
该数据可能满足的原型函数为,试着求满足该数据的最小二乘法
解a,b,c,d的值。
inline法
x=0.1:0.1:1;
y=[2.32 2.64 2.97 3.28 3.60 3.91 4.21 4.52 4.82 5.12];
f1=inline('a(1)*x+a(2)*x.^2.*exp(-a(3)*x)+a(4)','a','x');
[aa,res]=lsqcurvefit(f1,[1 1 1 1],x,y)
disp(['a=',num2str(aa(1)),' b=',num2str(aa(2)),' c=',num2str(aa(3)),' d=',num2str(aa(4))])
m文件法
编写脚本c.m
function f=c(a,x)
f=a(1)*x+a(2)*x.^2.*exp(-a(3)*x)+a(4);%计算新的y值。
命令行窗口
clc
clear
x=0.1:0.1:1;
y=[2.32 2.64 2.97 3.28 3.60 3.91 4.21 4.52 4.82 5.12];
a=lsqcurvefit('c',[1 1 1 1],x,y);
disp(['a=',num2str(a(1)),' b=',num2str(a(2)),' c=',num2str(a(3)),' d=',num2str(a(4))])
c(a,x)
lsqnonlin
用下面一组数据拟合中的参数b,c.并作图。
x | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
y | 6.42 | 8.20 | 9.58 | 9.70 | 9.50 | 10.00 | 9.93 | 9.99 | 10.49 | 10.59 | 10.60 | 10.80 | 10.60 | 10.90 | 10.76 |
建立脚本文件
function f=c(a)
x=1:15;
y=[6.42 8.20 9.58 9.70 9.50 10.00 9.93 9.99 10.49 10.59 10.60 10.80 10.60 10.90 10.76];
f=x./(a(1)*x+a(2))-y;%计算新的y值。
命令行窗口
a=lsqnonlin('c',[1 1])
y=[6.42 8.20 9.58 9.70 9.50 10.00 9.93 9.99 10.49 10.59 10.60 10.80 10.60 10.90 10.76];
x=1:15;
h=c(a)+y;
plot(1:15,h,1:15,y,'ro')
legend('拟合','原数据')
即b=0.0887 c=0.0646