实验一插值方法实验.docx

上传人:b****5 文档编号:7506502 上传时间:2023-01-24 格式:DOCX 页数:12 大小:151.36KB
下载 相关 举报
实验一插值方法实验.docx_第1页
第1页 / 共12页
实验一插值方法实验.docx_第2页
第2页 / 共12页
实验一插值方法实验.docx_第3页
第3页 / 共12页
实验一插值方法实验.docx_第4页
第4页 / 共12页
实验一插值方法实验.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

实验一插值方法实验.docx

《实验一插值方法实验.docx》由会员分享,可在线阅读,更多相关《实验一插值方法实验.docx(12页珍藏版)》请在冰豆网上搜索。

实验一插值方法实验.docx

实验一插值方法实验

实验一-插值方法实验

《计算方法》

实验报告

 

学院:

信息学院

专业:

计算机科学与技术

指导教师:

班级学号:

姓名:

 

计算机科学与工程系

实验一插值方法

一.实验目的

(1)熟悉数值插值方法的基本思想,解决某些实际插值问题,加深对数值插值方法的理解。

(2)熟悉Matlab编程环境,利用Matlab实现具体的插值算法,并进行可视化显示。

二.实验要求

用Matlab软件实现Lagrange插值、分段线性插值、三次Hermite插值、Aitken逐步插值算法,并用实例在计算机上计算和作图。

三.实验内容

1.实验题目

i

0

1

2

3

x

0.46

047

0.48

0.49

y

0.4846555

0.4937452

0.5027498

0.5116683

(1)已知概率积分

的数据表

 

构造适合该数据表的一次、二次和三次Lagrange插值公式,输出公式及其图形,并计算x=0.472时的积分值。

(2)将区间[-5,5]分为10等份,求作

的分段线性插值函数,输出函数表达式及其图形,并计算x=3.3152时的函数值。

(3)仿照附录C中“文件1.2逐步插值”程序(Neville算法,课本227页)编写相应的Aitken逐步插值算法的程序,根据下表所给数据分别利用上述两种算法求正弦积分

在x=0.462的值,并比较它们的结果。

x

0.3

0.4

0.5

0.6

0.7

先将前两个插值点插值生成新的数据,然后与第三个插值点进行新的两点插值,不断重复这个插值过程,每一步增加一个新的节点,直到遍历所有节点为止,最终获得与原函数更加接近的插值函数。

(4)Hermite插值:

Hermite插值是Lagrange插值的综合与推广,,为了保证插值函数能更好地密合原来的函数,要求“过点”,即两者在节点上有相同的函数值,而且要求“相切”,即在节点上还具有相同的导数值。

 

3.对应程序

(1)Lagrange插值

function[y0,N]=Lagrange_eval(X,Y,x0)

%X,Y是已知的差值点坐标点

%x0是插值点

%y0是Lagrange多项式在x0处的值

%N是Lagrange插值函数的权系数

m=length(X);

N=zeros(m,1);

y0=0;

fori=1:

m

N(i)=1;

forj=1:

m

ifj~=i

N(i)=N(i)*(x0-X(j))/(X(i)-X(j));

end

end

y0=y0+Y(i)*N(i);

end

(2)分段插值

symsfx;

f=1/(1+x^2);

N=input('请输入插值节点数N=');

X=-5:

10/N:

5;

Y=zeros(1,length(X));

fori=1:

(N+1)

x=X(i);

Y(i)=eval(f);

end

M=-5:

0.01:

5;

y=zeros(1,length(M));

n=1;

fori=1:

N

forx=-5:

0.01:

5

ifx=X(i)

y(n)=Y(i)*(x-X(i+1))/(X(i)-X(i+1))+Y(i+1)*(x-X(i))/(X(i+1)-X(i));

n=n+1;

end

end

end

ezplot(f,[-5,5])

holdon

x=-5:

0.01:

5;

plot(x,y,'r');

(3)Neville逐步插值

functiony0=Neville_eval(X,Y,x0)

%X,Y是已知的插值点的坐标

%x0是插值点

%y0是多项式在x0处的值

m=length(X);

P=zeros(m,1);

P1=zeros(m,1);

P=Y;

fori=1:

m

P1=P;

k=1;

forj=i+1:

m

k=k+1;

P(j)=P1(j-1)+(P1(j)-P1(j-1))*(x0-X(k-1))/(X(j)-X(k-1));

end

ifabs(P(m)-P(m-1))<10^-6;

y0=P(m);

return;

end

end

y0=P(m);

Atiken逐步插值

functiony0=Aitken_eval(X,Y,x0)

%X,Y是已知的插值点的坐标

%x0是插值点

%y0是多项式在x0处的值

m=length(X);

P=zeros(m,1);

P1=zeros(m,1);

P=Y;

fori=1:

m

P1=P;

k=1;

forj=i+1:

m

k=k+1;

P(j)=P1(j-1)+(P1(j)-P1

(1))*(x0-X(k-1))/(X(j)-X

(1));

end

ifabs(P(m)-P(m-1))<10^-6;

y0=P(m);

return;

end

end

y0=P(m);

(4)Hermite插值

functiony0=Hermite_interp(X,Y,DY,x0)

%X,Y是已知插值点向量序列

%DY是插值点处的导数值

%x0是插值点横坐标

%y0是待求的分段三次Hemite插值多项式在x0处的值

%N表示向量长度

N=length(X);

fori=1:

N

ifx0>=X(i)&x0<=X(i+1)

k=i;

break;

end

end

a1=x0-X(k+1);

a2=x0-X(k);

a3=X(k)-X(k+1);

