数值分析实验报告(一)(完整)
- 格式:doc
- 大小:125.00 KB
- 文档页数:6
1 数值分析实验报告
姓 名 学 号 系 别 数学系 班级 09信息(2)班
主讲教师 王丹 指导教师 王丹 实验日期 专业 信息与计算科学
课程名称 数值分析 同组实验者 无
一、实验名称:
实验一、插值多项式的收敛性实验
二、实验目的:
1.理解插值的基本原理;
2.掌握多项式插值的概念、存在唯一性;
3.编写MATLAB程序实现Lagrange插值和Newton插值,验证Runge现象、分析插值多项式的收敛性。
三、实验内容及要求:
1.已知数据如下:
ix 0.2 0.4 0.6 0.8 1.0
()ifx 0.98 0.92 0.81 0.64 0.38
(1)用MATLAB语言编写按Langrage插值法和Newton插值法计算插值的程序,对以上数据进行插值;(2)利用MATLAB在第一个图中画出离散数据及插值函数曲线。
2.给定函数21(),[1,1]125fxxx,利用上题编好的Langrage插值程序(或Newton插值程序),分别取3个,5个、9个、11个等距节点作多项式插值,分别画出插值函数及原函数()fx的图形,以验证Runge现象、分析插值多项式的收敛性。
三、实验步骤(或记录)
Lagrange插值法的基本思想:
步骤1: 构造01,,,nxxx处的插值基函数01(),(),,()nlxlxlx,其中,插值节点ix处的插值基函数()ilx为011011()()()()()()()()()iiniiiiiiinxxxxxxxxlxxxxxxxxx;
步骤2:以iy作为()ilx的系数,使得()iiylx通过插值点(,)iixy;
步骤3:把所有的()iiylx线性叠加,得到通过所有插值点(,),0,1,,iixyin的插值函数0()()nniiiLxylx。
Lagrange插值伪代码:
给定n个插值点0011(,),(,),,(,)nnxyxyxy的情况下,求插值函数()nLx在点t处的函数值。
/*输入参数 2 *x=(x0,x1,….,xn), 插值节点
*y=(y0,y1,…,yn); 被插函数f(x)在插值节点处的函数值
*t 求插值函数Ln (x)在t处的函数值
*返回值 插值函数Ln (x)在t处的函数值
*/
procedure Lagrange
result0;
for i=1 to n
li(t)1;
for j=1 to n
if i≠j
li(t) li(t)*(t-xi)/(xi-xj);
end if
end for
resultresult+yi*li(t) ;
end for
return result;
end procedure
Lagrange插值子程序 lagr1:
function y=lagr1(x0,y0,x)%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;
E nd
Newton插值算法公式 :
001001011()()[,]()[,,,]()()()nnnNxfxfxxxxfxxxxxxxxx
余项为()()()nnRxfxNx)(],,,,[010ininxxxxxxf0(1)()()(1)!niifnxxn
其中 (,)ab与x有关.
Newton插值伪代码: 3 /*输入参数
*x=(x0,x1….,xn), 插值节点
*y=(y0,y1,…,yn); 被插函数f(x)在插值节点处的函数值
*t 求插值函数Pn (x)在t处的函数值
*返回值 插值函数Pn(x)在t处的函数值
*/
procedure Newton
for j=0 to n
d1jyj;
end for
for j=1 to n
for i=j to n
dij (di,j-1-di-1,j-1)/(xi-xi-j+1);
end for
end for
resultd11;
temp1;
for i=1to n
temptemp*(t-xi-1);
resultresult+di,i*temp;
end for
return result;
end procedure
Newton插值子程序 Newton:
function y=newton(x0,y0,x)%牛顿插值法
n=length(x0); m=length(x);
d=zeros(n,n);%d为差商表矩阵
for j=1:n
d(j,1)=y0(j);%差商表第一列
end
for j=2:n %差商表为下三角矩阵
for i=j:n
d(i,j)=(d(i,j-1)-d(i-1,j-1))./(x0(i)-x0(i-j+1));%求差商表矩阵中各值
end
end
for k=1:m
z=x(k);
result=d(1,1);
temp=1;
for i=2:n
temp=temp*(z-x0(i-1));
result=result+d(i,i)*temp;
end
y(k)=result;
end 4
1.编写拉格朗日插值多项式函数内容为:
function f=lagfun(x)
a=[0.2,0.4,0.6,0.8,1.0];
b=[0.98,0.92,0.81,0.64,0.38];
for i=1:5
L(i)=1;
for j=1:5
if j~=i
L(i)=L(i)*(x-a(j))/(a(i)-a(j));
end
end
end
f=0;
for i=1:5
f=f+L(i)*b(i);
end
画图程序内容为:
x0=[0.2,0.4,0.6,0.8,1.0]; y0=[0.98,0.92,0.81,0.64,0.38];
plot(x0,y0,'o')
hold on
grid on
fplot('lagfun',[0,1]);hold on
x=0:0.1:1;
plot(x,newton(x0,y0,x),'r');
legend('离散点','Lagrange插值','Newton插值')图形为:
00.10.20.30.40.50.60.70.80.910.40.50.60.70.80.91
离散点Lagrange插值Newton插值 5 2.Lagrange插值程序
for n=3:2:11
x= -1:0.1:1;
y=1./(1+25.*x.^2);
z=0*x;
x0=-1:2/(n-1):1;
y0=1./(1+25.*x0.^2);
y1=lagr1(x0, y0, x);plot(x, z, 'r', x, y, 'k:' ,x, y1, 'r')
gtext(['Lagr.',num2str(n)])
hold on
end
title('Lagrange')
legend('Largr插值','f(x)图像')
图形为:
-1-0.8-0.6-0.4-0.200.20.40.60.81-1-0.500.511.52Lagr.3Lagr.5Lagr.7Lagr.9Lagr.11Lagrange
Largr插值f(x)图像
6 -1-0.8-0.6-0.4-0.200.20.40.60.81-0.4-0.200.20.40.60.811.21.41.6Lagr10.y=1/(1+25.*x.2)Lagrange
拉格朗日插值在高次插值时同原函数偏差大、存在龙格现象,高次插值多项式不收敛。
五、教师评语(或成绩)
教师签字 :王丹
2011年 月 日