第一次写博客,是关于使用matlab插值与拟合的笔记,借鉴了网上的一些例题,以下是我关于学习插值与拟合的一些总结。
如有不足,请多包涵,也可评论给我一些建议,谢谢!
1.插值与拟合:如果要求近似函数经过所已知的所有数据点,此时称为插值问题;如果不要求近似函数经过所有数据点,而是要求它能较好地反映数据变化规律,称为数据拟合。
2.共同点:插值与拟合都是根据实际中一组已知数据来构造一个能够反映数据变化规律的近似函数。
3.区别:插值不一定得到近似函数的表达形式,仅通过插值方法找到未知点对应 的值。拟合要求得到一个具体的近似函数的表达式。(插值一定要过已知点,拟合不用)
因此,当数据量不够,但已知已有数据可信,需要补充数据,此时用插值。当数据基本够用,需要寻找因果变量之间的数量关系(推断出表达式),进而对未知的情形作预测,此时用拟合。
4.插值函数的类型:
(1)拉格朗日插值(缺点:当n很大时,可能出现龙格现象)
(2)分段插值(缺点:不连续)
(3)三次样条插值
(好像还有Hermite插值,这里不介绍了)
语法:yi = interp1(x0, y0, xi, method) (一维插值)
yi = interp2() (二维插值)
yi = interp3() (三维插值)
说明:
(1)x0, y0为插值节点,xi为被插值的点,method为插值方法;
(2)x0必须是单调的,xi不超过x0的范围;
(3)插值方法有:nearest-最近邻点插值;linear-线性插值;spline-三次样条插值;cubic-立方(三次)插值(method缺省时默认为分段线性插值)
例题1:在12个小时内,东海某一特殊区域每相隔一小时水温大致分布如下:5,7,9,16,24,28,31,29,22,25,27,24.现在利用此数据分析东海该区域在第3.5小时,6.3小时,7.2小时的水温
matlab代码:
hours = 1:12;
temps = [5,7,9,16,24,28,31,29,22,25,27,24];
t = interp1(hours,temps,[3.5,6.3,7.2],'linear')
运行结果:
>> test1
t =
12.5000 28.9000 30.6000
例题2:一直某产品从1900年到2010年每隔10 年的产量为:75.995, 91.972, 105.711, 123.203, 131.699, 150.697, 179.323, 203.212, 226.505, 249.633, 256.344, 267.893;计算出1995年的产量,用三次样条插值的方法,画出每隔一年的插值曲线图形。
matlab代码:
years = 1900:10:2010;
production = [75.995,91.972,105.711,123.203,131.699,150.697,179.323,203.212,226.505,249.633,256.344,267.893];
p1995 = interp1(years,production,1995,'pchip')
%由于版本问题,这里的三次样条命令为'phip'
plot(years,production,'-*');
运行结果:
>> test2
p1995 = 253.2278
语法:zi = interp2(x0, y0, z0, xi, yi, method)
(与interp1相比,interp2的差值数据必须是矩形域,表格查找)
说明:
(1)x0, y0, z0为插值节点,xi, yi为被插值的点;
(2)要求x0, y0是单调的,xi, yi不超过x0, y0的范围(要求xi取为行向量,yi取列向量);
(3)插值方法有:nearest-最近邻点插值;linear-双线性插值;spline-双三次样条插值,cubic-三次函数插值;(method缺省时默认为双线性插值)
(4)二维插值函数还有:z = griddata(x0, y0, z0, x, y, method)
(其已知数据点不要求规则排列,数据格点)
(5)插值方法有:nearest-最近邻点插值;linear-双线性插值;cubic-双三次插值(默认为双线性插值)
例题: 测得平板表面3x5网格点处的温度分别为:
82 81 80 82 84
79 63 61 65 81
84 84 82 85 86
1.试作出平板表面的温度分布曲面z = f(x,y)的图形
matlab代码:
x = 1:5;
y = 1:3;
temps=[82,81,80,82,84;79,63,61,65,81;84,84,82,85,86];
mesh(x,y,temps)
运行效果:
2.以平滑数据,在x,y方向上每个0.2个单位的地方进行插值
matlab程序:
x = 1:5;
y = 1:3;
temps = [82,81,80,82,84;79,63,61,65,81;84,84,82,85,86];
xi = 1:0.2:5;
yi = 1:0.2:3;
zi = interp2(x,y,temps,xi',yi,'cubic');
mesh(xi,yi,zi)
拟合常用方法为最小二乘法
其原理为:已知离散点上的数据集 ,即已知在点集上的函数值,构造一个解析函数(其图形为一曲线)使 在原离散点上尽可能接近给定的值,这一过程称为曲线拟合。
MATLAB实现:
1.多项式拟合 :
(1)对于给定的数据(xi,yi),i = 0,1,……,n;
(2)选取适当阶数的多项式,如二次多项式g(x)=ax^2+bx+c;
(3)使g(x)尽可能逼近(拟合)这些数据,但是不要求经过给定的数据(xj,yj);
多项式f(x)=a1xm+a2xm-1 …+amx+am+1 拟合语法:
p = polyfit(x,y,n); [p, s] = polyval(p,x)
说明:x,y为数据点,n为多项式阶数,返回p为幂次从高到低的多项式系数向量p。x必须是单调的。矩阵s用于生成预测值的误差估计。
polyval()为多项式曲线求值函数:
y = polyval(p,x)为返回对应自变量x在给定系数P的多项式的值
例题:求如下给定数据的拟合曲线,x=[0.5,1.0,1.5,2.0,2.5,3.0],
y=[1.75,2.45,3.81,4.80,7.00,8.60]
matlab代码:
x = [0.5,1.0,1.5,2.0,2.5,3.0];
y = [1.75,2.45,3.81,4.80,7.00,8.60];
p = polyfit(x,y,2)
x1 = 0.5:0.05:3.0;
y1 = polyval(p,x1);
plot(x,y,'-*r',x1,y1,'-b')
运行结果:
>> test3
p =
0.5614 0.8287 1.1560
所以此拟合函数为:y = 0.5614x2+0.8287x+1.1560
拟合效果如下图:
已知数据点xdata = ( xdata1, xdata2, , ,xdatan), ydata = ( ydata1, ydata2, ydata3, , , ydatan)
matlab中提供函数lsqcurvefit用以求含参量x(向量)的向量值函数F(x, xdata) =( F(x, xdata1),…,F(x,xdatan))T 参变量x(向量),使得 最小
matlab语法:
x = lsqcurvefit(‘fun’,x0,xdata,ydata,options); (其中的fun函数是关于x,xdata的函数)
x = lsqcurvefit(‘fun’,x0,xdata,ydata,options,’grad’);
x = lsqnonlin(‘fun’,x0,options); (其中的fun函数是只关于x的函数)
这道例题里面那个03实在不懂为什么。。。。
好啦,第一篇博客就暂时结束啦,谢谢你的阅读^_^!