数值计算方法第4次作业

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第四章

问题一

一、问题综述

在离地球表面高度为y处的重力加速度如下:

计算高度y=55000m处的重力加速度值。

二、问题分析

以高度y作为自变量,重力加速度的值为因变量。得到以下信息:

f(0)=9.8100;

f(30000)=9.7487;

f(60000)=9.6879;

f(90000)=9.6278;

f(120000)=9.5682;

本题要求的就是f(55000)的值。

以下将采用课堂中学到的Lagrange插值多项式法、Newton插值多项式法、分段低次插值法和样条插值法求解该问题。

三、问题解决

1. lagrange插值多项式法

对某个多项式函数,已知有给定的k+ 1个取值点:

其中对应着自变量的位置,而对应着函数在这个位置的取值。

假设任意两个不同的x j都互不相同,那么应用拉格朗日插值公式所得到的拉格朗日插值多项式为:

其中每个为拉格朗日基本多项式(或称插值基函数),其表达式为:

拉格朗日基本多项式的特点是在上取值为1,在其它的点上取值为0。

源程序lagrange.m

function [c,f]=lagrange(x,y,a)

% 输入:x是自变量的矩阵;y是因变量的矩阵;a是要计算的值的自变量;

% 输出:c是插值多项式系数矩阵;f是所求自变量对应的因变量;

m=length(x);

l=zeros(m,m); % l是权矩阵

f=0;

for i=1:m

v=1;

for j=1:m

if i~=j

v=conv(v,poly(x(j)))/(x(i)-x(j)); % v是l_i(x)的系数矩阵

end

end

l(i,:)=v; % l矩阵的每一行都是x从高次到低次的系数矩阵

end

c=vpa(y*l,10); % 对应阶次的系数相加,乘以y,显示10位有效数字

for k=1:m

f=f+c(k)*a^(m-k);

end

输入矩阵

x=[0 30000 60000 90000 120000]

y=[9.81 9.7487 9.6879 9.6278 9.5682]

a=55000

再运行源函数,可得:

c =

[ -2.057613169e-23, 4.938271605e-18, -3.703703702e-14, -0.000002046111111, 9.81]

f =

9.6979851723251649906109417384537

即此时得到的插值函数为:

f(x)=−2.06×10−23x4+4.94×10−18x3−3.70×10−14x2−2.05×10−6x+9.81所以可以得到本题的结果为:

f(55000)=9.6980

2. Newton插值多项式法

Newton插值多项式法通过各阶差商来得到插值函数。牛顿基本插值多项式为:N n(x)=f(x0)+f[x0,x1](x−x0)+⋯+f[x0,…,x1](x−x0)…(x−x n−1)其中

零阶差商 f[x i]=f(x i)

一阶差商 f[x i,x j]=f(x i)−f(x j) x i−x j

二阶差商 f[x i,x j,x k]=f[x i,x j]−f[x j,x k]

x i−x k

……

k阶差商 f[x i,x i+1,…,x i+k]=f[x i+1,…,x i+k]−f[x i,…,x i+k−1]

x i+k−x i

源程序newton.m:

function [c,d,f]=newton(x,y,a)

% 输入:x是自变量矩阵;y是因变量矩阵;a是要计算的值的自变量;

% 输出:c是插值多项式系数矩阵;d是差商矩阵;f是所求自变量对应的因变量;

n=length(x);

d=zeros(n,n);

d(:,1)=y';

f=0;

for j=2:n

for i=j:n

d(i,j)=(d(i,j-1)-d(i-1,j-1))/(x(i)-x(i-j+1)); % 构造差商矩阵 end

end

c=d(n,n);

for k=(n-1):-1:1

c=conv(c,poly(x(k)));

m=length(c);

c(m)=c(m)+d(k,k); % 又插值公式构造各阶次对应系数矩阵

end

c=vpa(c,10); % 显示10位有效数字

for k=1:m

f=f+c(k)*a^(m-k);

end

end

输入矩阵

x=[0 30000 60000 90000 120000]

y=[9.81 9.7487 9.6879 9.6278 9.5682]

a=55000

再运行源函数,可得:

c =

[ -2.057613169e-23, 4.938271605e-18, -3.703703703e-14, -0.000002046111111, 9.81]

d =

9.8100 0 0 0 0

9.7487 -0.0000 0 0 0

9.6879 -0.0000 0.0000 0 0

9.6278 -0.0000 0.0000 0.0000 0

9.5682 -0.0000 0.0000 -0.0000 -0.0000

f =

9.6979851723251030491735014653435

即此时得到的插值函数为:

f(x)=−2.06×10−23x4+4.94×10−18x3−3.70×10−14x2−2.05×10−6x+9.81本题结果为:

f(55000)=9.6980

3.分段低次插值法

当插值点比较多的时候,拉格朗日插值多项式的次数可能会很高,因此具有数值不稳定的特点,也就是说尽管在已知的几个点取到给定的数值,但在附近却会和“实际上”的值之间有很大的偏差。这类现象也被称为Runge现象,解决的办法是分段用较低次数的插值多项式。

Runge现象

相关文档
最新文档