2024美赛数学建模常用数学建模模型之——插值法

插值:求过已知有限个数据点的近似函数。
拟合:已知有限个数据点,求近似函数,不要求过已知数据点,只要求在某种意义 下它在这些点上的总偏差最小。
插值和拟合都是要根据一组数据构造一个函数作为近似,由于近似的要求不同,二者的数学方法上是完全不同的。而面对一个实际问题,究竟应该用插值还是拟合,有时容易确定,有时则并不明显。

1 插值方法

下面介绍几种基本的、常用的插值:拉格朗日多项式插值、牛顿插值、分段线性插值、Hermite 插值和三次样条插值。

1.1 拉格朗日多项式插值

1.1.1 插值多项式
用多项式作为研究插值的工具,称为代数插值。其基本问题是:已知函数 f ( x ) 在 区间[ a , b ] n + 1 个不同点 x 0 , x 1 , L , x n 处的函数值 y i = f ( x i ) ( i = 0,1, L , n ) ,求一个 至多n 次多项式
1.1.2 拉格朗日插值多项式
实际上比较方便的作法不是解方程( 3 )求待定系数,而是先构造一组基函数
1.1.3 Matlab Lagrange 插值
Matlab 中没有现成的 Lagrange 插值函数,必须编写一个 M 文件实现 Lagrange 插值。
n 个节点数据以数组 x 0, y 0 输入(注意 Matlat 的数组下标从 1 开始), m 个插值
点以数组 x 输入,输出数组 y m 个插值。编写一个名为 lagrange.m M 文件
function y=lagrange(x0,y0,x); 
n=length(x0);m=length(x); 
for i=1:m 
 z=x(i); 
 s=0.0; 
 for k=1:n 
 p=1.0; 
 for j=1:n 
 if j~=k 
 p=p*(z-x0(j))/(x0(k)-x0(j)); 
 end 
 end 
 s=p*y0(k)+s; 
 end 
 y(i)=s; 
end

1.2 牛顿(Newton)插值

在导出 Newton 公式前,先介绍公式表示中所需要用到的差商、差分的概念及性质。
1.2.1 差商

1.2.2 Newton 插值公式

1.2.3 差分
当节点等距时,即相邻两个节点之差(称为步长)为常数,Newton 插值公式的形式会更简单。此时关于节点间函数的平均变化率(差商)可用函数值之差(差分)来表示。
1.2.4 等距节点插值公式

1.3 分段线性插值

1.3.1 插值多项式的振荡

1.3.2 分段线性插值

1.3.3 Matlab 实现分段线性插值

1.4 埃尔米特(Hermite)插值

1.4.1 Hermite 插值多项式
如果对插值函数,不仅要求它在节点处与函数同值,而且要求它与函数有相同的一 阶、二阶甚至更高阶的导数值,这就是 Hermite 插值问题。本节主要讨论在节点处插值函数与函数的值及一阶导数值均相等的 Hermite 插值。
1.4.2 Matlab 实现 Hermite 插值
Matlab 中没有现成的 Hermite 插值函数,必须编写一个 M 文件实现插值。
n 个节点的数据以数组 x 0 (已知点的横坐标), y 0 (函数值), y 1 (导数值)
输入(注意 Matlat 的数组下标从 1 开始), m 个插值点以数组 x 输入,输出数组 y m
个插值。编写一个名为 hermite.m M 文件:
function y=hermite(x0,y0,y1,x); 
n=length(x0);m=length(x); 
for k=1:m 
 yy=0.0; 
 for i=1:n 
 h=1.0; 
 a=0.0; 
 for j=1:n 
 if j~=i 
 h=h*((x(k)-x0(j))/(x0(i)-x0(j)))^2; 
 a=1/(x0(i)-x0(j))+a; 
 end 
 end 
 yy=yy+h*((x0(i)-x(k))*(2*a*y0(i)-y1(i))+y0(i)); 
 end 
 y(k)=yy; 
end

1.5 样条插值

许多工程技术中提出的计算问题对插值函数的光滑性有较高要求,如飞机的机翼外 形,内燃机的进、排气门的凸轮曲线,都要求曲线具有较高的光滑程度,不仅要连续, 而且要有连续的曲率,这就导致了样条插值的产生。
1.5.1 样条函数的概念
所谓样条( Spline )本来是工程设计中使用的一种绘图工具,它是富有弹性的细木条或细金属条。绘图员利用它把一些已知点连接成一条光滑曲线(称为样条曲线),并使连接点处有连续的曲率。
数学上将具有一定光滑性的分段多项式称为样条函数。具体地说,给定区间 [ a , b ] 的一个分划
1.5.2 二次样条函数插值
1.5.3 三次样条函数插值

