三次埃尔米特插值

三次埃尔米特插值
三次埃尔米特插值

《计算方法》课程设计报告

学生姓名:张学阳学号:1009300132

陈洋1009300109

刘睿1009300122 学院:理学院

班级: 数学101

题目: 分段线性及三次埃尔米特插值通用程序

指导教师:宋云飞职称:讲师

朱秀丽讲师

尚宝欣讲师

2012年12月30日

目录

目录............................................................................................... I

一、摘要 (1)

二、算法设计 (1)

2.1分段线性插值 (1)

2.2分段三次埃尔米特插值 (1)

2.3功能框图 (1)

三、例题计算 (1)

四、误差及结果分析 (9)

4.1例题误差分析 (1)

4.2结点个数对插值结果的影响 (1)

五、总结及心得体会 (12)

参考文献 (13)

源程序 (14)

一、摘要

分段线性插值与分段定义的线性插值,在相邻插值节点的区间上对应的是同一个线性函数。由于它们的表现形式不一样从而产生为两种不同的计算方法,相应的误差表现形式也不一样.拉格朗日插值余项利用f(x)的二阶导数,要f(x)的二阶导数存在,对于二阶导数不存在的情况不能估算出它的误差,所以适用范围比较小.现在我们可以利用一阶导数就估

算出误差,给计算带来许多的方便。

为了避免高次插值可能出现的大幅度波动现象,在实际应用中通常采用分段低次插值来提高近似程度,比如可用分段线性插值或分段三次埃尔米特插值来逼近已知函数,但它们的总体光滑性较差。为了克服这一缺点,一种全局化的分段插值方法——三次样条插值成为比较理想的工具。

在代数插值过程中,人们为了获得较好的近似效果,通常情况下是增加插值节点数.由于二次插值比线性插值近似效果好,因此容易错误地认为插值多项式次数越高越好.事实上,随着插值节点的增多,插值多项式不一定收敛到被插值函数.。通过分段低次插值或样条插值可以得到较好的近似逼近函数,分段低次插值具有公式简单、运算量小、稳定性好、收敛性有保证等优点.随着子区间长度h取得足够小,分段低次插值总能满足所要求的精度.因此分段低次插值应用十分广泛.。分段线性插值是分段低次插值中常见的方法之一,在本文中对函数在(-5,5)上进行分段线性插值,取不同节点个数n,得到不同分段线性插值函数.并用MATLAB编写分段线性插值函数,最后比较用不同节点数所得插值函数与真实函数的误差,从而得出节点数与插值效果的关系。

二、算法设计

2.1 分段线性插值

