实验2.2 插值与拟合
1. 实验目的
理解插值与拟合各自的基本定义,算法原理。实现算法在实际中的具体应用。掌握相关的MATLAB函数用法
2. 算法原理
2.1 插值方法原理
在一些实际应用中,会得到一些数据,通常将这些数据列成数据表格的形式。
这种用数据表格形式给出的函数称为列表函数,即yi?f(xi),i?0,1,?,n,其中点x0,x1,?xn成为结点。根据函数f(x)已有的数据表格来计算函数f(x)在一些新的点x处的函数值,这就是插值所要解决的问题。
一种最简单的插值方法就是拉格朗日插值,利用拉格朗日多项式即可计算相
应区间任意点的插值结果。候拉格朗日插值多项式也被称为拉格朗日公式,如下:
Ln(x)??f(xi)?i?0j?in(x?xj)
(x?x)j?0ijn 拉格朗日公式常用于以下两种简单的情形。
(1)线性插值
设函数y?f(x)在x0,x1处的函数值分别为y0,y1,则线性插值公式为
L1(x)?y0x?x0x?x1?y1 x0?x1x1?x0利用线性插值公式就可以计算在x0,x1之间任意一个新点x处的f(x)近似值。
(2)二次(抛物线)插值
设函数y?f(x)在x0,x1,x2处的函数值分别为y0,y1,y2,则二次插值公式为
L2(x)?y0(x?x0)(x?x2)(x?x0)(x?x1)(x?x1)(x?x2)?y1?y2
(x0?x1)(x0?x2)(x1?x0)(x1?x2)(x2?x0)(x2?x1)18
如果这三点不在一条直线上,则上述插值公式得到的是一个二次函数,通过这三点的曲线是抛物线。
利用三点的二次插值公式就可以计算在x0,x1,x2所在区间的任意一个新点x处的f(x)近似值。 2.2 拟合方法原理
给定平面上的一组数据(x0,y0),(x1,y1),?(xn,yn),要求确定一个初等函数
y??(x),使给定的数据点(在某种距离下)与函数y??(x)表示的曲线整体上
最为接近,这类问题称为数据拟合。
设有经验公式y?f(x,c)(这里x和c均可为向量),要求根据数据(xi,yi),
i?0,1,?,n,确定参数c,这样的问题称为曲线拟合,其基本原理是最小二乘法,
即求使误差平方和Q(c)?2达到最小的c。 f(x,c)?y???iii?0nMATLAB中有关拟合的命令如下:
p=polyfit(x,y,k) 用k次多项式拟合向量数据(x,y),返回多项式的降幂系数向量。 yi=polyval(p,xi) 根据多项式p计算出在xi处插值函数值yi.
c=lsqnonlin(fun,c0) 使用迭代法搜索最优参数c,其中fun是以参数c(可以是向量)为自变量的表示误差f(x,c)?y (x,y是数据向量)的函数,c0是c的近似值,作为迭代初始值。
c=lsqcurvefit(fun,c0,x,y) 根据数据向量x,y 确定经验公式y?f(x,c)(c可以是向量)中的参数c。这里fun为函数f(x,c),c0是c的初始值。与lsqnonlin不同,使用lsqcurvefit时数据x,y从外部输入。
3. 实例分析
3.1 以下是美国人口两个世纪以来的统计数据,试以此预测2010年,2020年的美国人口。
19
年份 人口/百万 年份 人口/百万 年份 人口/百万
1800 5.3 1890 62.9 1980 1810 7.2 1900 76.0 1990 1820 9.6 1910 92.0 2000 1830 12.9 1920 1840 17.1 1930 1850 23.2 1940 1860 31.4 1950 1870 38.6 1960 1880 50.2 1970 106.5 123.2 131.7 150.7 179.3 204.0 226.5 251.4 275.0 解:先做散点图,为了方便,也为了避免数据相差太大造成误差,年份均减去1800.
t=0:10:200;
y=[5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76.0 92.0... 106.5 123.2 131.7 150.7 179.3 204.0 226.5 251.4 275.0]; subplot(2,2,1);
plot(t,y,'bo');axis([0,300,0,400]); text(20,350,'Population');
从数值上看给定数据接近抛物线或者指数曲线。
图1 美国人口散点图及预测结果图
20
(1)考虑用二次多项式拟合,代码如下:
p=polyfit(t,y,2)
Q1=sqrt(sum((y-polyval(p,t)).^2)) ti=0:2:220; yi=polyval(p,ti);
yj=polyval(p,[210,220]) subplot(2,2,2)
plot(t,y,'bo',ti,yi,'r',[210,220],yj,'ro') text(20,350,'Bipoly');
结果:拟合曲线见图1右上角,均方误差=12.5425,预测人口=303.0567
331.8160.
(2)采用马尔萨斯模型,人口按指数增长,因此可设人口曲线为f(t,r)?N0ert,其中N0, r是待拟合的参数,相关代码如下:
fun1=@(c,t) c(1)*exp(c(2)*t); c= lsqcurvefit(fun1,[6,0.1],t,y)
Q2=sqrt(sum((y-c(1)*exp(c(2)*t)).^2)) ti=0:2:220;
yi=c(1)*exp(c(2)*ti);
yj=c(1)*exp(c(2)*[210,220]) subplot(2,2,3);
plot(t,y,'bo',ti,yi,'r',[210,220],yj,'ro') text(20,350,'Exp curve');
结果:拟合曲线见图1左下角,均方误差=48.5696,预测人口=338.3433
389.2984.
(3)采用Logistic模型,人口增长规律为
N1?(m?1)e?rtN0N0,
其中Nm,N0,r是待拟合的参数,相关代码如下:
fun2=@(c,t) c(1)./(1+(c(1)/c(2)-1)*exp(-c(3)*t)); c=lsqcurvefit(fun2,[500,6,0.2],t,y)
Q3=sqrt(sum((y-c(1)./(1+(c(1)/c(2)-1)*exp(-c(3)*t))).^2)) ti=0:2:220; yi=c(1)./(1+(c(1)/c(2)-1)*exp(-c(3)*ti)); yj=c(1)./(1+(c(1)/c(2)-1)*exp(-c(3)*[210,220])) subplot(2,2,4)
plot(t,y,'bo',ti,yi,'r',[210,220],yj,'ro') text(20,350,'Logistic');
结果:拟合曲线见图1右下角,均方误差=19.8133,预测人口=292.9388
311.8921
21
相关推荐: