目录
一、前言
1、引例
2、拟合定义
3、拟合与插值的关系
二、拟合
1、线性最小二乘法求解
①思路
②解法
2、MATLAB对线性最小二乘拟合的实现
①函数说明
②求解例题
3、MATLAB实现非线性曲线拟合
①lsqcurvefit函数
②代码求解
4、MATLAB实现非线性最小二乘拟合
①lsqnonlin函数
②代码求解
一、前言
1、引例
话不多说,我们还是老规矩,上例题!
伍老师当了这么多篇文章的主角,今天的主角终于成为了伍老师的闺蜜汪老师。汪老师的零花钱一般在月初发,但是,汪老师一不小心多网购了一点,四月的最后一周只剩下了300块钱。已知这一周的前四天开销如下:
4月24号:踌躇满志的想要去省钱,当天花销共计35块
4月25号:感觉最后一周的第一天太克制自己了,多花一点,当天花销共计45块
4月26号:陪男朋友出去玩,多点了一杯奶茶,当天花销共计48块、
4月27号:突然发现前两天花的钱有点多了,克制一下,当天花销共计38块
那么,请你预测一下汪老师的花销函数,并且估计,300块汪老师能否撑过这一周?
2、拟合定义
曲线拟合问题是指:已知平面上n个点,i=1,2,3……n,互不相同。寻求函数f(x),使f(x)在某种准则下与所有数据点最为接近,即曲线拟合得很好。比如说我们高中学习过电阻与温度相关,我们测量某几个温度下的电阻,做出一条线,这就是我们拟合出来的函数图像:
曲线拟合一般需要解决如下两个问题:
①线型的选择;
②线型中参数的计算
其中,问题①是拟合问题的关键与难点,线性拟合中参数的计算可以使用最小二乘法,二非线性拟合参数的计算则要应用GN迭代法。
3、拟合与插值的关系
相同点:给定一批数据点,需确定满足特定要求的曲线或曲面
不同点:若要求所求曲线(面)通过所给所有数据点,就是插值问题;不要求曲线(面)通过所有数据点,而是要求它反映对象整体的变化趋势,这就是数据拟合,又称曲线拟合或曲面拟合。像上篇文章中出现过Runge现象,当不小于7次时,波动十分显著,所以我们需要用拟合的方法去构建相关的函数。小编借用龙门飞甲里的几句台词,来说明拟合的作用:
“拟合算什么东西?”
“你问我拟合算什么东西,现在我就来告诉你。插值算不了的值由我拟合来做,插值画不了的图我画,插值写不了的代码我写。一句话,拟合建不了的模我要建。拟合建不了的模我更要建!这就是西厂!”
函数插值与曲线拟合都是要根据一组数据构造一个函数作为近似,由于近似的要求不同,二者在数学方法上是完全不同的。
二、拟合
1、线性最小二乘法求解
①思路
第一步:先选定一组函数 ,,……,, m<n, 令
( 1 )
其中,, …, 为待定系数。
第二步: 确定,, …, 的准则(最小二乘准则): 使n个点 与曲线 y=f(x) 的距离的平方和最小
问题归结为,求 ,,……,,使最小
②解法
我们把方程个数大于未知量个数的方程组称为超定方程组:
我们可以把上述超定方程组简写为矩阵乘法形式:
超定方程组一般是不存在解的矛盾方程组,所以我们定义如果有向量a使得式子(4)达到最小, 则称a为上述超定方程组的最小二乘解。
这里补充一个定理:当可逆时,超定方程组(3)存在最小二乘解,且即为方程组
2、MATLAB对线性最小二乘拟合的实现
①函数说明
调用函数:
a=polyfit(x,y,m)
参数说明:
a:输出拟合多项式系数 a=[a1, …,am , am+1] (数组))
x、y:输入同长度的数组x,y,为已知的点坐标
m:拟合多项式次数
作用:对多项式拟合
额外说明:
对超定方程组,可以用a=R\y得到最小二乘意义下的解。
多项式在x处的值y可用y=polyval(a,x)命令计算。
②求解例题
如果使用一次函数拟合,则代码为:
x=[1,2,3,4];
y=[35,45,48,38];
A=polyfit(x,y,1)
x1=1:1:7
z=polyval(A,x1)
plot(x,y,'o',x1,z,'r')
求出的结果为:
所以预计最后三天汪老师会花费44.5+45.7+46.9=137.1元,算上前面四天的消费,一共303.1元,故汪老师三百块撑不过这一周,需要找伍老师接三块一毛钱。
3、MATLAB实现非线性曲线拟合
①lsqcurvefit函数
已知输入数据点和输出数据点,即x=(xdata1,xdata2,……,xdatan),y=(ydata1,ydata2,……ydatan),并且还知道输入数据点与输出数据点的关系为ydata=F(x,xdata),MATLAB里有lsqcurvefit函数能够对曲线进行拟合,求得x使得下式成立:
函数输出格式:
x = lsqcurvefit (‘fun’,x0,xdata,ydata);
x =lsqcurvefit(‘fun’,x0,xdata,ydata,options);
x=lsqcurvefit(‘fun’,x0,xdata,ydata,options,’grad’);
参数说明:
其中x0代表初始解向量,option代表优化方式,xdata与ydata满足ydata=F(x,xdata),fun代表一个事先建立的定义函数F(x,xdata) 的m文件, 自变量为x和xdata。
②代码求解
加入我们知道汪老师最后一周的花销函数为,请用lsqcurvefit函数拟合,并且求出参数a、w、k、b。
我们先定义一个花销函数expense.m,内容如下:
function F=expense(x,xdata);
F=-x(1)*cos(x(2)*xdata)+x(3)*xdata+x(4)
% x(1)=a; x(2)=w,x(3)=k,x(4)=b;
再输入相关命令:
xdata=[1,2,3,4];
ydata=[35,45,48,38];
x0=[0.1,0.1,0.1,0.1];
x=lsqcurvefit('expense',x0,xdata,ydata)
xnew=1:1:7;
F=expense(x,xnew)
我们就能算出,a、w、k、b四个参数的值以及汪老师这一周每天的花费,如下:
再计算一下这一周的后三天汪老师会花费48.07+48.43+46.6=143.1,而按照这个模型这一周共计花费309.1元,看来300是不够的,还需要多找伍老师借9.1块钱。
4、MATLAB实现非线性最小二乘拟合
①lsqnonlin函数
已知输入数据点和输出数据点,即x=(xdata1,xdata2,……,xdatan),y=(ydata1,ydata2,……ydatan),用以求含参量x的向量值函数f(x),使得下式的值最小:
其中fi(x)=f(x,xdatai,ydatai)=F(x,xdatai)-ydatai。
函数格式:
x=lsqnonlin(‘fun’,x0)
x=lsqnonlin(‘fun’,x0,options)
x= lsqnonlin('fun’,x0,options‘grad’)
参数说明:
其中x0代表初始解向量,option代表优化方式,fun代表一个事先建立的定义函数F(x) 的m文件, 自变量为x。
②代码求解
仍然以刚刚那道题为例,我们先定义一个花销函数expense.m,内容如下:
function F=expense(x);
xdata=[1,2,3,4];
ydata=[35,45,48,38];
F=-x(1)*cos(x(2)*xdata)+x(3)*xdata+x(4)
% x(1)=a; x(2)=w,x(3)=k,x(4)=b;
再输入代码:
x0=[0.1,0.1,0.1,0.1];
x=lsqnonlin('expense',x0)
xnew=1:1:7;
F=expense(x)
就能算出各个参数的值!结果与非线性曲线拟合的结果一致,这里就不放相应的结果啦!
好的,本期的数学建模的课程就到这里啦,不知道小编的文章对各位观众老爷们有没有帮助呢?麻烦大家给小编点一个免费的小心心好吗?