1.5.4 三次样条插值在 Matlab 中的实现
Matlab 中数据点称之为断点。如果三次样条插值没有边界条件,最常用的方法,
就是采用非扭结( not-a-knot )条件。这个条件强迫第 1 个和第 2 个三次多项式的三阶
导数相等。对最后一个和倒数第 2 个三次多项式也做同样地处理。
Matlab 中三次样条插值也有现成的函数:
y=interp1(x0,y0,x,'spline');
y=spline(x0,y0,x);
pp=csape(x0,y0,conds),y=ppval(pp,x)。
其中 x0,y0 是已知数据点, x 是插值点, y 是插值点的函数值。
对于三次样条插值,我们提倡使用函数 csape csape 的返回值是 pp 形式,要求插
值点的函数值,必须调用函数 ppval
1 机床加工
待加工零件的外形根据工艺要求由一组数据 ( x , y ) 给出(在平面情况下),用程控
铣床加工时每一刀只能沿 x 方向和 y 方向走非常小的一步,这就需要从已知数据得到加
工所要求的步长很小的 ( x , y ) 坐标。
1 中给出的 x , y 数据位于机翼断面的下轮廓线上,假设需要得到 x 坐标每改变
0.1 时的 y 坐标。试完成加工所需数据,画出曲线,并求出 x = 0 处的曲线斜率和
13 x 15 范围内 y 的最小值。
clc,clear 
x0=[0 3 5 7 9 11 12 13 14 15];
y0=[0 1.2 1.7 2.0 2.1 2.0 1.8 1.2 1.0 1.6]; 
x=0:0.1:15; 
y1=lagrange(x0,y0,x); %调用前面编写的Lagrange插值函数
y2=interp1(x0,y0,x); 
y3=interp1(x0,y0,x,'spline'); 
pp1=csape(x0,y0); y4=ppval(pp1,x); 
pp2=csape(x0,y0,'second'); y5=ppval(pp2,x); 
fprintf('比较一下不同插值方法和边界条件的结果:\n') 
fprintf('x y1 y2 y3 y4 y5\n') 
xianshi=[x',y1',y2',y3',y4',y5']; 
fprintf('%f\t%f\t%f\t%f\t%f\t%f\n',xianshi') 
subplot(2,2,1), plot(x0,y0,'+',x,y1), title('Lagrange') 
subplot(2,2,2), plot(x0,y0,'+',x,y2), title('Piecewise linear') 
subplot(2,2,3), plot(x0,y0,'+',x,y3), title('Spline1') 
subplot(2,2,4), plot(x0,y0,'+',x,y4), title('Spline2') 
dyx0=ppval(fnder(pp1),x0(1)) %求x=0处的导数
ytemp=y3(131:151); 
index=find(ytemp==min(ytemp)); 
xymin=[x(130+index),ytemp(index)]
可以看出,拉格朗日插值的结果根本不能应用,分段线性插值的光滑性较差(特别
是在 x = 14 附近弯曲处),建议选用三次样条插值的结果。

1.6 B 样条函数插值方法

1.6.1 磨光函数
实际中的许多问题,往往是既要求近似函数(曲线或曲面)有足够的光滑性,又要 求与实际函数有相同的凹凸性,一般插值函数和样条函数都不具有这种性质。如果对于 一个特殊函数进行磨光处理生成磨光函数(多项式),则用磨光函数构造出样条函数作 为插值函数,既有足够的光滑性,而且也具有较好的保凹凸性,因此磨光函数在一维插 值(曲线)和二维插值(曲面)问题中有着广泛的应用。 由积分理论可知,对于可积函数通过积分会提高函数的光滑度,因此,我们可以利 用积分方法对函数进行磨光处理。
1.6.2 等距 B 样条函数
对于任意的函数 f ( x ) ,定义其步长为 1 的中心差分算子 δ 如下:
1.6.3 一维等距 B 样条函数插值
等距 B 样条函数与通常的样条有如下的关系:
1.6.4 二维等距 B 样条函数插值

1.7 二维插值

前面讲述的都是一维插值,即节点为一维变量,插值函数是一元函数(曲线)。若
节点是二维的,插值函数就是二元函数,即曲面。如在某区域测量了若干点(节点)的
高程(节点值),为了画出较精确的等高线图,就要先插入更多的点(插值点),计算这
些点的高程(插值)。
1.7.1 插值节点为网格节点
解 编写程序如下:
clear,clc 
x=100:100:500; 
y=100:100:400; 
z=[636 697 624 478 450 
 698 712 630 478 420
 680 674 598 412 400 
 662 626 552 334 310]; 
pp=csape({x,y},z') 
xi=100:10:500;yi=100:10:400 
cz1=fnval(pp,{xi,yi}) 
cz2=interp2(x,y,z,xi,yi','spline') 
[i,j]=find(cz1==max(max(cz1))) 
x=xi(i),y=yi(j),zmax=cz1(i,j)

1.7.2 插值节点为散乱节点

x=[129 140 103.5 88 185.5 195 105 157.5 107.5 77 81 162 162 117.5]; 
y=[7.5 141.5 23 147 22.5 137.5 85.5 -6.5 -81 3 56.5 -66.5 84 -33.5]; 
z=-[4 8 6 8 6 8 8 9 9 8 8 9 4 9];
xi=75:1:200; 
yi=-50:1:150; 
zi=griddata(x,y,z,xi,yi','cubic') 
subplot(1,2,1), plot(x,y,'*') 
subplot(1,2,2), mesh(xi,yi,zi)

下一节将继续分享————曲线拟合最小二乘法。

  • 22
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值