y0=(a1/a3)^2*(1-2*a2/a3)*Y(k)+(-a2/a3)^2*(1+2*a1/a3)*Y(k+1)+(a1/a3)^2*a2*DY(k)+(-a2/a3)^2*a1*DY(k+1);

4.实验结果

列出相应的运行结果。

如果要求可视化,则同时需要给出相应的图形。

(1)Lagrange插值

一次Lagrange插值:

运行结果:

>>X=[0.46,0.47];

>>Y=[0.4846555,0.4937452];

>>x0=0.472;

>>[y0,N]=Lagrange_eval(X,Y,x0)

y0=

0.49556314000000

N=

-0.20000000000000

1.20000000000000

插值系数与作图:

>>x1=0;

>>[y1,N]=Lagrange_eval(X,Y,x1);

>>x2=1;

>>[y2,N]=Lagrange_eval(X,Y,x2);

>>k=(y2-y1)/(x2-x1)

k=

0.90897000000001

>>x=[x1,x2];

>>y=[y1,y2];

>>plot(x,y)

二次Lagrange插值

差值结果:

>>X=[0.46,0.47,0.48];

>>Y=[0.4846555,0.4937452,0.5027498];

>>x0=0.472;

>>[y0,N]=Lagrange_eval(X,Y,x0)

y0=

0.49555292800000

N=

-0.08000000000000

0.96000000000000

0.12000000000000

插值系数与作图:

>>x1=0;

>>[y1,N]=Lagrange_eval(X,Y,x1);

>>x2=1;

>>[y2,N]=Lagrange_eval(X,Y,x2);

>>k=(y2-y1)/(x2-x1)

k=

0.87918499999967

>>x=[x1,x2];

>>y=[y1,y2];

>>plot(x,y)

三次Lagrange插值

差值结果:

>>X=[0.46,0.47,0.48,0.49];

>>Y=[0.4846555,0.4937452,0.5027498,0.5116683];

>>x0=0.472;

>>[y0,N]=Lagrange_1(X,Y,x0)

>>[y0,N]=Lagrange_eval(X,Y,x0)

y0=

0.49555296000000

N=

-0.04800000000000

0.86400000000000

0.21600000000000

-0.03200000000000

插值系数与作图

>>x1=0;

>>[y1,N]=Lagrange_eval(X,Y,x1);

>>x2=1;

>>[y2,N]=Lagrange_eval(X,Y,x2);

>>k=(y2-y1)/(x2-x1)

k=

0.83708499999011

>>x=[x1,x2];

>>y=[y1,y2];

>>plot(x,y)

(2)分段差值

差值结果:

>>Y=interp1(x,y,3.3152,'spline')

Y=

.0834********

作图:

(原函数:

蓝色,插值函数:

红色)

>>fenduan_eval

请输入插值节点数N=6

(3)Neville逐步插值

>>X=[0.3,0.4,0.5,0.6,0.7];

>>Y=[0.29850,0.39646,0.49311,0.58813,0.68122];

>>x0=0.462;

>>y0=Neville_eval(X,Y,x0)

y0=

0.45655811276280

Aitken逐步插值

>>X=[0.3,0.4,0.5,0.6,0.7];

>>Y=[0.29850,0.39646,0.49311,0.58813,0.68122];

>>x0=0.462;

>>y0=Aitken_eval(X,Y,x0)

y0=

0.77480886915945

(4)分段三次Hermite插值

>>X=[0.3,0.4,0.5,0.6,0.7];

>>Y=log(X);

>>DY=1./X;

>>x0=0.462;

>>y0=Hermite_interp(X,Y,DY,x0)

y0=

-0.7722

四.实验体会

通过本次课程设计,我初步掌握了MATLAB运用,了解了matlab的基本编程思想,学会了matlab的基本语法与常用操作命令,加深了对于Lagrange插值、分段线性插值、Neville逐步插值、Aitken逐步插值、Hermite插值的理解;培养了独立工作能力和创造力;更加精进了编程的能力;综合运用专业及基础知识,解决实际数学问题的能力;深入的了解和体会了计算方法—算法设计及其matlab实现的基本原理与学习思路;在本次课程设计中,在老师的精心指导下,收益匪浅。

同时对数学的研究有了更深入的认识,并对以往所掌握的数学及编程知识有了回顾及更深入的探索。

对于各种插值方法的精度分析也有了清晰的认识,并对各种插值算法有了深刻的的理解;Lagrange插值在高次插值时同原函数插值偏差大,拉格朗日插值模型简单,结构紧凑,是经典的插值法。

但是由于拉格朗日的插值多项式和每个节点都有关,当改变节点个数时,需要重新计算。

且当增大插值阶数时容易出现龙格现象。

分段线性插值是将整个区间分成许多小段,运用低次插值,从而提高精度。

分段线性插值算法简单,计算量小,但精度不高。

Neville插值的基本思想和Aitken插值一样,不同的是Neville插值每次选取的两个插值节点都是上一步相邻节点插值后得到的,而不是新的插值节点,这样得到的插值函数和原函数更加接近。

Aitken插值是对三步插值转化为两步插值的重复,先将前两个插值点插值生成新的数据,然后与第三个插值点进行新的两点插值,不断重复这个插值过程,每一步增加一个新的节点,直到遍历所有节点为止,最终获得与原函数更加接近的插值函数。

Hermite插值是Lagrange插值的综合与推广,,为了保证插值函数能更好地密合原来的函数,要求“过点”,即两者在节点上有相同的函数值,而且要求“相切”,即在节点上还具有相同的导数值。

这就保证了有较高的精度。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 销售营销

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1