分段线性插值就是通过插值点用折线段连接起来的逼近函数)(x f 。设已知节点

b x x x a n =<<= 10上的函数值,,,,10n f f f 记,1k k k x x h -=+,max k h h =求一折线函数)(x I h 满足:

(1)];,[)(b a C x I h ∈

(2));,,1,0()(n k f x I k k h ==

(3))(x I h 在每个小区间],[1+k k x x 上是线性函数. 则称)(x I h 为分段线性插值函数。

由定义可知)(x I h 在每个小区间],[1+k k x x 上可表示为

.1,,1,0,,)(11111-=≤≤--+--=

+++++n k x x x f x x x x f x x x x x I k k k k

k k

k k k k h

分段线性插值的误差估计可利用插值余项公式

)()()()(11112x l y x l y x l y x L k k k k k k ++--++=

得到

|))((|max 2|)()(|max 12

1

1

+≤≤≤≤--≤

-+=k k x x x h x x x x x x x M x I x f k k kx k 或

2

28

|)()(|max h M x I x f h b

x a ≤

-≤≤ 其中.|)(''|max 2x f M b

x a ≤≤=由此还可得到

)()(lim 0

x f x I h h =→

在],[b a 上一致成立,故)(x I h 在],[b a 上一致收敛到)(x f 。

2.2 分段三次埃尔米特插值

分段线性插值函数)(x I h 的导数是间断的,若在节点),,1,0(n k x k =上除已知函数值k

f 外还给出导数值),,1,0('n k m f k k ==这样就可构造一个导数连续的分段插值函数),(x I h 它满足条件:

(1)];,[')(b a C x I h ∈

(2)),,1,0(')(',)(n k f x I f x I k k h k k h ===; (3))(x I h 在每个小区间],[1+k k x x 上是三次多项式。

根据两点三次插值多项式可知,)(x I h 在区间],[1+k k x x 上的表达式为

111

211211)21()()21()(

)(+++++++--+--+--+--=k k x k k k k k k k k x k k h f x x x x x x x x f x x x x x x x x x I

')()(')()(

112

1211+++++---+---+k k k

k k k k k k k f x x x x x x f x x x x x x

上式对于1,,1,0-=n k 成立。

利用三次埃尔米特插值多项式的余项可得误差估计

],[|,)(|max 3841|)()(|1)4(4

1

+≤≤∈≤

-+k k z x x k h x x x x f h x I x f k k 其中k k k x x h -=+1

2.3功能框图

程序可以通过输入插值函数,插值结点个数,来实现插值,还可以选择插值方式,具体框图如下

三、例题计算

1.插值函数为1

x

f

=x

)

(2+

输入6个节点的分段线性插值

输入6个节点的分段三次埃尔米特插值

请输入插值函数:x^2+1

请选择插值法(1为分段线性插值,2为分段三次埃尔米特插值):>> 1 请输入插值节点数N=6

是否继续(1为继续):1

请输入插值函数:x^2

请选择插值法(1为分段线性插值,2为分段三次埃尔米特插值):>> 2 请输入插值节点数N=6

是否继续(1为继续):2

2.插值函数为)

f

x

(x

cos(

)

输入节点为8的分段线性插值

输入节点为8的分段三次埃尔米特插值

请输入插值函数:cos(x)

请选择插值法(1为分段线性插值,2为分段三次埃尔米特插值):>> 1 请输入插值节点数N=8

是否继续(1为继续):1

请选择插值法(1为分段线性插值,2为分段三次埃尔米特插值):>> 2 请输入插值节点数N=8

3.插值函数为x e

(

x

)

f

输入节点为10的分段线性插值

输入节点为10的分段线三次埃尔米特插值

请输入插值函数:exp(x)

请选择插值法(1为分段线性插值,2为分段三次埃尔米特插值):>> 1 请输入插值节点数N=10

是否继续(1为继续):1

请选择插值法(1为分段线性插值,2为分段三次埃尔米特插值):>> 2 请输入插值节点数N=10

四、误差及结果分析

4.1例题误差分析

1. 1)(2+=x x f 误差

n 值取8,由分段线性插值余项公式

|))((|max 2|)()(|max 12

1

1

+≤≤≤≤--≤

-+=k k x x x h x x x x x x x M x I x f k k kx k 可得误差限为

25.18

102)(''max =?x f 由插值图像和误差可知误差结果较大 由分段三次埃尔米特插值余项公式

],[|,)(|max 3841|)()(|1)4(4

1

+≤≤∈≤

-+k k z x x k h x x x x f h x I x f k k 可得误差限为

00)(384

1

41=?-+k k x x 误差为零因此分段三次埃尔米特插值较为精确 2. )cos()(x x f =误差

n 值取10,分段线性插值误差限为

2

1

10102)(''max =?x f 分段三次埃尔米特插值误差限为

384

11)(384141=?-+k k x x 由误差结果可知分段三次埃尔米特插值得到的结果更为精确 3. x e x f =)(误差

n 值取12,分段线性插值误差限为

61.838812512102)(''max 5

==?e x f 分段三次埃尔米特插值误差限为

0.1864)65(3841)(384154541=??=?-+e e x x k k 由误差结果可知分段三次埃尔米特插值得到的结果更为精确 综上可知,同等条件下分段三次埃尔米特插值得到的结果更为精确

4.2结点个数对插值结果的影响

为了进一步研究误差与插值节点的关系,我们以例题3的分段三次埃尔米特插值为例 n 值取4时,误差为15.0974,插值图像如下

n值取5时,误差为6.1839,插值图像如下

n值取6时,误差为2.9822,插值图像如下

n值取8时,误差为0.9436,插值图像如下

通过误差限和得到的图像可知,插值节点越多,得到的图像越精确。

五、总结及心得体会

刚看到题目时,心里一片茫然不知该如何下手,因为计算方法的课程设计和之前做的课程设计有很大的不同,特别是不知论文该写哪些东西,后来通过查阅书籍和网络搜索同类论文了解了它的写作内容。总是有很多的问题存在,只是大多时候都隐藏了起来,当我们发现问题时,应该以平常的心态去对待,着急是没有用的,我们要做的就是在最短的时间内找出解决的办法。在学习计算方法课程的时候,发现它确实不好学,只是应付考试就尚且有些费劲,要想真正弄精就更是困难了,不过这也是没有办法的事,毕竟就是有很多东西很难理解甚至是理解不了的,要想比别人更厉害,就得花些时间在难以理解的问题上。在做课设时有些同学做了界面现一想还急火攻心,开始自己也想着做一下界面,可是有难度,不得不佩服那些能人,既然那东西不会,就只能乖乖用自己会的了。有时候我不得不再次钦佩自己的团队协作能力,同样又是和不同的人组队,依旧是碰撞出激情的火花,我只想说团结就是力量。我们最大的敌人是我们自己,我一直深信,在做的过程中,脑海中一直在想别人做的怎么样了,是不是比自己做的更好,当静下心来时,才恢复过来,管别人干什么,尽自己最大的努力把东西最好不就可以了吗,相信自己一定能做好。

有一个伟人曾说过如果给他一把斧头用六个小时去砍柴,他会用四个钟头取磨这把斧头,课设前的准备是很重要的,还好,通过学习计算方法了解了许多计算方法的知识。我们学习的知识有很多是模糊的,当在规定的时间去完成任务是,我们所要做的就是把可能用到的知识拾起来或是尽快学会一种方法来解决它,这是一种能力,是需要我们通过锻炼去提高的。

参考文献

[1]李庆扬,王能超,易大义.数值分析(第5版).北京:清华大学出版社,2008.

[2]李庆扬,关治,白峰杉.数值计算原理.北京:清华大学出版社,2000.

[3]李海,邓樱.MATLAB程序设计教程.北京:高等教育出版社,2002.

[4]张学敏,倪虹霞. MATLAB基础及应用. 中国电力出版社,2009.

[5]易大义, 沈云宝, 李有法. 计算方法[M]. 浙江大学出版社, 2002.

源程序

c=1;

while(c==1)

syms f x lx;

f=input('请输入插值函数');

B=input('请选择插值法(1为分段线性插值,2为分段三次埃尔米特插值):'); if B==1

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

xx=-5:10/N:5;

ff=zeros(1,length(xx));

for i=1:(N+1)

x=xx(i);

ff(i)=eval(f);

end

M = -5:0.01:5;

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

n = 1;

for i=2:N+1

for x=-5:0.01:5

if x=xx(i-1)

lx(1)=ff(i-1)*(x-xx(i))/(xx(i-1)-xx(i));

lx(2)=ff(i)*(x-xx(i-1))/(xx(i)-xx(i-1));

output(n) = lx(1)+lx(2);

n = n+1;

end

end

end

ezplot(f,[-5,5])

hold on

A =-5:0.01:5;

plot(A,output,'r');

end

if B==2

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

f1=diff(f);

xx=-5:10/N:5;

ff=zeros(1,length(xx));

for i=1:(N+1)

x=xx(i);

ff(i)=eval(f);

ff1(i)=eval(f1);

end

M = -5:0.01:5;

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

n = 1;

for i=2:N+1

for x=-5:0.01:5

if x=xx(i-1)

lx(1)=ff(i-1)*(x-xx(i))^2/(xx(i-1)-xx(i))^2*(1+2*(x-xx(i-1))/(xx(i)-xx(i-1)));

lx(2)=ff(i)*(x-xx(i-1))^2/(xx(i)-xx(i-1))^2*(1+2*(x-xx(i))/(xx(i-1)-xx(i)));

lx(3)=ff1(i-1)*(x-xx(i))^2/(xx(i-1)-xx(i))^2*(x-xx(i-1));

lx(4)=ff1(i)*(x-xx(i-1))^2/(xx(i)-xx(i-1))^2*(x-xx(i));

output(n) = lx(1)+lx(2)+lx(3)+lx(4);

n = n+1;

end

end

end

ezplot(f,[-5,5])

hold on

A =-5:0.01:5;

plot(A,output,'r');

end

if B~=1&&B~=2

disp('输入有误,请重新输入')

end

c=input('是否继续(1为继续):');

close

end

注:设计报告撰写说明

一、正文内容要求:

正文内容层次序号为:1、1.1、1.1.1……。

正文内容一般为:

1、选题背景:说明本课题应解决的主要问题及应达到的技术要求;简述本设计的指导思想。

2、方案论证(设计理念):说明设计原理(理念)并进行方案选择,阐明为什么要选择这个设计方案以及所采用方案的特点。

3、过程论述:对设计工作的详细表述。要求层次分明、表达确切。

4、结果分析:对研究过程中所获得的主要的数据、现象进行定性或定量分析,得出结论和推论。

5、结论或总结:对整个研究工作进行归纳和综合。

6、课程设计心得体会。

二、图表、公式要求:

课程设计说明书(报告)中图表、公式一律采用阿拉伯数字连续编号。图序及图名置于图的下方;表序及表名置于表的上方;说明书(报告)中的公式编号,用括号括起来写在右边行末,其间不加虚线。

三、格式要求:

页边距:上2cm,下2cm,左2.5cm、右2cm;

行距:固定值20磅;

页码:底部居中;

字体:正文宋体小四号字;文中英文用新罗马体小四号字;源程序清单用英文新罗马五号字。

每个自然段开始空两格;

报告的字数不少于3000(不包括程序清单和图);

按规定的模板封面输出,不准自定义封面格式。

数值分析实验六(分段三次Hermite插值)

《数值分析》实验报告 实验编号:实验六 课题名称:分段三次Hermite插值 一、算法介绍 给定的函数为f(x)=1/(25*x*x+1),将给定区间分成10分,得到11个节点:x[0],x[1],...,x[10],构造插值函数的基函数。当x在(x[0],x[1])区间上时,H[0] = (x-x[0])*[((x-x[1])/(x[0]-x[1]))^2]。其余的区间为H[0]=0。h[0]= [1+2*(x-x[0])/(x[1]-x[0])]*[((x-x[1])/(x[0]-x[1]))^2]。当x在[x[i-1],x[i]] (i=1,2,3, (9) 区间上时,H[i]=(x-x[i])*[((x-x[i-1])/(x[i]-x[i-1]))^2],h[i]=[1+2*(x-x[i])/(x[i-1]-x[i])]*[((x-x[i-1])/(x[i]-x[i-1]))^2)。当x在(x[i],x[i+1]](i=1,2,3,…,10)区间上其余的区间为H[i]=(x-x[i])[((x-x[i+1])/(x[i]-x[i+1]))^2],h[i]=[1+2*(x-x[i])/(x[i+1]-x[i])]*[((x-x[i+1 ])/(x[i]-x[i+1]))^2]。其余区间上均为H[i]=0,h[i]=0(i=1,2,…,10)。当x在(x[9],x[10])区间上时,H[10] = (x-x[9])(((x-x[10])/(x[9]-x[10]))^2).其余的区间为H[10]=0.h[10]= (1+2*((x-x[9])/(x[10]-x[9])))(((x-x[10])/(x[9]-x[10]))^2).其余区间h[10]=0。构造函数H(x) =∑(y[i]*h[i]+y'[i]*H[i],(i=0,1,…,10)。 二、程序代码 // testV iew.cpp : implementation of the CTestV iew class // #include "stdafx.h" #include "test.h" #include "testDoc.h" #include "testView.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CTestV iew IMPLEMENT_DYNCREA TE(CTestView, CView) BEGIN_MESSAGE_MAP(CTestView, CView) //{{AFX_MSG_MAP(CTestView) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code! //}}AFX_MSG_MAP // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CV iew::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTestV iew construction/destruction CTestView::CTestV iew() { // TODO: add construction code here }

三次样条插值法

natural cubic spine二阶导数求解 1 Natural cubic spine is The formula (3.37) in book ‘Numerical Recipes in Fortran 77’ is: (1) Where . Formula (1) can be simplified as: (2) Where: (3) Formula (2) can be written as: (4) This is a ‘m=n-2’ dimensional equation, then change the subscript. Take: , and (4) can be changed into: (5) To solve equation (5), we can get , then we can get . 三次样条插值法使用时,一般要对y均分取值。

2 The second derivative is known: , (6) When : (7) When : (8) So formula (4) can be written as: (9) Then we can solve equation (9).

3 The first derivative is known. The formula (3.35) is : (6) Where: Case 1: , (6) can be changed into: (7) And , (7) can be written as: (8) (9) Case 2: , (6) can be written as: (10) And , (10) can be written as: (11) (12) , (13) j=2:

三次样条插值方法的应用

CENTRAL SOUTH UNIVERSITY 数值分析实验报告

三次样条插值方法的应用 一、问题背景 分段低次插值函数往往具有很好的收敛性,计算过程简单,稳定性好,并且易于在在电子计算机上实现,但其光滑性较差,对于像高速飞机的机翼形线船体放样等型值线往往要求具有二阶光滑度,即有二阶连续导数,早期工程师制图时,把富有弹性的细长木条(即所谓的样条)用压铁固定在样点上,在其他地方让他自由弯曲,然后沿木条画下曲线,称为样条曲线。样条曲线实际上是由分段三次曲线并接而成,在连接点即样点上要求二阶导数连续,从数学上加以概括就得到数学样条这一概念。下面我们讨论最常用的三次样条函数及其应用。 二、数学模型 样条函数可以给出光滑的插值曲线(面),因此在数值逼近、常微分方程和偏微分方程的数值解及科学和工程的计算中起着重要的作用。 设区间[]b ,a 上给定有关划分b x x n =<<<= 10x a ,S 为[]b ,a 上满足下面条件的函数。 ● )(b a C S ,2∈; ● S 在每个子区间[]1,+i i x x 上是三次多项式。 则称S 为关于划分的三次样条函数。常用的三次样条函数的边界条件有三种类型: ● Ⅰ型 ()()n n n f x S f x S ''0'',==。 ● Ⅱ型 ()()n n n f x S f x S ''''0'''',==,其特殊情况为()()0''''==n n x S x S 。 ● Ⅲ型 ()() 3,2,1,0,0==j x S x S n j j ,此条件称为周期样条函数。 鉴于Ⅱ型三次样条插值函数在实际应用中的重要地位,在此主要对它进行详细介绍。 三、算法及流程 按照传统的编程方法,可将公式直接转换为MATLAB 可是别的语言即可;另一种是运用矩阵运算,发挥MATLAB 在矩阵运算上的优势。两种方法都可以方便地得到结果。方法二更直观,但计算系数时要特别注意。这里计算的是方法一的程序,采用的是Ⅱ型边界条件,取名为spline2.m 。 Matlab 代码如下: function s=spline2(x0,y0,y21,y2n,x) %s=spline2(x0,y0,y21,y2n,x) %x0,y0 are existed points,x are insert points,y21,y2n are the second

数值计算(数值分析)实验4-分段三次埃尔米特(hermite)插值【c程序实现+流程图】

实验四分段三次埃尔米特插值 (一)实验目的 掌握分段三次埃尔米特插值算法。 (二)实验项目内容 1.写出计算步骤和流程图。 2.对每种算法分别用C或c#程序实现。 3.调试程序。可用以下数据进行调试。 已知函数y=1/(1+x2)在区间[0,3]上取等距插值节点,求区间[0,3]上的分段三次埃尔米特插值函数,并利用它求出f(1.5)的近似值(0.3075)。 x0 1 2 i y 1 0.5 0.2 i y 0 -0.5 -0.16 i (三)主要仪器设备 微机 (四)实验室名称 公共计算机实验室 (五)实验报告撰写 实验四分段三次埃尔米特插值 实验报告 一、流程图

二、 程序代码 #include #include float f0(float x) N Y 开始 输入i x ,i y ,x y=0, j=0 t=1 i j i x x t t x x -=- i=0,…j-1,j+1,…n i y y ty =+ j=n? 输出y 结束 j=j+1

{ return((x-1)*(x-1)*(2*x+1)); } float f1(float x) { return(x*x*(-2*x+3)); } float g0(float x) { return(x*(x-1)*(x-1)); } float g1(float x) { return(x*x*(x-1)); } void main() {float x0,x1,x,y0,y1,yy0,yy1,h,p; printf("输入x0,x1,x,y0,y1和yy0,yy1的取值"); scanf("%f%f%f%f%f%f%f",&x0,&x1,&x,&y0,&y1,&yy0,&yy1); h=x1-x0; p=y0*f0((x-x0)/h)+y1*f1((x-x0)/h)+h*yy0*g0((x-x0)/h)+h*yy1*g1((x- x0)/h); printf("%f\n",p); } 三、运行结果【截图】

分段三次hermite插值C程序

分段三次hermite插值C程序 XYYZ #include #include #define m 4 #define n 5 void main() { int i,k; float x[n+1],y[n+1],yy[n+1],h,z[m]; printf("请按行输入一系列的x值:\n"); for(k=0;k=x[k]&&z[i]<=x[k+1]) { h=pow((z[i]-x[k+1])/(x[k]-x[k+1]),2.0)*(1+2*(z[i]-x[k])/(x[k+1]-x[k]))*y[k]+pow((z[i]-x[k])/(x[k +1]-x[k]),2.0)*(1+2*(z[i]-x[k+1])/(x[k]-x[k+1]))*y[k+1]+pow((z[i]-x[k+1])/(x[k]-x[k+1]),2.0)*(z [i]-x[k])*yy[k]+pow((z[i]-x[k])/(x[k+1]-x[k]),2.0)*(z[i]-x[k+1])*yy[k+1]; printf("h(%f)=%f\n",z[i],h); } } 附:程序运行结果如下: 请按行输入一系列的x值: 0.1 0.2 0.3 0.4 0.5 0.6 请按行输入一系列的y值: 0.09983 0.19867 0.29552 0.38942 0.47943 0.56462 请输入一系列的y'的值: 0.99500 0.98007 0.95534 0.92106 0.87758 0.82534

实验六:分段三次Hermit插值

《数值分析》实验报告 实验序号:实验六题目名称: 分段三次Hermit插值 学号: 姓名: 、 任课教师: 马季骕专业班级:计算机科学与技术(非师范) 1、题目描述 这是一种光滑的分段插值,给定[a,b]上的节点a=x0

m=0; x1=x1+0.00001; for(i=0;i<=10;i++) { if(i==0&&x1>=ax[0]&&x1<=ax[1]) { n=(1+2*((x1-ax[0])/(ax[1]-ax[0])))*((x1-ax[1])/(ax[0]-ax[ 1]))*((x1-ax[1])/(ax[0]-ax[1]));// 插值基函数h(x) tt=ay[0]*n; //插值基函数与其函数值线性组合 h=(x1-ax[0])*((x1-ax[1])/(ax[0]-ax[1]))*((x1-ax[1])/(ax[0 ]-ax[1]));//插值基函数H(x) tt1=a[0]*h;//插值基函数与其一阶导数值线性组合 m=tt+tt1+m;//把插值基函数做线性组合 } else { if(x1>=ax[i-1]&&x1<=ax[i]) { n=(1+2*((x1-ax[i])/(ax[i-1]-ax[i])))*((x1-ax[i-1])/(ax[i]-ax[i-1]))*((x1-ax[i-1])/(ax[i]-ax[i-1])); tt=ay[i]*n; h=(x1-ax[i])*((x1-ax[i-1])/(ax[i]-ax[i-1]))*((x1-ax[i -1])/(ax[i]-ax[i-1])); tt1=a[i]*h; m=tt+tt1+m; } else { if(x1>ax[i]&&x1<=ax[i+1]) { n=(1+2*((x1-ax[i])/(ax[i+1]-ax[i])))*((x1-ax[i+ 1])/(ax[i]-ax[i+1]))*((x1-ax[i+1])/(ax[i]-ax[i+1]));

数值分析实验报告-插值、三次样条(教育教学)

实验报告:牛顿差值多项式&三次样条 问题:在区间[-1,1]上分别取n=10、20用两组等距节点对龙格函数2 1()25f x x 作多项式插值及三次样条插值,对每个n 值,分别画出插值函数及()f x 的图形。 实验目的:通过编程实现牛顿插值方法和三次样条方法,加深对多项式插值的理解。应用所编程序解决实际算例。 实验要求: 1. 认真分析问题,深刻理解相关理论知识并能熟练应用; 2. 编写相关程序并进行实验; 3. 调试程序,得到最终结果; 4. 分析解释实验结果; 5. 按照要求完成实验报告。 实验原理: 详见《数值分析 第5版》第二章相关内容。 实验内容: (1)牛顿插值多项式 1.1 当n=10时: 在Matlab 下编写代码完成计算和画图。结果如下: 代码: clear all clc x1=-1:0.2:1; y1=1./(1+25.*x1.^2); n=length(x1); f=y1(:); for j=2:n for i=n:-1:j f(i)=(f(i)-f(i-1))/(x1(i)-x1(i-j+1)); end end syms F x p ; F(1)=1;p(1)=y1(1); for i=2:n F(i)=F(i-1)*(x-x1(i-1)); p(i)=f(i)*F(i);

end syms P P=sum(p); P10=vpa(expand(P),5); x0=-1:0.001:1; y0=subs(P,x,x0); y2=subs(1/(1+25*x^2),x,x0); plot(x0,y0,x0,y2) grid on xlabel('x') ylabel('y') P10即我们所求的牛顿插值多项式,其结果为:P10(x)=-220.94*x^10+494.91*x^8-9.5065e-14*x^7-381.43*x^6-8.504e-14*x^5+123.36*x^4+2.0202e-1 4*x^3-16.855*x^2-6.6594e-16*x+1.0 并且这里也能得到该牛顿插值多项式的在[-1,1]上的图形,并和原函数进行对比(见Fig.1)。 Fig.1 牛顿插值多项式(n=10)函数和原函数图形 从图形中我们可以明显的观察出插值函数在两端点处发生了剧烈的波动,产生了极大的误差,即龙格现象,当n=20时,这一现象将更加明显。 1.2 当n=20时: 对n=10的代码进行修改就可以得到n=20时的代码。将“x1=-1:0.2:1;”改为“x1=-1:0.1:1;”即可。运行程序,我们得到n=20时的牛顿插值多项式,结果为:P20(x)= 260188.0*x^20 - 1.0121e6*x^18 + 2.6193e-12*x^17 + 1.6392e6*x^16 + 2.248e-11*x^15 - 1.4429e6*x^14 - 4.6331e-11*x^13 + 757299.0*x^12 + 1.7687e-11*x^11 - 245255.0*x^10 + 2.1019e-11*x^9 + 49318.0*x^8 + 3.5903e-12*x^7 - 6119.2*x^6 - 1.5935e-12*x^5 + 470.85*x^4 + 1.3597e-14*x^3 - 24.143*x^2 - 1.738e-14*x + 1.0 同样的,这里得到了该牛顿插值多项式的在[-1,1]上的图形,并和原函数进行对比(见Fig.2)。

Hermite插值函数

数值分析实验报告 任课教师:马季骕班级:11级计算机科学与技术 1实验目的及要求 2程序的源代码 3实验操作 4实验结果及分析 1实验目的及要求 学会Hermite插值法,并应用该算法于实际问题. (1)给定函数y=f(x)在n各不同的插值节点xi(i=1,…,n)的函数值yi=f(xi) (i=1,…,n),用厄米特(Hermite)插值多项式求函数在x初的函数值y。 (2)Hermite插值多项式: (4)如果有错,修改直至运行成功,查看运行结果; (5)根据所求函数,画出图形。 (6)查看原函数的图形与逼近函数图形的近似程度。 2 程序的源代码 // LDlg.cpp : implementation file // #include "stdafx.h" #include "L.h" #include "LDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE

static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg)

分段Hermite插值

6.6 分段埃尔米特插值及其MATLAB 程序 6.6.2 分段埃尔米特插值的MATLAB 程序 调用格式一:YI=interp1(X,Y,XI,'pchip') 调用格式二:YI=interp1(X,XI,'pchip') 例6.6.5 试用MA TLAB 程序计算例6.6.1中在各小区间中点处分段三次埃尔米特插值)(2/1+i n x H 及其相对误差. 解 在MATLAB 工作窗口输入程序 >> h=0.2;x0=-1:h:1;y0=1./(1+25.*x0.^2); xi=-0.9:h:0.9; fi=1./(1+25.*xi.^2); yi=interp1(x0,y0,xi,'pchip'); Ri=abs((fi-yi)./fi); xi,fi,yi,Ri,i=[xi',fi',yi',Ri'] 运行后屏幕显示各小区间中点x i 处的函数值f i ,插值s i ,相对误差值R i (略). 6.6.3 作有关分段埃尔米特插值图形的MATLAB 程序 作有关分段埃尔米特插值图形的MATLAB 主程序 function H=hermitetx(x0,y0,xi,x,y) H= interp1(x0,y0,xi,'pchip'); Hn= interp1(x0,y0,x,'pchip'); plot(x0,y0,'o',x,Hn,'-',xi,H,'*',x,y,'-.') legend('节点(xi,yi)', '分段埃尔米特插值函数','插值点(x,H)','被插值函数y') 我们也可以直接在在MATLAB 工作窗口编程序,例如, >> x0 =-6:6; y0 =sin(x0); xi = -6:.25:6; yi = interp1(x0,y0,xi,'pchip'); x=-6:0.001:6; y=sin(x); plot(x0,y0,'o',xi,yi,x,y,':'), legend('节点(xi,yi)','分段埃尔米特插值函数','被插值函数y=sinx') title(' y=sinx 及其分段埃尔米特插值函数和节点的图形') >> x0 =-6:6; y0 =cos(x0); xi = -6:.25:6;yi = interp1(x0,y0,xi,'pchip'); x=-6:0.001:6; y=cos(x); plot(x0,y0,'o',xi,yi,x,y,':'), legend('节点(xi,yi)','分段埃尔米特插值函数','被插值函数y=cosx') title(' y=cosx 及其分段埃尔米特插值函数和节点的图形') 例6.6.6 设函数211 )(x x f +=定义在区间]5,5[-上,节点(X (i ),f (X (i )))的横坐标 向量X 的元素是首项a =-5,末项b =5,公差h =1.5的等差数列,构造三次分段埃尔米特插值函数)(3,x H n .把区间]5,5[-分成20等份,构成20个小区间,用MA TLAB 程序计算各小区间中点i x 处)(3,x H n 的值,并作出节点,插值点,)(x f 和)(3,x H n 的图形. 解 在MATLAB 工作窗口输入程序 >>x0=-5:1.5:5; y0=1./(1+x0.^2); x1=-4.75:0.5:4.75; x=-5:0.001:5; y=1./(1+x.^2); H= hermitetx(x0,y0,x1,x,y) title('函数y=1/(1+x^2)及其分段埃尔米特插值函数,插值,节点(xi,yi) 的图形') 运行后屏幕显示各小区间中点i x 处)(3,x H n 的值,出现节点,插值点,)(x f 和)(3,x H n 的图形(略). 例6.6.7 设函数x x x f cos 5.0)(-=定义在区间],[ππ-上,取7=n ,按等距节点构造分段埃尔米特插值函数)(3,7x H ,用MA TLAB 程序计算各小区间中点i x 处)(3,7x H 的值,

分段三次hermite插值

C语言课程设计报告 课程名称:程序设计语言 组员:学号:魏文豪135******** 汤恒 135******** 彭建平135******** 指导教师:李华刚 2015年 12 月 13 日

流程图

代码! #include #include #define m 4 #define n 5 void main() { int i,k; float x[n+1],y[n+1],yy[n+1],h,z[m]; printf("请按行输入一系列的x值:\n"); for(k=0;k=x[k]&&z[i]<=x[k+1]) { h=pow((z[i]-x[k+1])/(x[k]-x[k+1]),2.0)*(1+2*(z[i]-x[k])/(x[k+1]-x[k]))*y[k]+pow( (z[i]-x[k])/(x[k+1]-x[k]),2.0)*(1+2*(z[i]-x[k+1])/(x[k]-x[k+1]))*y[k+1]+pow((z[i ]-x[k+1])/(x[k]-x[k+1]),2.0)*(z[i]-x[k])*yy[k]+pow((z[i]-x[k])/(x[k+1]-x[k]),2.0 )*(z[i]-x[k+1])*yy[k+1]; printf("h(%f)=%f\n",z[i],h); } }

分段三次Hermite插值

分段三次Hermite 插值 1. 目的意义: 可以得到在插值区间上光滑的分段插值多项式 2. 数学模型(数学公式): ???????∈??????∈∈=-] ,[),(],[),(],[),()(1212101n n n x x x x H x x x x H x x x x H x H '221'122 13211321)()())(())]((2[))]((2[i i i i i i i i i i i i i i i i i i i y h x x x x y h x x x x y h x x x x h y h x x x x h H --+--+--++--+=------ 3. 算法程序: #include #include #define m 4 #define n 5 void main() { int i,k; float x[n+1],y[n+1],yy[n+1],h,z[m];

printf("请按行输入一系列的x值:\n"); for(k=0;k=x[k]&&z[i]<=x[k+1]) { h=pow((z[i]-x[k+1])/(x[k]-x[k+1]),2.0)*(1+2*(z[i]-x[k])/(x[k+1 ]-x[k]))*y[k]+pow((z[i]-x[k])/(x[k+1]-x[k]),2.0)*(1+2*(z[i]-x[k +1])/(x[k]-x[k+1]))*y[k+1]+pow((z[i]-x[k+1])/(x[k]-x[k+1]),2.0 )*(z[i]-x[k])*yy[k]+pow((z[i]-x[k])/(x[k+1]-x[k]),2.0)*(z[i]-x[k

数值计算数值分析实验分段三次埃尔米特hermite插值c程序实现流程图

数值计算数值分析实验分段三次埃尔米特 h e r m i t e插值c程序实 现流程图 集团文件版本号:(M928-T898-M248-WU2669-I2896-DQ586-M1988)

实验四分段三次埃尔米特插值 (一)实验目的 掌握分段三次埃尔米特插值算法。 (二)实验项目内容 1.写出计算步骤和流程图。 2.对每种算法分别用C或c#程序实现。 3.调试程序。可用以下数据进行调试。 已知函数y=1/(1+x2)在区间[0,3]上取等距插值节点,求区间[0,3]上的分段三次埃尔米特插值函数,并利用它求出f(1.5)的近似值 (0.3075)。 (三)主要仪器设备 微机 (四)实验室名称 公共计算机实验室 (五)实验报告撰写 实验四分段三次埃尔米特插值 实验报告 一、流程图

二、程序代码 #include #include float f0(float x)

{ return((x-1)*(x-1)*(2*x+1)); } float f1(float x) { return(x*x*(-2*x+3)); } float g0(float x) { return(x*(x-1)*(x-1)); } float g1(float x) { return(x*x*(x-1)); } void main() {float x0,x1,x,y0,y1,yy0,yy1,h,p; printf("输入x0,x1,x,y0,y1和yy0,yy1的取值"); scanf("%f%f%f%f%f%f%f",&x0,&x1,&x,&y0,&y1,&yy0,&yy1); h=x1-x0; p=y0*f0((x-x0)/h)+y1*f1((x-x0)/h)+h*yy0*g0((x- x0)/h)+h*yy1*g1((x-

数学实验“等距节点插值,Hermite插值,分段插值(线性,二次,三次)”实验报告(内含matlab程序)

西京学院数学软件实验任务书

实验十六实验报告 一、实验名称:等距节点插值,Hermite 插值,分段插值(线性,二次,三次)。 二、实验目的:进一步熟悉等距节点插值,Hermite 插值,分段插值(线性,二次,三次)。 三、实验要求:运用Matlab/C/C++/Java/Maple/Mathematica 等其中一种语言完成程序设计。 四、实验原理: 1.等距节点插值: 差分分为前向差分、后向差分和中心差分三种,它们的记法及定义如下所示: n 阶前向差分公式111()()()n n n i i i f x f x f x --+?=?-? n 阶后向差分公式111()()()n n n i i i f x f x f x ---?=?-? n 阶中心差分公式11112 2 ()()()n n n i i i f x f x f x δδδ--+-=- 其中:? -前向差分;? -后向差分;δ -中心差分。 假设000()()()()i i i i f x f x f x f x δ?=?==,为了方便计算,构造差分表(()i i f f x =)。 这里只说明前向牛顿插值,其多项式可表示为如下形式:

0()()N x N x th =+ 20000()()()()12n t t t f x f x f x f x n ?? ?? ?? =+?+?++? ? ? ??? ?? ?? 其中h 为步长,10h x x =-,且的取值范围为0t n ≤≤。 2.埃尔米特插值: 埃尔米特插值法满足在节点上等于给定函数值,而且在节点上的导数值也等于给定的导数值,对于有高阶导数的情况,埃尔米特插值多项式比较复杂,在实际应用中,常常遇到的是函数值与一阶导数值给定的情况,在这种情况下,n 个节点12,,n x x x 的埃尔米特插值多项式()H x 的表达形式如下所示: 1()[()(2)]n i i i i i i i H x h x x a y y y ==--+∑ 其中(),''()i i i i y y x y y x == 2 111 ( ),n n j i i j j i j i j j i j i x x h a x x x x ==≠≠-==--∑ ∏ 3.分段插值: 给定插值节点i x 、节点函数值i y 及对应的导数值 '(0,1,2,,)i y i N = ,则满足下面条件 (),'()'i i i i p x y p x y == 的分段埃尔米特插值函数()p x 的表达式如下所示:

相关文档
最新文档