数学建模第七天:数学建模算法篇之插值及MATLAB实现

目录

一、前言

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个点(x_{i},y_{i}),i=1,2,3……n,x_{i}互不相同。寻求函数f(x),使f(x)在某种准则下与所有数据点最为接近,即曲线拟合得很好。比如说我们高中学习过电阻与温度相关,我们测量某几个温度下的电阻,做出一条线,这就是我们拟合出来的函数图像:

        曲线拟合一般需要解决如下两个问题:

        ①线型的选择;

        ②线型中参数的计算

        其中,问题①是拟合问题的关键与难点,线性拟合中参数的计算可以使用最小二乘法,二非线性拟合参数的计算则要应用GN迭代法。

3、拟合与插值的关系

        相同点:给定一批数据点,需确定满足特定要求的曲线或曲面

        不同点:若要求所求曲线(面)通过所给所有数据点,就是插值问题;不要求曲线(面)通过所有数据点,而是要求它反映对象整体的变化趋势,这就是数据拟合,又称曲线拟合或曲面拟合。像上篇文章中出现过Runge现象,当不小于7次时,波动十分显著,所以我们需要用拟合的方法去构建相关的函数。小编借用龙门飞甲里的几句台词,来说明拟合的作用:

        “拟合算什么东西?”

        “你问我拟合算什么东西,现在我就来告诉你。插值算不了的值由我拟合来做,插值画不了的图我画,插值写不了的代码我写。一句话,拟合建不了的模我要建。拟合建不了的模我更要建!这就是西厂!”

        函数插值与曲线拟合都是要根据一组数据构造一个函数作为近似,由于近似的要求不同,二者在数学方法上是完全不同的。

二、拟合

1、线性最小二乘法求解

①思路

第一步:先选定一组函数 r_{1}(x)r_{2}(x),……,r_{m}(x),  m<n, 令

f(x)=a_{1}r_{1}(x)+a_{2}r_{2}(x)+\cdot \cdot \cdot +a_{m}r_{m}(x)           ( 1 )

其中a_{1},a_{2}, …,a_{m} 为待定系数。

        第二步:  确定a_{1}a_{2}, …,a_{m} 的准则(最小二乘准则): 使n个点(x_{i},y_{i}) 与曲线 y=f(x) 的距离\delta _{i}的平方和最小

        问题归结为,求 a_{1}a_{2},……,a_{m},使J(a_{1},a_{2},\cdot \cdot \cdot ,a_{m})最小

②解法

        我们把方程个数大于未知量个数的方程组称为超定方程组

        我们可以把上述超定方程组简写为矩阵乘法形式:

        超定方程组一般是不存在解的矛盾方程组,所以我们定义如果有向量a使得式子(4)达到最小, 则称a为上述超定方程组的最小二乘解。

\sum_{i=1}^{n}(r_{i1}a_{1}+ r_{i2}a_{2}+\cdot \cdot \cdot r_{im}a_{m}-y_{i})^{2} \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, (4)

         这里补充一个定理:当R^{T}R可逆时,超定方程组(3)存在最小二乘解,且即为方程组

2、MATLAB对线性最小二乘拟合的实现

①函数说明

调用函数:

a=polyfit(x,y,m)

参数说明:

a:输出拟合多项式系数 a=[a1, …,am , am+1] (数组))

x、y:输入同长度的数组x,y,为已知的点坐标

m:拟合多项式次数

作用:对多项式f(x)=a_{1}x^{m}+a_{2}x^{m-1}+\cdot \cdot \cdot \cdot a_{m}x+a_{m+1}拟合

额外说明:

        对超定方程组,可以用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。

②代码求解

        加入我们知道汪老师最后一周的花销函数为F(x)=-acos(wx)+kx+b,请用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)
  

        就能算出各个参数的值!结果与非线性曲线拟合的结果一致,这里就不放相应的结果啦!

        好的,本期的数学建模的课程就到这里啦,不知道小编的文章对各位观众老爷们有没有帮助呢?麻烦大家给小编点一个免费的小心心好吗?

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

计算机鬼才~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值