教案三埃尔米特插值法和分段低次插值法
- 格式:pdf
- 大小:111.71 KB
- 文档页数:4
分段三次埃尔米特插值分段线性插值函数的导)(I x h 数是间断的,若在节点k x (k =0,1,…,n )上除已知函数值外还给k f 出导数值k k m f ='(k =0,1,…,n ),这样就可构造一个导数连续的分段插值函数)(I x h ,它满足条件:(1).[][]),(,)(I 11b a C b a C x h ∈代表区间一[]b a ,阶导数连续的函数集合. (2)k k h f x =)(I ,'')(I k k h f x -(k =0,1,…n ). (3))(I x h 在每个小区间上是三次[]1,+k k x x 多项式.由两点三次插值多项式可以知道在)(I x h 区间上表达[]1,+k k x x 式为'21111211211)()(21*)()21()()(I k k k k k k k k k k k k k k k k k k h f x x x x x x x x x x x x x x f x x x x x x x x x ---+--+--+--+--=++--++++)(+'1121)(+++---k k kk k f x x x x x x )(.分段三次埃尔米特插值比分段线性插值效果明显改善,但这种插值要求给出节点上的导数值,所要提供的信息太多,其光滑度也不高(只有一阶导数连续),改进这种以克服其缺点就导致三次样条插值的提出.三次样条插值上面讨论的分段插值函数都有一致收敛性,但光滑性比较差,对于像告诉飞机的机翼形线,船体放样等型值线往往要求有二阶光滑度,即有二阶连续导数.早起工程师制图是,把富有弹性的细长木条(所谓样条)用压铁固定在样点上,在其他地方让它自由的弯曲,然后画下长条的曲线,称为样条曲线.样条曲线实际上有分段三次曲线并接而成,在连接点即样点上要求二阶导数连续,从而数学上加以概括就得到数学样条这一概念.三次样条函数定义 若函数[]b a C x S ,)(2∈,并且在每个小区间上是[]1,+j j x x 三次多项式,其中是给定b x x x a n =<<<= 10节点,则称是节点)(x S 0x ,1x ,…,n x 上的三次样条函数.若在节点上j x 给定函数值)(j j x f y =(j =0,1,…,n ),并且成立j j y x S =)( (j =0,1,…,n ),(1.1) 则称为三次)(x S 样条插值函数.由定义知道要求出)(x S ,在每个小区间上要确定[]1,+j j x x 4个待定系数,一共有个小n 区间,所以应该确定4个参数n .根据在上二)(x S []b a ,阶导数的连续性,在节点j x (j =1,2,…,n -1)处应该满足连续性的条件)0()0(+=-j j x S x S ,)0()0(''+=-j j x S x S (1.2))0()0(''''+=-j j x S x S .一共有3n -3个条件,再加上要满)(x S 足插值条件(1.1),共有4n -2个条件,因此还需要2个条件才能确定)(x S .通常可以在区间[]b a ,端点0x a =,n x b =上各加上一个条件(称为边界条件),可根据实际问题要求给定.常见的有以下3种;(1)已知两端的一阶导数值,即'00')(f x S =,;')(n n f x S =. (1.3)(2)两端的二阶导数已知,即''00'')(f x S =,'''')(n n f x S =, (1.4)其特殊情况为0)()(''0''==n x S x S . (1.5)(3)当)(x f 是以n x -0x 为周期的周期函数时,则要求也是)(x S 周期函数.这时边界条件应满足)0()0(0-=+n x S x S ,)0()0('0'-=+n x S x S , )0()0(''0''-=+n x S x S . (1.6)而此时(1.1)中n y y =0.这样确定的样条函数称)(x S 为周期样条函数. 埃尔米特插值不少实际问题的插值问题不但要求在节点上函数值相等,而且还要求对应的导数值也相等,甚至要求高阶导数也相等,满足这种要求插值的多项式就是埃尔米特(Hermi t e )插值多项式.下面只讨论函数值与导数值个数一样的情况.设在节点上b x x x a n ≤<<<≤ 10,)(i i x f y =,)('j j x f m =(j =0,1,…,n ),要求插值多项式)(x H ,满足条件j j y x H =)(,j j m x H =)('(j =0,1,…,n ). (1.1)这里给出了2n +2个条件,可唯一确定一个次数不超过2n +1的多项式)()(12x H x H n =+,其形式为12121012)(++++++=n n n x a x a a x H .如果根据条件(1.1)来确定2n +2个系数0a ,1a ,…,12+n a ,显然非常复杂,因此,我们依旧采用拉格朗日插值多项式的基函数的方法.先求插值基函数)(x j α及)(x j β(j =0,1,…,n ),一共有2n +2个,每一个基函数都是2n +1次多项式,且满足条件⎪⎪⎭⎪⎪⎬⎫====⎩⎨⎧=≠==).,,1,0,()(,0)(;0)(,,1,,0)(''n k j x x x k j k j x jk k j k j k j jk k j δββαδα (1.2)于是满足条件(1.1)的插值多项式可以写成)()(12x H x H n +=用插值基函数表示的形式[]∑=-+=nj j j j j n x m x y x H 012)()()(βα. (1.3)由条件(1.2)可以知道,有k k n y x H =-)(12,kn m x H =+)('12,(k =0,1,…,n ).下面的问题就是求满足条件(1.2)的基函数以)(x j α及)(x j β.所以,我们可以利用拉格朗日插值基函数)(x l j .令)()()(2x l b ax x a j j +=,由条件(1.2)有1)()()(2=+=j j j j j x l b ax x α,[]0)()(2)()()(''=++=j j j j j j j j j x l b ax x al x l x α,整理得⎩⎨⎧=+=+0)(21'j j j x l a b ax . 解出)(2'j j x l a -=,)(21'j j j x l x b +=.由于)())(()()())(()()(110110n j j j j j j n j j j x x x x x x x x x x x x x x x x x l --------=+-+- ,利用两边取对数再求导数,有∑≠=-=njk k kj j jx x x l 0'1)(,所以有)()1)(21()(20x l x x x x x a j njk k kj j j ∑≠=---=. (1.4)同理,可以得到)()()(2x l x x x j j j -=β. (1.5)同时还证明满足条件(1.1)的插值多项式是唯一的.用反证法,假设及都满)(12x H n +)(12x H n +足条件(1.1),所以有)()()(1212x H x H x n n ++-=ϕ在每个节点上均有二重根,即)(x ϕ有2n +2重根.但是是不高)(x ϕ于2n +1次的多项式,所以0)(≡x ϕ.唯一性得到证明.。
《计算方法》课程设计报告学生姓名:张学阳学号: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编写分段线性插值函数,最后比较用不同节点数所得插值函数与真实函数的误差,从而得出节点数与插值效果的关系。
埃尔米特插值法1. 引言埃尔米特插值法是一种用于数据插值的数值方法。
它通过给定的数据点来构造一个多项式函数,该函数在这些数据点上与给定的函数具有相同的函数值和导数值。
埃尔米特插值法可以应用于各种领域,如数学、物理、计算机图形学等。
2. 插值问题在实际问题中,我们常常需要根据已知数据点来估计未知数据点的函数值。
这就是插值问题。
给定n个不同的数据点(x0,y0),(x1,y1),...,(x n,y n),我们希望找到一个多项式函数P(x),使得P(x i)=y i对所有i=0,1,...,n成立。
3. 埃尔米特插值多项式埃尔米特插值多项式是满足以下条件的多项式: - 在每个已知数据点上具有相同的函数值:P(x i)=y i - 在每个已知数据点上具有相同的导数值:P′(x i)=m i其中m i是给定的导数值。
为了构造埃尔米特插值多项式,我们需要利用这些条件来确定其系数。
4. 构造埃尔米特插值多项式埃尔米特插值多项式的一般形式为:P(x)=∑ℎini=0(x)⋅y i+∑g ini=0(x)⋅m i其中ℎi(x)和g i(x)是满足以下条件的基函数: - ℎi(x j)=δij,其中δij是克罗内克(Kronecker)符号,当i=j时取值为1,否则为0。
- g i(x j)=0对所有i,j成立。
基于这些条件,我们可以求解出基函数ℎi(x)和g i(x)的表达式,并将其代入埃尔米特插值多项式的公式中。
5. 插值误差估计在实际应用中,我们通常需要估计插值多项式的误差。
通过使用泰勒展开和拉格朗日余项定理,可以得到以下插值误差的估计公式:f(x)−P n(x)=f(n+1)(ξ)(n+1)!(x−x0)(x−x1)...(x−x n)其中f(n+1)(ξ)是函数f(x)在x0,x1,...,x n之间某个点ξ处的(n+1)阶导数。
6. 示例假设我们有以下数据点:(0,1),(1,2),(2,−1)。
我们希望通过这些数据点构造一个埃尔米特插值多项式。
数值分析实验六(分段三次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 CT estV iew class//#include "stdafx.h"#include "test.h"#include "testDoc.h"#include "testView.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////// //////////// CTestV iewIMPLEMENT_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 commandsON_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/destructionCTestView::CTestV iew(){// TODO: add construction code here}CTestView::~CT estView(){}BOOL CTestView::PreCreateWindow(CREA TESTRUCT& cs){// TODO: Modify the Window class or styles here by modifying // the CREA TESTRUCT csreturn CV iew::PreCreateWindow(cs);}/////////////////////////////////////////////////////////////////// //////////// CTestV iew drawingvoid CTestView::OnDraw(CDC* pDC){CTestDoc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// TODO: add draw code for native data hereint i,j,k;double x,y,p_x,p_y,l,xx[100],f[100],F[100],sum,p_sum;CPen MyPen,*OldPen;pDC->SetViewportOrg(400,400); //定义坐标原点for(i=-500;i<500;i++){pDC->SetPixel(0,i,RGB(0,0,0));pDC->SetPixel(i,0,RGB(0,0,0)); //画出坐标}pDC->TextOut(-210,5,"-1");pDC->TextOut(196,5,"1");//原函数MyPen.CreatePen(PS_SOLID,1,RGB(255,0,0));//定义画笔颜色OldPen=pDC->SelectObject(&MyPen);x=-1.0,y=1/(1+25*x*x);p_x=x*200;p_y=-y*200;pDC->MoveTo(p_x,p_y);for (x=-1.0;x<=1.0;x+=0.0001){y=1/(1+25*x*x);p_x=x*200;p_y=-y*200;pDC->LineT o(p_x,p_y);}pDC->SelectObject(OldPen);MyPen.DeleteObject();//分段三次Hermite插值MyPen.CreatePen(PS_SOLID,1,RGB(0,0,0)); OldPen=pDC->SelectObject(&MyPen); x=-1.0,y=1.0/(1+25*x*x);p_x=x*200;p_y=-y*200;pDC->MoveTo(p_x,p_y);x=-1.0;for(i=0;i<=10;i++){f[i]=1/(1+25*x*x);xx[i]=x;F[i]=-50*x/(1+25*x*x)/(1+25*x*x); //导数x+=0.2;}x=-1.0;for(j=0;j<=1000;j++){sum=0;for(i=0;i<=10;i++){if(x==xx[i]){sum=f[i];p_x=x*200,p_y=-sum*200;pDC->LineT o(p_x,p_y);break;}if(xxx[i]){y=(1+2*(x-xx[i])/(xx[i+1]-xx[i]))*(x-xx[i+1])*(x-xx[i+1])/(xx[i]-xx[i+1])/(xx[i]-xx[i+1]);sum+=f[i]*y;y=(1+2*(x-xx[i+1])/(xx[i]-xx[i+1]))*(x-xx[i])*(x-xx[i])/(xx[i+1]-xx[i])/(xx[i+1]-xx[i]);sum+=f[i+1]*y;y=(x-xx[i])*(x-xx[i+1])*(x-xx[i+1])/(xx[i]-xx[i+1])/(xx[i]-xx[i+1]);sum+=F[i]*y;y=(x-xx[i+1])*(x-xx[i])*(x-xx[i])/(xx[i+1]-xx[i])/(xx[i+1]-xx[i]);sum+=F[i+1]*y;p_x=x*200;p_y=-sum*200;pDC->LineT o(p_x,p_y);break;}}x+=0.002;}pDC->SelectObject(OldPen);MyPen.DeleteObject();/////////////////////////////////////////////////////////////////// //////////// CTestV iew printingBOOL CTestView::OnPreparePrinting(CPrintInfo* pInfo){// default preparationreturn DoPreparePrinting(pInfo);}void CTestView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add extra initialization before printing}void CTestView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add cleanup after printing}/////////////////////////////////////////////////////////////////// //////////// CTestV iew diagnostics#ifdef _DEBUGvoid CTestView::AssertV alid() const{CView::AssertV alid();}void CTestView::Dump(CDumpContext& dc) const{CView::Dump(dc);CTestDoc* CT estV iew::GetDocument() // non-debug version is inline{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CT estD oc)));return (CT estDoc*)m_pDocument;}#endif //_DEBUG/////////////////////////////////////////////////////////////////// //////////// CTestV iew message handlers三、运算结果截屏红色的曲线为原函数图像,黑色曲线为分段三次Hermite插值曲线四、算法分析上述图像中黑色的曲线为分段分段三次Hermite插值多项式所对应的图像,由图像可看出黑色的分段三次Hermited插值函数图像和拉格朗日、分段线性插值相比与红色被逼近函数的重合度最好,说明分段三次Hermite插值在函数的各节点两边插值函数的导数是相等的,保证了在各节点的平滑性,且不会出现Runge现象。