最小二乘法曲线拟合的大作业
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
曲线拟合的MATLAB 实现
一、提出问题
在实际的工程应用领域和经济应用领域中,人们往往只能测得一些分散的数据点,为了从这些分散的数据点中找到其内在的规律性,就需要利用这些分散的数据点,运用最小二乘法、多项式或其他的已知函数等方法来生成一个新的多项式或是新的函数来逼近这些已知点。由于Matlab语言强大的计算功能和绘图功能,使得我们可以很方便的进行曲线拟合并绘制出曲线拟合图,从而很方便的找到分散数据的内在规律性。
本文介绍最小二乘曲线拟合法的基本原理,就其Matlab的实现方法进行研究,给出曲线拟合Matlab实现的源程序,对测试误差进行分析。本文试通过一个具体例子,介绍用Matlab软件进行曲线拟合的方法。
某类疾病发病率为 y‰和年龄段 x (每五年为一段,例如 0~5 岁为第一段,6~10 岁为第二段)之间有如下的关系,观测得到的数据表如下:
表 1 某类疾病发病率与年龄段的关系
二、分析问题
先根据上述资料,建立以 x 为横坐标, y 为纵坐标的坐标系,用Matlab 软件把各 x,y的值作为坐标点,画出这些点,得图1。
x=[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19];
y=[0.898 2.38 3.07 1.84 2.02 1.94 2.22 2.77 4.02 4.76 5.46 6.53 10.9 16.5 22.5 35.7 50.6 61.6 81.8];
plot(x,y,'*r')
图1 原始数据关系图
从图上可以看出,在全段19个点的始末两端各有一条渐近线,根据指数函数的性质,可知描写全段曲线的函数一定含有指数项。不妨先设指数曲线为:
bx
y ae
=(1)两边同时取对数对其进行线性化得到如下线性方程:1y Ax B
=+,其中
1ln
y y
=,A = b , B = ln a ,可根据已知的 x, y 用最小二乘法求得 A, B 。具体求法是,在Matlab下定义一个函数pline(x,y),其程序如下:Function yy=pline(x,y)
nx=length(x); ny=length(y);%分别求向量x,y的长度
n=min(nx,ny);%求出长度的最小值
x=reshape(x,n,1);%生成列向量
y=reshape(y,n,1);
M=[x ones(n,1)];%连接矩阵M
B=y;
N=M'*M;
B=M'*B;
yy=N\B;%得到拟合系数
yy=yy';%变成行向量
在Matlab命令窗口中输入命令:
x=[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19];
y=[0.898 2.38 3.07 1.84 2.02 1.94 2.22 2.77 4.02 4.76 5.46 6.53 10.9 16.5 22.5 35.7 50.6 61.6 81.8];
pline(x,log(y))
求得 A = 0.2306, B = −0.3837 ,从而可知 a = e = 0.6813 ,b = A = 0.2306 ,代入(1)得拟合函数
0.2306
(2)
0.6813x
y e
作出其函数图象如图2。
x=[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19];
y=[0.898 2.38 3.07 1.84 2.02 1.94 2.22 2.77 4.02 4.76 5.46 6.53 10.9
16.5 22.5 35.7 50.6 61.6 81.8];
y1=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];
for i=1:19
y1(i)=0.6813*exp(0.2306*x(i));
end
plot(x,y,'*r',x,y1)
图2 拟合函数图象与原始数据比较图
通过图象和原始数据进行比较,不难看出此曲线与实际数据有一定的差距,因而不能以此曲线作为 19 个点的数学模型,需进行曲线的分段拟合。
三、解决问题
3.1曲线的分段直线化
对图 1 进一步分析可以看出,前 11 个点有一条渐近线,后 8 个点有一条渐近线,可将要拟合的曲线分为两段,前 11 个点为前段,后 8 个点为后段。我们可以分别对前 11 个点和后 8 个点进行直线化。以 x 为横坐标, ln y 为纵坐标,在 Matlab 中作出这些点,得图 3:
x=[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19];
y=[0.898 2.38 3.07 1.84 2.02 1.94 2.22 2.77 4.02 4.76 5.46 6.53 10.9 16.5 22.5 35.7 50.6 61.6 81.8];
plot(x,log(y),'*r')
图3 取对数后的函数关系图象
从图3可以看出后8个点明显呈直线趋势,可以先对后8个点进行直线化。
3.11 后段曲线的直线化
拟合的方法和前面相同,设所求的曲线为:
bx y ae = (3)
进行线性化得 1y Ax B =+ ,其中1ln y y =, A = b , B = ln a ,在Matlab
命令窗口中
调输入:x = [12,13,14,15,16,17,18,19], y = [6.53,10.9,16.5, 22.5, 35.7,50.6, 61.6,81.8] ,
用函数pline(x ,log(y)),求得 A = 0.3593, B = −2.2928 ,a = e = 0.1010, b = A = 0.3593 , B