数值分析实验四Hermite插值法
课程设计---Hermite 插值法的程序设计及应用
课程设计说明书题目:Hermite 插值法的程序设计及应用学生姓名:学院:班级:指导教师:2012年 1月 5日摘要Hermite 插值是数值分析中的一个重要内容,在相同的节点下得到比拉格朗日插值更高次的插值多项式,而且,相应的曲线在部分节点处也更光滑.在我们所学课程中,只给出了当所有节点处一阶导数均已知时的Hermite 插值.但在实际应用中,并不是所有节点处的一阶导数都是已知的.为此,通过查阅文献、学习总结,给出了更具一般性的Hermite 插值公式.已有的Hermite 插值公式成为本文所得结果的一个特例.本次课程设计,对Hermite 插值法进行了总结,包括Hermit插值法的理论推导,不同情形下的例,以及在解决实际问题中的应用.同时也给出了Hermite插值公式的Matlab算法.关键词Hermite 插值;Matlab 实现;数值分析引言 (1)第一章 Hermite插值 (2)§1.1 Hermite插值的概念 (2)§1.2 Hermite插值简单情形 (3)§1.2.1简单情形解的存在性 (3)§1.2.2 简单情形解的存在唯一性 (5)§1.2.3插值余项 (5)§1.3 Hermite插值其他情形................................ . (5)第二章 Hermite插值的Matlab实现 (9)§2.1 导数完全情形Hermite插值的Matlab实现................... ..9 §2.2导数不完全情形Hermite插值的Matlab实现.. (10)§2.3 Hermite插值在实际问题中的应用 (13)参考文献 (15)附录A (16)附录B (17)附录C (19)在实际工作中, 人们得到的一些数据通常是一些不连续的点, 在土木工程、流体力学、经济学和空气动力学等学科中经常要遇到这样的问题. 此时, 这些数据如果不加以处理, 就难以发现其内在的规律性. 如果用户想得到这些分散点外的其他数值, 就必须运用这些已知的点进行插值.因此,对近似公式的构造产生了插值问题.在实际问题中,两个变量的关系)(x f y =经常要靠实验和观测来获得,而在通常的情况下只能得到)(x f 在有限个点上的值.,,1,0),(n i x f y i ==人们希望找到)(x f 的一个近似函数)(x y φ=,使得i i y x =)(φ,.,,1,0n i = ○1 此时,)(x f 称为被插值函数,点n i x x x ,,,0 称为插值结点,)(x φ称为插值函数,○1为插值条件. 常用的插值法有Lagrange 插值、Newton 插值、最近邻插值、Hermite 插值和三次样条插值插值法等. Lagrange 插值在向量X 区域内的插值较准确, 但向量X 区域之外则不太准确.Newton 插值仅适用于等距节点下的牛顿向前(后) 插值. 最近邻插值是最简便的插值, 在这种算法中, 每一个插值输出像素的值就是在输入图像中与其最临近的采样点的值, 当图像中包含像素之间灰度级变化的细微结构时, 最近邻插值法会在图像中产生人工的痕迹. 最近邻插值的特点是简单、快速, 缺点是误差较大; 三次样条插值一阶和二阶连续可导, 插值曲线光滑, 插值效果比较好, 应用较广Newton 插值和Lagrange 插值虽然构造比较简单,但都存在插值曲线在节点处有尖点、不光滑、插值多项式在节点处不可导等缺点.为了保证插值多项式)(x p n 能更好地逼近)(x f , 对)(x p n 增加一些约束条件, 例如要求)(x p n 在某些结点处与)(x f 的微商相等, 这样就产生了切触插值问题.切触插值即为Hermite 插值.它与被插函数一般有更高的密合度.本课程设计主要对Hermite 插值法进行总结,对其一般情况,特殊情况进行更进一步的学习,尽量实现其在Matlab 及C++上的程序运行.第一章 Hermite 插值实际问题中应用较广为Newton 插值和Lagrange 插值,虽然这辆种插值法构造比较简单, 但都存在插值曲线在节点处有尖点、不光滑、插值多项式在节点处不可导等缺点.为了克这些缺点,我们引入了Hermite 插值.§1.1 Hermite 插值的概念定义1.1 许多实际插值问题中,为使插值函数能更好地和原来的函数重合,不但要求二者在节点上函数值相等,而且还要求相切,对应的导数值也相等,甚至要求高阶导数也相等.这类插值称作切触插值,或埃尔米特(Hermite)插值.该定义给出了Hermite 插值的概念,由此得出Hermite 插值的几何意义,如图1.1.定义1.2 满足上述要求的插值多项式是埃尔米特插值多项式.记为H (x ). 定义1.3 求一个次数不大于1++r n 的代数多项式 H(x) ,满足:).(,,2,1),()(.,,2,1),()(n r r i x f x H n i x f x H i i i i ≤='='== (1-1) 则(1-1)为Hermite 插值条件.定义1.4 令 ),(22y x ),(33y x ),(44y x),(11y x),(00y x xy图1.1 Hermite 插值多项式的几何意义含义.)()()()()(00∑∑=='+=rk k k n k k k x f x x f x x H βα (1-2)其中,),,1,0)(x (),,1,0)((k n k n k x k ==βα和都是1++r n 次待定多项式并且它们满足如下条件:⎩⎨⎧=01)(i k x α k i k i ≠= .,,1,0,n k i = .,,1,0,,,1,0,0)('r i n k x i k ===α⎩⎨⎧='01)(i k x β k i k i ≠= .,,1,0,r k i = .,,1,0,,,1,0,0)(n i r k x i k ===β称(1-2)为Hermite 插值公式.解决Hermite 插值问题,就是在给定结点处函数值与导数值的基础上根据插值公式构造Hermite 插值多项式,并根据已知条件解出多项式系数.§1.2 Hermite 插值简单情形已知函数表: x0x 1x 2x … m x … n x )(x f0y 1y 2y … m y … n y )(x f ' 0'y 1'y 2'y … m y ' … n y '求一个插值多项式,使其满足条件数表.由于数表中包含22+n 个条件,所以能够确定次数不大于12+n 的代数多项式 )(12x H n +.此情形为导数个数与函数值个数相等的情形,即 Hermite 插值问题的最简单也是最常用情形.1.2.1简单情形解的存在性由于Hermite 插值公式(1-2)已给出,接下来只需构造出)(x k α及)(x k β,即认为其存在.在此简介Lagrange-Hermite 插值法构造插值多项式.Step1 构造)(x k α(n k ,,1,0 =)由条件)(0)(')(k i x x i k i k ≠==αα知),,,1,0(k i r i x i ≠= 是)(x k α的二重零点.已知Lagrange 插值基函数)(x l k 是n 次多项式,且具有性质⎩⎨⎧=≠==i k i k x l ki i k ,1,0)(δ, 则2n 次多项式[]2)(x k k 也具有性质[]ki i k x l δ=2)(,而[]2)(x l k 的一阶导数在)(k i x i ≠处的值[]()0)()(2)(2='='i k i k i k x l x l x l 所以当k i ≠时,i x 也都是[]2)(x k k的两重零点.注意到)(x h k 是12+n 次多项式,而[]2)(x l k 是n 2次多项式,因此可设),,2,1,0)(()()(2n k x l b ax x k k =+=α其中b a ,为待定常数.显然k i ≠时满足0)(')(==i k i k x x αα,现只要求出b a ,满足k i =时,满足0)(',1)(==k k k k x x αα即可.由此得到确定b a ,的两个方程:)(2)())(()(2)(1)()()()(22=+'=++'='=+=+=a x l x al b ax x l x l x b ax x l b ax x k k k k k k k k k k k k k k k k k αα解出 k k kk k x x l b x l a ⋅'+='-=)(21)(2 于是[])())((21)(2x l x x x l x k k k kk -'-=α. Step2 构造)(x k β ),,1,0(n k =由条件)(0)(')(k i x x i k i k ≠==ββ知),,,1,0(k i r i x i ≠= 是)(x k β的二重零点.因此可设)(x k β也含因子)(2x l k ,又0)(=k k x β,所以)(x k β还含有因式)(k x x -,因此设)()()(2x l x x A x k k k -=β,其中A 为待定常数.显然)(x k β是12+n 次多项式,且当k i ≠时满足0)(')(==i k i k x x αα,由,1)(='k kx β可确定A 如下: 1)()(2)()()(2=='⋅⋅-+='A x l x l x x A x Al x k kk k k k k k k β所以 )()()(2x l x x x k k k -=β.到此为止,Hermite 插值问题的解)(12x H n +为[],)()()())((21)(2020k k nk k k kn k k k k f x l x x f x l x x x l x H '-+-'-=∑∑== 特别地,当=n 1时,满足113003113003)(,)(,)(,)(y x H y x H y x H y x H '=''='==的三阶Hermite 插值多项式为+⎪⎪⎭⎫ ⎝⎛--⎥⎦⎤⎢⎣⎡'-+⎪⎪⎭⎫ ⎝⎛--+=21010000103)(21)(x x x x y x x y x x x x x H 2010111101)(21⎪⎪⎭⎫ ⎝⎛--⎥⎦⎤⎢⎣⎡'-+⎪⎪⎭⎫ ⎝⎛--+x x x x y x x y x x x x .§1.2.2 简单情形解的存在唯一性为了简便理解,下面用流程图来说明解的存在唯一性.详见附录A.§1.2.3 插值余项定理 1.1 设)(x f 在包含1+n 个插值结点的最小区间[b a ,]上22+n 次连续可微,则存在与x 有关的ξ,b a <<ξ,使得),()!22()()()(222x w n f x H x f n +=-+ξ 其中∏=-=n0j )()(j x x x w .由此可得到三阶Hermite 插值多项式的误差为:,)()(!4)()()()(212043x x x x f x H x f x R --=-=ξ ξ在0x 与1x 之间.§1.3 Hermite 插值其他情形已知函数表:x 0x1x … m x … n x y0y 1y … m y … n yy ' 0y ' 1y ' … m y '求一个插值多项式,使其满足条件数表.该问题中,导数个数与函数值个数不相等.我们称之为Hermite 插值中其他情形.在此简介Newton-Hermite 插值法构造插值多项式.先分析插值条件的个数:2++m n 个,那么,所构造的多项式的次数一般不能超1++m n .于是,按牛顿差值的思想,可设);())(()(),()()()(1011n n n m n x x x x x x x x x P x N x H ---=+=++ ωω其中,)(x N n 为n 次牛顿差值多项式;)(x P m 为待定的次数不超过m 次的多项式. 显然:n i x f x N x H i i n i ,,2,1,0),()()( ===为确定)(x P m ,对)(x H 求导:)()()()()()(11x x P x x P x N x H n m n m n++'+'+'='ωω 根据插值条件)()(i i x f x H '=',有)()()()()()()()()(111i n i m i ni n i m i n i m i n i x x P x N x x P x x P x N x H +++'+'='+'+'='ωωω 得到m i x x N x f x P i ni n i i m ,,2,1,0,)()()()(1 =''-'=+ω 于是,把求)(x P m 的问题转化为又一个插值问题已知)(x P m 的函数表 x1x 2x … m x )(x P m )(1x P m )(2x P m … )(m m x P确定一个次数不超过m 的插值多项式)(x L m ,使其满足)()(i m i m x P x L =. 根据牛顿差值公式.)())(](,,[)](,[)()(10000100----++-+=m m m m m m x x x x x x x x P x x x x P x P x P将上式带回,即得到满足条件;,,2,1,0),()(;,,2,1,0),()(m k x f x H n k x f x H k k k k ='='==的Newton-Hermite 插值多项式.例1.1 已知函数表: x 0x1x y 0y1y y ' 0'y求一个插值多项式H (x ),使其满足条件:),()(),()(),()(001100x f x H x f x H x f x H '='==该问题中,导数个数与函数值个数不相等.我们称之为Hermite 插值中其他情形.在此简介Newton-Hermite 插值法构造插值多项式.先由函数表xx 0 x 1 yy 0 y 1作线性插值,即为 []()01001,)()(x x x x f x f x P -+= 再注意到H (x )与P 1 (x )在节点x 0, x 1上函数值相同,即:11110010)()()()(y x P x H y x P x H ====于是,它们的差可以设为 ))(()()(101x x x x K x P x H --=-其中K 为待定常数,上式又可记为:))(()()(101x x x x K x P x H --+= (1-3)为确定K ,对上式求导:)()()(101x x x x K x P x H -+-+'='令x = x 0,代入上式,并且注意到插值条件00)(y x H '='得: []010*******)(,)()()(y x x K x x f x x K x P x H '=-+=-+'='于是有[]01010x x y x x f K -'--=将上式代入(1-3)得[]))(()()(10010101x x x x x x y x x f x P x H ---'--+=[][]))(()(,)(10010100100x x x x x x y x x f x x x x f x f ---'--+-+= (1-4)可以验证(1-4)所确定的H (x )确实满足插值条件(1-1).同时也可以看到,构造牛顿——埃米尔特插值多项式,完全采用牛顿插值的构造思想.最后,也可以把(1-4)式整理成拉格朗日形式:1001112010001101010)()(y x x xx x x y xx x x y xx x x x x x x x x x H '-⎪⎪⎭⎫ ⎝⎛--+⎪⎪⎭⎫ ⎝⎛--+⎪⎪⎭⎫ ⎝⎛----+-=插值余项为()()120)3(2!3)()(x x x x f X R --=ξ, ξ在0x 与1x 之间.第二章 Hermite 插值的Matlab 实现§2.1 导数完全情形Hermite 插值的Matlab 实现在实际应用中,应用最广也是最简单的Hermite 插值情形即为导数完全的情况下,Hermite 插值多项式的拟合.我们首先讨论该情形下的Matlab 程序.在给出程序之前,我们首先给出该公式所应用的Hermite 插值公式. 定理2.1 设在节点b x x x a n ≤<<≤≤ 21上,,)(,)(j j j j y x f y x f '='=,其中n j ≤≤1,则函数)(x f 在结点处n x x x ,,,21 处的Hermite 插值多项式为∑=+--=ni i i i i i i y y y a x x h x y 1])2)([()(其中 ∑∏≠=≠=-=--=nij j ji i nij j ji j i x x a x x x x h 1211;)(.该定理的证明详见文献.该情形下对应的Matlab 程序及流程图详见附录B . 为验证该程序的正确性与有效性,下面给出例2.1. 例2.1 设有如下数据表:x0 0.5 1 1.5 2 2.5 3 3.5)sin(x y = 0 0.4794 0.8145 0.9975 0.9093 0.5985 0.1411 -0.3508 )cos(x y =' 1 0.8776 0.5403 0.0707 -0.4161 -0.8011 -0.9900 -0.9365在Matlab 工作台输入如下命令:>> x0=[0,0.5,1,1.5,2,2.5,3,3.5];y0=[0,0.4794,0.8415,0.9975,0.9093,0.5985,0.1411,- 0.3508]; y1=[1,0.8776,0.5403,0.0707,-0.4161,-0.8011,-0.9900,-0.9365]; x=x0;y=hermite(x0,y0,y1,x); yplot(x,y) y2=sin(x); hold onplot(x,y2,'*r') 则输出结点处的插值:y =0 0.4794 0.8415 0.9975 0.9093 0.5985 0.1411 -0.3508)sin(x y =的Hermite 插值多项式的拟合图像如图:§2.2导数不完全情形Hermite 插值的Matlab 实现在实际应用中,并不是所有节点处的一阶导数都是已知的,为此,我们给出了更具一般性的Hermite 插值公式及其算法实现,已有的Hermite 插值公式成为本文所得结果的一个特例.在此首先给出求解Hermite 插值问题的一般性公式。
数值分析Hermite
由(2.3)可设
0 x x x1 a x x0 b ,
2
再由(2.2)可求得
b 1
x1 x0
2
, a
2
x1 x0
பைடு நூலகம்
3
x x1 x x0 0 x 1 2 x1 x0 x0 x1
4!
3. 2n+1 次Hermite 插值多项式
给定n+1个节点和相应的函数值和导数值:
f xi yi , yi f xi mi , i 0,1,, n
则可构造2n+1 次Hermite 插值多项式H x 满足条件:
H 1) x 是不超过2n+1 次多项式; H 2) xi yi , H xi mi , i 0,1,, n
2
2
f , x0 , x1 4!
4
于是有下述定理
定理:设 H3 x 是以 x0 , x1 为插值节点的三次 f x C 3 a, b , f 4 x 在 a, b Hermite 插值多项式, 内存在,其中 a, b 是包含 x0 , x1 的任一区 间,则对任意给定的 x a, b ,总存在依赖 于 x 的点 a, b ,使 4 f 2 2 R3 x f x H 3 x x x0 x x1 .
Hermite插值方法
数值分析实验报告五一、实验目的理解Hermite插值方法,掌握Hermite插值算法设计二、实验内容使用vc++编程,实现该方法,即Hermite插值法三、实验步骤#include <iostream.h>double herm(double x0,double x1,double y0,double y1,double h0,double g0,double g1,double x) {double alp0,alp1,bta0,bta1,t;double s;t=h0*h0;alp0=(x-x1)*(x-x1)*(h0+2*(x-x0))/t/h0;alp1=(x-x0)*(x-x0)*(h0-2*(x-x1))/t/h0;bta0=(x-x0)*(x-x1)*(x-x1)/t;bta1=(x-x1)*(x-x0)*(x-x0)/t;s=y0*alp0+y1*alp1+g0*bta0+g1*bta1;return(s);}void main(){int n=7;double p0;double pn; double aa[8],bb[8],s=0;double xx[8]={0.5,0.7,0.9,1.1,1.3,1.5,1.7,1.9};double yy[8]={0.4794,0.6442,0.7833,0.8912,0.9636,0.9975,0.9917,0.9463};double g[8];int i;double a[8],c[8],h[8];cout<<"Please input p0 and pn"<<endl;cin>>p0;cin>>pn;for(i=0;i<=n-1;i++){h[i]=xx[i+1]-xx[i];cout<<"h["<<i<<"]="<<h[i]<<endl;}c[0]=1;g[0]=3*(yy[1]-yy[0])/h[0]-p0*h[0]/2;for( i=1;i<=n-1;i++){a[i]=h[i]/(h[i]+h[i-1]);c[i]=1-a[i];}for(i=1;i<n;i++){cout<<"a["<<i<<"]="<<a[i]<<endl;cout<<"c["<<i<<"]="<<c[i]<<endl;}for( i=1;i<=n-1;i++){g[i]=3*(c[i]*(yy[i+1]-yy[i])/h[i]+a[i]*(yy[i]-yy[i-1])/h[i-1]);}a[n]=1;g[n]=3*(yy[n]-yy[n-1])/h[n-1]+pn*h[n-1]/2;for(i=0;i<=n;i++)cout<<"g["<<i<<"]="<<g[i]<<endl;aa[0]=2;bb[0]=c[0]/aa[0];g[0]=g[0]/aa[0];for(i=1;i<=n-1;i++){aa[i]=2-a[i]*bb[i-1];bb[i]=c[i]/aa[i];g[i]=(g[i]-a[i]*g[i-1])/aa[i];}aa[n]=2-a[n]*bb[n-1];g[n]=(g[n]-a[n]*g[n-1])/aa[n];for(i=n-1;i>=0;i--){g[i]=g[i]-bb[i]*g[i+1];}cout<<endl;for(i=0;i<=n;i++)cout<<"g["<<i<<"]="<<g[i]<<endl;double ss;double c0,c1,d0,d1,g0,g1,h1;double x0;cout<<"Please input interpolation point x0:"<<endl;cin>>x0;if(x0>=0.5 && x0<0.7){c0=xx[0];c1=xx[1];d0=yy[0];d1=yy[1];h1=h[0];g0=g[0];g1=g[1];ss=herm(c0,c1,d0,d1,h1,g0,g1,x0);cout<<ss<<endl;}else if(x0>=0.7 && x0<0.9){c0=xx[1];c1=xx[2];d0=yy[1];d1=yy[2];h1=h[1];g0=g[1];g1=g[2];ss=herm(c0,c1,d0,d1,h1,g0,g1,x0);cout<<ss<<endl;}else if(x0>=0.9 && x0<=1.1){c0=xx[2];c1=xx[3];d0=yy[2];d1=yy[3];h1=h[2];g0=g[2];g1=g[3];ss=herm(c0,c1,d0,d1,h1,g0,g1,x0);cout<<ss<<endl;}else if(x0>=1.1 && x0<=1.3){c0=xx[3];c1=xx[4];d0=yy[3];d1=yy[4];h1=h[3];g0=g[3];g1=g[4];ss=herm(c0,c1,d0,d1,h1,g0,g1,x0);cout<<ss<<endl;}else if(x0>=1.3 && x0<=1.5){c0=xx[4];c1=xx[5];d0=yy[4];d1=yy[5];h1=h[4];g0=g[4];g1=g[5];ss=herm(c0,c1,d0,d1,h1,g0,g1,x0);cout<<ss<<endl;}else if(x0>=1.5 && x0<=1.7){c0=xx[5];c1=xx[6];d0=yy[5];d1=yy[6];h1=h[5];g0=g[5];g1=g[6];ss=herm(c0,c1,d0,d1,h1,g0,g1,x0);cout<<ss<<endl;}else if(x0>=1.7 && x0<=1.9){c0=xx[6];c1=xx[7];d0=yy[6];d1=yy[7];h1=h[6];g0=g[6];g1=g[7];ss=herm(c0,c1,d0,d1,h1,g0,g1,x0);cout<<ss<<endl;}elsecout<<"The data error,please input again!"<<endl;}四、运行结果。
ch2-4Hermite插值
则Hermite插值多项式为:
H ( x ) hi ( x ) yi H i ( x ) y'i
i 0
n
Hermite插值多项式的构造
hi ( x )在x j ( j i )处的函数值与导数值均 为0,
故可设 : hi ( x ) [a b( x xi )] [l i ( x )]2
这里li(x)为拉格朗日插值基函数
把 hi ( xi ) 1 h'i ( xi ) 0 (i 0,1,, n) 代入得
hi ( xi ) b l ( xi ) 2[a b( x xi )]l i ( xi )l i ( xi ) a 1; b 2al i ( xi ) 0
2. Hermite插值的基本定理;
3. Hermite插值多项式的构造 4.分段三次Hermite插值; 5.一般插值问题。
对x x1 1有:h0 (1) 0, h1 (1) 1, H 0 (1) 0,
(0) 0可设 由条件h0 (0) 1, h0 (1) 0, h0 h0 ( x ) (ax b)( x 1)
(0) 0, 得b a 1 利用h0 (0) 1, h0 所以h0 ( x ) ( x 1)( x 1) 1 x
( x i ) y i ( i 0,1,2,...n) '( xi ) y
' i
( i 0,1,2,...n)
保持插值曲线在节点处有切线(光滑), 使插值函数和被插函数的密和程度更好 。
二、 Hermite插值问题的提法
设函数f(x) 在区间[ a, b] 上有 n+1个互异节点 a=x0<x1<x2<……<xn=b , 定义在[a,b]上函数f(x) 在节点上满足: f(xi) = yi, f ' (xi)=y ' i, i=0,1,2……n 求一个次数不高于2n+1次的插值多项式H(x)
Hermite_插值法
, x0]
lim
xi x0
f [x0, x1,
,
xn ]
1 n!
f
(n) ( x0 )
重节点Newton插值
在 Newton 插值公式中,令 xi x0 , i = 1, … , n, 则
Nn( x) f ( x0 ) f [ x0 , x1]( x x0 )
f ( x0 ) f '( x0 )( x x0 )
( x1 x0 )( x1 x2 )
三点三次Hermite 插值
余项公式
由于 x0 , x1 , x2 是 R(x) 的零点,且 x1 是二重零点,故可设 R( x) f ( x) P( x) k( x)( x x0 )( x x1 )2 ( x x2 )
与 Lagrange 插值余项公式的推导过程类似,可得
x
x0
)
x x0
x1 x1
2
1(
x)
(
x
x1
)
x x1
x0 x0
两点三次Hermite 插值
满足插值条件
P(x0) = f(x0) = y0,P’(x0) = f’(x0) = m0 P(x1) = f(x1) = y1,P’(x1) = f’(x1) = m1
的三次 Hermite 插值多项式为
三点三次Hermite 插值
三点三次 Hermite 插值
插值节点:x0 , x1 , x2
插值条件:P(xi) = f(xi),i = 0, 1, 2,P’(x1) = f’(x1) 设 P( x) f ( x0 ) f [x0, x1]( x x0 )
f [ x0, x1, x2]( x x0 )( x x1) A( x x0 )( x x1 )( x x2 ) 将 P’(x1) = f’(x1) 代入可得 A f '( x1 ) f [ x0 , x1] f [ x0, x1, x2]( x1 x0 )
埃尔米特(Hermite)插值
实验二埃尔米特(Hermite)插值一、实验目的:1.掌握埃尔米特插值算法原理;2.使用C语言编程实现埃尔米特插值算法。
二、实验准备:阅读《数值分析》2.4节二、实验要求:某人从甲地开车去乙地,每隔一段时间对行车距离和速率进行一次采样,得到在n+1 个采样时刻点t i 的里程s i和速率v i(i=0, 1, ..., n)。
要求编程构造埃尔米特插值多项式H2n+1(t),满足H2n+1(t i)=s i,H'2n+1(t i)=v i,对所有i=0, 1, ..., n成立,并据此计算m个给定时刻的里程和速率。
函数接口定义:void Hermite_Interpolation( int N, double t[], double s[], double v[], int m, double ht[], double hs[], double hv[] );其中N为采样点个数(注意这个N不是公式中的最大下标n,而是等于n+1),采样时刻点t i、里程s i、速率v i分别通过t、s、v传入;m是需要估算的给定时刻的个数,ht传入给定的时刻点,相应计算出的里程和速率应分别存储在hs和hv中。
裁判程序如下:裁判输入数据:20.0 1.00.0 1.00.0 0.050.0 0.2 0.5 0.8 1.030.0 0.5 1.0100.0 170.0 200.030.0 150.0 0.050.0 0.25 0.5 0.75 1.050.0 1.0 2.0 3.0 4.00.0 60.0 160.0 260.0 300.05.0 70.0 100.0 120.0 20.0100.5 1.0 1.5 2.0 2.5 3.0 3.5 3.8 3.95 4.0标准输出数据:0.0000 0.1040 0.5000 0.8960 1.00000.0000 0.9600 1.5000 0.9600 0.0000100.0000 127.9297 170.0000 195.9766 200.000030.0000 165.4688 150.0000 52.9688 0.000030.2222 60.0000 105.9303 160.0000 206.3438 260.0000 307.9764 305.7687 299.9796 300.000062.6024 70.0000 109.0488 100.0000 92.9745 120.0000 41.2374 -44.8421 -16.2783 20.0000#include<stdio.h>#define MAXN 5 /* 最大采样点个数 */#define MAXM 10 /* 最大估算点个数 */void Hermite_Interpolation( int N, double t[], double s[], double v[], int m, double ht[], double hs[], double hv[] ){double l[10],p[10],h1[10],h2[10],x,ll[10],pp[10];int kk;for(kk=0;kk<m;kk++){x=ht[kk];hs[kk]=0;hv[kk]=0;int i;for(i=0;i<N;i++){l[i]=1;ll[i]=1;int j;for(j=0;j<N;j++){if(i!=j){l[i]=l[i]*(x-t[j])/(t[i]-t[j]);}}p[i]=0;pp[i]=0;int k;for(k=0;k<N;k++){if(i!=k){p[i]=p[i]+l[i]/(x-t[k]);pp[i]=pp[i]+ll[i]/(t[i]-t[k]);}}h1[i]=(1-2*pp[i]*(x-t[i]))*l[i]*l[i];h2[i]=(x-t[i])*l[i]*l[i];hs[kk]=hs[kk]+s[i]*h1[i]+v[i]*h2[i];int kkk;for(kkk=0;kkk<N;kkk++){if(x==t[kkk])break;}if(x==t[kkk])hv[kk]=v[kkk];elsehv[kk]=hv[kk]+s[i]*(2*p[i]*l[i]-4*l[i]*p[i]*(x-t[i])*pp[i]-2*pp[i]*l[ i]*l[i])+v[i]*(l[i]*l[i]+2*l[i]*p[i]*(x-t[i]));}}}int main(){int N, m;double t[MAXN], s[MAXN], v[MAXN]; /* 用于构造的数据 */double ht[MAXM], hs[MAXM], hv[MAXM]; /* 用估算的数据 */int i;while ( scanf("%d", &N) != EOF ) {for ( i=0; i<N; i++ )scanf("%lf", &t[i]);for ( i=0; i<N; i++ )scanf("%lf", &s[i]);for ( i=0; i<N; i++ )scanf("%lf", &v[i]);scanf("%d", &m);for ( i=0; i<m; i++ )scanf("%lf", &ht[i]);Hermite_Interpolation( N, t, s, v, m, ht, hs, hv );for ( i=0; i<m; i++ )printf("%.4lf ", hs[i]);printf("\n");for ( i=0; i<m; i++ )printf("%.4lf ", hv[i]);printf("\n\n");}return 0; }。
艾米特插值
若 αi ( x ) , βi ( x )( i = 0,1) ,满足
αi (x j ) = δi j
1 i = j = , , α i′( x j ) = 0 0 i ≠ j (i = 0 , 1)
β i ( x j ) = 0 , β i′( x j ) = ( x ) = ( − 2 l ( x j ) x + 1 + 2 x l ( x j )) l ( x )
' j ' j j 2 j
= (1 − 2 ( x − x j ) l ( x j )) l ( x )
' j 2 j
其中 l ( x j ) ∑ =
' j
n
k =0 k≠ j
由于
′ α 0 ( x 0 ) = 1, α 0 ( x 0 ) = 0 2.2 (2.6.2) ′ α 0 ( x1 ) = 0, α 0 ( x1 ) = 0 , (2.6.3) 2.3
由(2.6.3)可设
α0 ( x) = ( x − x1 ) a ( x − x0 ) + b ,
2.4 埃尔米特(Hermite)插值
• Hermite插值问题的提出 • 三次 Hermite 插值 • 2n+1 次Hermite 插值多项式 • Hermite插值余项 • 数值实例
一、 Hermite插值问题的提出
由于理论与实践的需要,在构造插值函数 时,不但要求在节点上函数值相等,而且还要求 它的(高阶)导数值也相等(即要求在节点上具 有一定的光滑度),使得插值函数与被插函数贴 近程度更好,满足这种要求的插值多项式就是 Hermite 插值多项式,有时也称为具有重节点插 值。
2
再由(2.6.2)可求得
实验四 Hermite插值多项式
实验四 Hermite 插值多项式1实习目的(1) 加深对Hermite 插值多项式的理解(2) 熟练掌握C 语言程序设计知识,熟练编写程序。
2班级:计算092,姓名:薛藏朋,学号:30908110723目的意义融会贯通Hermite 插值多项式,熟练编写有关程序,深化C 语言程序设计知识,培养坚韧的毅力。
4数学建模H i (x )=+--+--1321))]((2[i i i i i y h x x x x h +--+-i ii i i y h x x x x h 321))]((2[ 221))((i i i h x x x x ---y '1-i +'221)()(i ii i y h x x x x --- 5算法Step1:'),i=0,1,…,n;Step2:Step3:Step4:6(1(2)程序#include <stdio.h>#define N 50struct POINT /*定义一个点结构体*/{ double x;double y;double z;};void main(){int i,n;double x;struct POINT ps[N];/*定义一个点结构体的数组*/printf("please input n,0<=n<=50: \n");scanf("%d",&n);printf("please input xi,yi,yi'(z): \n");for(i=0;i<n;i++){ scanf("%lf,%lf,%lf",&ps[i].x,&ps[i].y,&ps[i].z);}printf("Now input x: \n");scanf("%lf",&x);/*输入差值x*/printf("please input i:\n");scanf("%d",&i);double hi,mi,ni,H;hi=ps[i].x-ps[i-1].x;mi=x-ps[i-1].x;ni=x-ps[i].x;H=(hi+2*mi)*ni*mi*ps[i-1].y/hi/hi/hi+(hi-2*ni)*mi*mi*ps[i].y/hi/hi/hi+mi*ni*ni*ps[i-1].z/hi/hi+mi*ni*ni*ps[i].z/hi/hi; printf("H%d(%lf)=%lf\n",i,x,H);}7数值算例8对计算结果进行分析评价实验结果在误差范围内,比较准确9参考文献【1】张毅坤,曹锰,张亚玲,C语言程序设计教程,西安交通大学出版社,2003. 【2】姚全珠,李薇,王晓帆,C++面向对象程序设计,北京:电子工业出版社,2010. 【3】秦新强,数值逼近,西安理工大学【4】王萼芳,石声明,高等代数,北京:高等教育出版社。
Hermite插值多项式
( xi1
4
xi )2
因此
|
Ri ( x) |
(
x i
+1
8
xi )2
max |
xi x xi1
f ( x) |
于是在[a,b]上,| R( x) ||
f
( x)
L1( x) |
h2 8
M2
优点:计算简单; 适用于光滑性要求不高的插值问题。
缺点:分段插值函数只能保证连续性, 失去了原函数的光滑性。
(1) L1(x) 在每个子区间[xi , xi+1](i=0,1,2,,n-1)上是
线性插值多项式;
(2) L1(xi ) yi , i=0,1,2,…,n (3) L1(x) 在区间[a , b]上连续; 则称 L1(x)是f(x)在[a ,b]上的分段线性插值函数。
2.分段线性插值函数的表达式
2
两点三次Hermit插值(续1)
5
直接设 H3 (x) ax3 bx2 cx d
待定系数法求出,但不易推广到高次。
3
基函数法:
令H3(x) y00 (x) y11(x) y00 (x) y11(x)
为使H3(x)是一个次数3的多项式且满足插值条件
H3 (xi ) yi , H3(xi ) yi i 0,1
并在每个 xi , xi子1区间上构造插值多项式,然后把 它们装配在一起,作为整个区间 上a,的b插值函数。
二、分段线性插值
1.问题的提法
定义 设f(x)是定义在[a,b]上的函数,在节点 a= x0< x1<x2<…<xn-1<xn=b,
的函数值为 y0 , y1 ,y2 ,…yn-1 ,yn ,若函数 L1(x)满足条件
hermite三点插指公式的插值基法
hermite三点插指公式的插值基法hermite三点插入法的插值基法概述Hermite三点插入法是一种常用的插值方法,它使用三点来构造插值变换,这三点的x坐标满足X_0 <= X_1 < X_2,插值变换的控制点是(X_0,Y_0)、(X_1,Y_1)和(X_2,Y_2),而且这三点之间的平均斜率值也是已知的。
根据这三点的信息,可以构造出插值变换的具体形式,从而可以用于插值计算。
原理Hermite三点插入法实际上是基于Hermite多项式插值的,要构造出插值变换的具体形式,需要同时考虑到给定的两个控制点和满足Hermite多项式条件的两个切线斜率,具体构造的步骤如下:1)首先,建立插值函数:F(x)=a_0+a_1(x-x_0)+a_2(x-x_0)(x-x_1)+a_3(x-x_0)(x-x_1)(x-x _2)2)确定a_0,a_1,a_2,a_3的值,这是满足Hermite多项式条件的比较核心的步骤,有4个未知量,3个方程:F(x_0)=y_0 , F(x_1)=y_1 , F(x_2)=y_2另外两个方程是:F'(x_0)=(y_1-y_0)/(x_1-x_0) ,F'(x_2)=(y_2-y_1)/(x_2-x_1)3)使用求解某个系数的公式进行求解,求得四个系数:a_0=y_0a_1=(y_1-y_0)/(x_1-x_0)-(x_2-x_0)(y_2-y_0)/(x_2-x_1)(x_1-x_ 0)a_2=(x_2-x_1)(y_2-y_0)/(x_2-x_1)(x_1-x_0)a_3=(x_2-x_1)(x_2-x_0)(y_2-y_1)/(x_2-x_1)(x_1-x_0) 应用Hermite三点插入法可以用于插值计算,在计算机图形学中它也是一种常用的绘图方法。
一般来说,它可以用于函数图像的渲染、曲线的插值、多维函数的插值等方面。
它可以提高函数图像的平滑度,使图像看起来更加美观,还可以减少绘图的复杂度,在某些情况下可以提高绘图效率。
数值分析实验报告Hermite插值法、Runge现象,比较Language插值、分段线性插值、分段三次Hermie插值
山东师范大学数学科学学院实验报告x 0.1 0.5 1 1.5 2 2.5 3y 0.95 0.84 0.86 1.06 1.5 0.72 1.9y' 1 1.5 2 2.5 3 3.5 4求质点在时刻1.8时的速度,并画出插值多项式的图像。
1)运用Hermite插值法画出图像,如图4-1,并求质点在时刻1.8时的速度。
>>clear>>clc>>X=[0.1 0.5 1 1.5 2 2.5 3;0.95 0.84 0.86 1.06 1.5 0.72 1.9;1 1.5 2 2.5 3 3.5 4];>> x=0.1:0.01:3;>> H=Hermite1(X,x);>> plot(x,H)>> hold on>> plot(X(1,:),X(2,:),'r*')>> H1_8=Hermite(X,1.8);>> plot(1.8,H1_8,'go')>> legend('插值图像','原始点','目标点');图4-1二、验证高次插值的Runge现象问题分析和算法设计(一)Language插值代码function [Ln] =Lagrange(X,x)%请输入2*n+1矩阵X,X中第一行每个元素都是插值节点,X中第二行每个元素都是插值节点对应的函数值;%第二章P24例一拉格朗日插值n=size(X,2);d=0;for m=1:1:nif x==X(1,m);d=m;breakendend运行结果和总结 运行结果 例:给定函数55,11)(2≤≤-+=x xx f ; (1) 验证表2-10的误差结果(高次插值的Runge 现象);(2) 以0.1为步长分别进行Language 插值、分段线性插值、分段三次Hermite插值,画出三种插值函数以及f(x)的图像,比较三种插值结果。
数值分析实验,用程序实现Hermite插值法
《数值分析》实验报告实验序号:实验六 实验名称: Hermite 插值法1. 实验目的:学会Hermite 插值法,并应用该算法于实际问题.2. 实验内容:求一个函数ϕ(x )用来近似函数f (x ),用分段三次Hermit 插值的方法来求解近似函数ϕ(x )并画出近似函数图像及原函数图像。
设在区间[a,b]上,给定n+1个插值节点b x x x x a n =<<<<=...210和相应的函数值n y y y ,...,,10以及一阶导数值''1'0,...,,ny y y ,求一个插值函数)(x H ,满足以下条件: (1)),...,2,1,0()(,)(''n i y x H y x H i i i i === (2) )(x H 在每一个小区间[1,+j j x x ]上是三次多项式。
对于给定函数11-,2511)(2≤≤+=x x x f 。
在区间[]11-,上画出f (x )和分段三次Hermit 插值函数)(x H 的函数图像。
3. 实验分析:算法分析:1. 分段三次Hermit 插值的算法思想:分段三次Hermit 插值的做法是在每一个小区间上作三次Hermit 插值,因此在每一个插值节点上都需要构造两个插值基函数)(),(x H x h i i ,然后再作它们的线性组合。
分段三次Hermit 插值基函数如下:⎪⎩⎪⎨⎧≤≤----+=其它 0 ))(21()(1021010100x x x x x x x x x x x x h ⎪⎩⎪⎨⎧≤≤---=其它 0 ))(()(10210100x x x x x x x x x x H1,...,2,1 0 ))(21( ))(21()(1211112111-=⎪⎪⎪⎩⎪⎪⎪⎨⎧≤<----+≤≤----+=++++---n i x x x x x x x x x x x x x x x x x x x x x x x h i i i i i i i i i i-i i i i i i i 其它1,...,2,1 0 ))(( ))(()(12111211-=⎪⎪⎪⎩⎪⎪⎪⎨⎧≤<---≤≤---=+++--n i x x x x x x x x x x x x x x x x x x x H i i i i i i i i-i i i i i 其它⎪⎩⎪⎨⎧≤<----+=---其它 0 ))(21()(1-n 2111n n n n n n n n x x x x x x x x x x x x h ⎪⎩⎪⎨⎧≤<---=--其它 0 ))(()(1-n 211n n n n n n x x x x x x x x x x H 分段三次Hermit 插值函数是:∑=+=n i i i i i x H y x h y x H 0'))()(()( 4. 实验代码:// LDlg.cpp : implementation file//#include "stdafx.h"#include "L.h"#include "LDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CAboutDlg dialog used for App Aboutclass 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// Implementationprotected://{{AFX_MSG(CAboutDlg)//}}AFX_MSGDECLARE_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)// No message handlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////// // CLDlg dialogCLDlg::CLDlg(CWnd* pParent /*=NULL*/): CDialog(CLDlg::IDD, pParent){//{{AFX_DATA_INIT(CLDlg)// NOTE: the ClassWizard will add member initialization here//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CLDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CLDlg)// NOTE: the ClassWizard will add DDX and DDV calls here//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CLDlg, CDialog)//{{AFX_MSG_MAP(CLDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_LARGRI, OnLargri)ON_BN_CLICKED(IDC_BUTTON2, OnButton2)ON_BN_CLICKED(IDC_HERMITE, OnHermite)//}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////// // CLDlg message handlersBOOL CLDlg::OnInitDialog(){CDialog::OnInitDialog();// Add "About..." menu item to system menu.// IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon// TODO: Add extra initialization herereturn TRUE; // return TRUE unless you set the focus to a control}void CLDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}// If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework.void CLDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// Draw the icondc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}}// The system calls this to obtain the cursor to display while the user drags // the minimized window.HCURSOR CLDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}void CLDlg::OnOK(){int x00=300,y00=350,i,j;double x;CDC *pDC=GetDC();pDC->SetMapMode(MM_LOMETRIC);pDC->SetViewportOrg(x00,y00);//画坐标轴与原函数for(i=-700; i<=700; i++){pDC->SetPixel(i,0,RGB(0,0,0));pDC->SetPixel(0,i,RGB(0,0,0));}for(x=-1; x<=1; x+=0.001){double j=400.0/(1+25*x*x);pDC->SetPixel(x*500,j,RGB(255,0,0));}pDC->TextOut(-30,-10,"0");pDC->TextOut(-30,430,"1");pDC->TextOut(490,-10,"1");pDC->TextOut(-490,-10,"-1");pDC->MoveTo(-10,680); //x箭头pDC->LineTo(0,700);pDC->MoveTo(0,700);pDC->LineTo(10,680);pDC->MoveTo(680,10); //y箭头pDC->LineTo(700,0);pDC->MoveTo(700,0);pDC->LineTo(680,-10);pDC->TextOut(-30,700,"y");pDC->TextOut(700,-10,"x");}void CLDlg::OnLargri(){int x00=300,y00=350,i,j;double x;CDC *pDC=GetDC();pDC->SetMapMode(MM_LOMETRIC);pDC->SetViewportOrg(x00,y00);//画坐标轴for(i=-700; i<=700; i++){pDC->SetPixel(i,0,RGB(0,0,0));pDC->SetPixel(0,i,RGB(0,0,0));}double yx[]={-1,-0.8,-0.6,-0.4,-0.2,0,0.2,0.4,0.6,0.8,1}; pDC->TextOut(-30,-10,"0");pDC->TextOut(-30,430,"1");pDC->TextOut(490,-10,"1");pDC->TextOut(-490,-10,"-1");pDC->MoveTo(-10,680); //x箭头pDC->LineTo(0,700);pDC->MoveTo(0,700);pDC->LineTo(10,680);pDC->MoveTo(680,10); //y箭头pDC->LineTo(700,0);pDC->MoveTo(700,0);pDC->LineTo(680,-10);pDC->TextOut(-30,700,"y");pDC->TextOut(700,-10,"x");// 拉格朗日差值的函数double yy[12],lx[12],ly[12];double l_fenzi[12],l_fenmu[12];double l_x,l_y;for(i=0; i<=10; i++){yy[i]=1.0/(1+25*yx[i]*yx[i]);for(i=0; i<=10; i++){l_fenmu[i]=1.0;for(j=0; j<=10; j++){if(i!=j)l_fenmu[i]=l_fenmu[i]*(yx[i]-yx[j]);}}double qq,pp;for(qq=-1; qq<=1; qq+=0.0003){for(i=0; i<=10; i++){l_fenzi[i]=1.0;for(j=0; j<=10; j++){if(i!=j)l_fenzi[i]=l_fenzi[i]*(qq-yx[j]);}}pp=0;for(i=0; i<=11; i++){pp=pp+1.0/(1+25*yx[i]*yx[i])*l_fenzi[i]/l_fenmu[i];}pDC->SetPixel(qq*500,pp*390+5,RGB(132,112,225));}void CLDlg::OnButton2(){int x00=300,y00=350,i,j;double x;CDC *pDC=GetDC();pDC->SetMapMode(MM_LOMETRIC);pDC->SetViewportOrg(x00,y00);//画坐标轴与原函数for(i=-700; i<=700; i++){pDC->SetPixel(i,0,RGB(0,0,0));pDC->SetPixel(0,i,RGB(0,0,0));}double yx[]={-1,-0.8,-0.6,-0.4,-0.2,0,0.2,0.4,0.6,0.8,1}; double yy[14];for(i=0; i<=10; i++){yy[i]=1.0/(1+25*yx[i]*yx[i]);}pDC->TextOut(-30,-10,"0");pDC->TextOut(-30,430,"1");pDC->TextOut(490,-10,"1");pDC->TextOut(-490,-10,"-1");pDC->MoveTo(-10,680); //x箭头pDC->LineTo(0,700);pDC->MoveTo(0,700);pDC->LineTo(10,680);pDC->MoveTo(680,10); //y箭头pDC->LineTo(700,0);pDC->MoveTo(700,0);pDC->LineTo(680,-10);pDC->TextOut(-30,700,"y");pDC->TextOut(700,-10,"x");// 线性分段差值的图像CPen pen;CPen*oldpen;pen.CreatePen(PS_SOLID,5,RGB(0,0,0));oldpen=pDC->SelectObject(&pen);for(i=0; i<10; i++){pDC->MoveTo(yx[i]*480,yy[i]*400);pDC->LineTo(yx[i+1]*480,yy[i+1]*400); }}void CLDlg::OnHermite(){int x00=300,y00=350,i,j;double x;CDC *pDC=GetDC();pDC->SetMapMode(MM_LOMETRIC);pDC->SetViewportOrg(x00,y00);//画坐标轴与原函数for(i=-700; i<=700; i++){pDC->SetPixel(i,0,RGB(0,0,0));pDC->SetPixel(0,i,RGB(0,0,0));}double yx[]={-1,-0.8,-0.6,-0.4,-0.2,0,0.2,0.4,0.6,0.8,1};double yy[12];for(i=0; i<=10; i++){yy[i]=1.0/(1+25*yx[i]*yx[i]);}pDC->TextOut(-30,-10,"0");pDC->TextOut(-30,430,"1");pDC->TextOut(490,-10,"1");pDC->TextOut(-490,-10,"-1");pDC->MoveTo(-10,680); //x箭头pDC->LineTo(0,700);pDC->MoveTo(0,700);pDC->LineTo(10,680);pDC->MoveTo(680,10); //y箭头pDC->LineTo(700,0);pDC->MoveTo(700,0);pDC->LineTo(680,-10);pDC->TextOut(-30,700,"y");pDC->TextOut(700,-10,"x");//分段三次Hermite差值的函数double x0,x1,yd1,yd0,y1,y0;for(i=0; i<10; i++){x0=yx[i],x1=yx[i+1];y0=1.0/(1+25*x0*x0);y1=1.0/(1+25*x1*x1);yd0=-(50*x0)*1.0/((1+25*x0*x0)*(1+25*x0*x0));yd1=-(50*x1)*1.0/((1+25*x1*x1)*(1+25*x1*x1));for(double qq=x0; qq<x1; qq+=0.005){double pp= y0*(1+2*(qq-x0)/(x1-x0)) * (qq-x1)/(x0-x1) * (qq-x1)/(x0-x1)+y1*(1+2*(qq-x1)/(x0-x1)) * (qq-x0)/(x1-x0) * (qq-x0)/(x1-x0)+yd0*(qq-x0) * (qq-x1)/(x0-x1) * (qq-x1)/(x0-x1)+yd1*(qq-x1) * (qq-x0)/(x1-x0) * (qq-x0)/(x1-x0);pDC->SetPixel(qq*500,pp*400,RGB(225,185,15));}}}5.实验截图6. 实验结果分析:通过本次实验我对分段三次Hermit插值有了更深刻更全面的掌握,它在给定了节点处的函数值和导数值以后,构造了一个整体上具有一阶连续微商的插值函数。
hermite插值法 python
hermite插值法 python在数值分析中,Hermite插值是一种多项式插值方法,用于根据已知数据点的函数值和导数值来生成一个多项式函数。
它可以用来逼近一个函数或者在给定点上估计函数的值。
Hermite插值法是由法国数学家Charles Hermite在19世纪提出的。
与其他插值方法相比,Hermite插值法有一个独特的特点,即它不仅使用已知数据点的函数值,还使用了它们的导数值。
这使得Hermite 插值能够更好地近似真实函数,并且在某些情况下可以比其他插值方法更准确地逼近函数的形状。
Hermite插值的基本思想是通过构造一个满足已知函数值和导数值的多项式来逼近真实函数。
如果我们已知函数在某点的函数值和一阶导数值,我们可以通过构造一个多项式来使它在该点的函数值和一阶导数值都与真实函数相等。
利用这个思想,可以使用多项式的插值来逼近整个函数。
在Hermite插值中,我们通常使用拉格朗日插值多项式来构造插值函数。
拉格朗日插值多项式可以通过已知数据点的函数值和导数值来构造。
在Hermite插值中,对于每个已知数据点,我们有两个条件:函数值和一阶导数值。
因此,我们可以通过两个已知数据点来构造一个二次插值多项式。
对于三个已知数据点,我们可以构造一个三次插值多项式,以此类推。
在Python中,我们可以使用numpy库来实现Hermite插值。
numpy库提供了一个polyfit函数,该函数可以用于拟合已知数据点的函数值和导数值。
具体的实现步骤如下:1.导入numpy库:首先需要导入numpy库,因为我们将使用其中的polyfit函数。
```pythonimport numpy as np```2.定义已知数据点:我们需要定义已知数据点的函数值和导数值。
可以将这些数据点存储在两个数组中,例如:```pythonx = np.array([1, 2, 3, 4]) #已知数据点的x坐标y = np.array([1, 4, 9, 16]) #已知数据点的y坐标dy = np.array([1, 8, 27, 64]) #已知数据点的导数值```3.使用polyfit函数拟合数据点:接下来,我们可以使用polyfit 函数来拟合已知数据点。
数值计算(数值分析)实验4-分段三次埃尔米特(hermite)插值【c程序实现+流程图】
实验四分段三次埃尔米特插值(一)实验目的掌握分段三次埃尔米特插值算法。
(二)实验项目内容1.写出计算步骤和流程图。
2.对每种算法分别用C或c#程序实现。
3.调试程序。
可用以下数据进行调试。
已知函数y=1/(1+x2)在区间[0,3]上取等距插值节点,求区间[0,3]上的分段三次埃尔米特插值函数,并利用它求出f(1.5)的近似值(0.3075)。
x0 1 2iy 1 0.5 0.2 iy 0 -0.5 -0.16 i(三)主要仪器设备微机(四)实验室名称公共计算机实验室(五)实验报告撰写实验四分段三次埃尔米特插值实验报告一、流程图二、 程序代码#include<stdio.h>#include<math.h>float f0(float x) N Y开始输入i x ,i y ,xy=0, j=0t=1i j ix 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插值法
i = 0 ,1
x0 , x1均为R3 ( x )的二重零点,因此可设
R3 ( x ) = K ( x )( x − x0 )2 ( x − x1 )2
其中K (x )待定
10
构造辅助函数
ϕ (t ) = f (t ) − H 3 (t ) − K ( x )(t − x0 )2 (t − x1 )2
求一个次数不超过2n+1次的多项式H(x)使 求一个次数不超过2n+1次的多项式H(x)使 2n+1次的多项式H(x)
H ( xi ) = f ( xi ) = yi H ′( xi ) = f ′( xi ) = yi′
i = 0 ,1,L , n i = 0 ,1,L , n
这种带有导 数的多项式 问题, 插值 问题, 称为 Hermite插 Hermite插 值问题。 值问题。 1
′ ′ H 3 ( x) = y0α 0 ( x) + y1α1 ( x) + y0 β 0 ( x) + y1β1 ( x)
线性插值基函数代入定理1.5 将Lagrange线性插值基函数代入定理 线性插值基函数代入定理 中的基函数求得三次Hermite插值的基 中的基函数求得三次 插值的基 函数! 函数
x − x1 l0 ( x) = x0 − x1 x − x0 l1 ( x) = x1 − x0
基函数具有 什么表达式? 什么表达式?
4
x − x0 x − x1 α 0 ( x) = 1 + 2 x1 − x0 x0 − x1
2
x − x1 x − x0 α1 ( x ) = 1 + 2 x0 − x1 x1 − x0
数值分析(13)Hermite插值
a 2li' ( xi ) 解出 ' b 1 2 x l i i ( xi )
hi ( x ) (1 2( x xi )li' ( xi )) l i2 ( xi ) ( i 0,1, 2, n) n n x xj 1 ' 其中 li ( x ) ( ), l i ( xi ) ( ) xi x j xi x j j0 j0 所以
2n
共2n 2个方程,可求出2n 2个系数a0 , a1 ,..., a2n , a2n1 .
数值分析
数值分析
Hermite插值多项式的构造
( 2) Lagrange型插值基函数法 设Hermite插值多项式为 H 2 n1 ( x ) hi ( x ) yi hi ( x ) y 'i
数值分析
数值分析
由条件(2)可列出方程组 2 h ( x ) ( cx d ) l i i i i ( xi ) 0 2 ' h ' ( x ) cl ( x ) 2( cx d ) l ( x ) l i i i i i i i i ( xi ) 1
li ( xi ) 1, cxi d 0, c 1 解出 d xi 于是求出
i 0
数值分析
n
2
F ( t )关于t 有n 2个零点:x0,x1, ,xn,x 。 但F ' ( t )关于t 有2n 2个零点,由Rolle(罗尔)定理 必存在点 (a , b),使 F
(2 n 2)
( ) f
(2 n 2)
( ) 0 K ( x )(2n 2)! 0
Hermite插值
由插值条件
H2n1(xi ) yi f (xi ),
H
' 2 n 1
(
xi
)
yi '
f ' (xi )
(i 0,1, 2,...n)
n
n
设H2n1(x)
j (x) y j
j
(
x)
y
' j
j0
j0
其中, j (x), j (x)为2n 2个基函数。
由Lagrange插值基函数,设想
0
'
j
(
x0
)
'
j
(
x1
)
...
'
j
(
x
j 1
)
'
j
(x
j 1 )
...
'
j
( xn
)
而
j
(
x
j
)
1,
'
j
(
x
j
)
0
则x0 , x1,...x j1, x j1,..., xn是 j (x)的二重零点。
所以,令
j
(x)
C
(
x)
(x
(
j
x x0 )2 (x x1)2...(x x0 )2 (x j x1)2...(x j
Ax j
B)l
' j
(xj
)
0
A 2l B 1
' j
(
x
j
)
2
x
jl
' j
(
x
j
)
故得:
数值分析实验四Hermite插值法
数值分析实验报告
专业:计算机科学与技术
班级:14汉(2)
学号:20141501069
姓名:于童
指导教师:马季骕老师
实验
结果
果分析
通过本次实验我对分段三次Hermit插值有了更深刻更全面的掌握,它在给定了节点处的函数值和导数值以后,构造了一个整体上具有一阶连续微商的插值函数。
分段三次Hermit插值降低了插值多项式的次数,而且保证了插值函数在节点处一阶导数连续,从而使插值函数的光滑性更好。
但是在实际问题中给出节点处的函数值比较方便,给出导数值就很困难了。
分段三次Hermit插值函数属于插值曲线,适合于已知曲线上的某些点而生成曲线的情形,在许多实际问题中缺少灵活性和直观性。
况且它只具有一阶光滑性,但很多实际问题中需要更好的光滑性,这就要求有更好的方法来解决问题,比如Bezier曲线,B样条曲线等。
“Hermie”插值
一、科学计算的算法及其举例应用和利用MATLAB 自带函数实现hermite 插值算法说明:已知n 个插值节点x 1,x 2,…,x n 及其对应的函数值y 1,y 2,...,y n 和一阶导数值y 1',y 2',...,y n '。
则计算插值区域内任意x 的函数值y 的Hermite 插值公式:])2)([()('1i i ni i i i i y y y a x x h x y +--=∑= 其中 ∑∏≠=≠=-=--=n ij i j i i ni j j j i j i x x a x x x x h 1211;)( 源代码: hermite.mfunction y=hermite(x0,y0,y1,x) n=length(x0);m=length(x); for k=1:m yy=0.0; for i=1:n h=1.0; a=0.0; for j=1:n if j~=ih=h*((x(k)-x0(j))/(x0(i)-x0(j)))^2; a=1/(x0(i)-x0(j))+a; end endyy=yy+h*((x0(i)-x(k))*(2*a*y0(i)-y1(i))+y0(i)); end y(k)=yy; end流程图:开始y=hermite(x0,y0,y1,x)n=length(x0) m=length (x) k=1:myy=0.0i=1:nh=1.0 a=0.0j=1:ny(k)=yyyy=yy+h*((x0(i)-x(k))*(2*a*y0(i)-y1(i))+y0(i))h=h*((x(k)-x0(j))/(x0(i)-x0(j)))^2 a=1/(x0(i)-x0(j))+aj~=i结束FalseFalseFalseTrueTrueTrue举例应用:对给定数据表,试构造Hermite多项式,并给出sin0.34的近似值。
x 0.30 0.32 0.35 sinx 0.29552 0.31457 0.34290 cosx 0.95534 0.94924 0.93937流程图:源代码:在MATLAB命令窗中输入>> x0=[0.3 0.32 0.35];>> y0=[0.29552 0.31457 0.34290]; >> y1=[0.95534 0.94924 0.93937]; >> x=[0.3: 0.005: 0.35];>> y=hermite(x0,y0,y1,x);>> plot (x,y)>> y=hermite(x0,y0,y1,0.34)y =输出图形和y值结束plot(x,y) 开始x0=[0.3 0.32 0.35];y0=[0.29552 0.314570.34290]; y1=[0.95534 0.94924 0.93937];x=[0.3: 0.005: 0.35]y=hermite(x0,y0,y1,x)y=hermite(x0,y0,y1,0.34)0.3335>> sin(0.34)ans =0.3335>> y2=sin(x); >> hold on>> plot (x,y2,'--r') 运行结果:二、科学计算和工程实际问题和举例1、求导弹轨迹及加速度流程图:源代码: %构建方程 work1f.mfunction rprime=work1f(t,r) global vt vm rprime=[0;0];% 给出t0之前rprime 初值rprime(1)=-vt-vm*r(1)/sqrt(r(1)^2+r(2)^2); rprime(2)=-vm*r(2)/sqrt(r(1)^2+r(2)^2); %绘制曲线 work1.m global vt vmvt=input('vt=');vm=input('vm='); %输入共用的参数 r0=input('[x0;y0]=');%输入数值积分需要的参数tspan=input('tspan=[t0,tfinal]='); [t,r] = ode45('work1f',tspan,r0); %进行数值积分 plot(r(:,1),r(:,2));%绘图%求加速度:M 点位置的导数是相对速度,二次导数则为绝对加速度dt=diff(t); Ldt=length(dt); %为了求导数先求t 的增量 x=r(:,1);y=r(:,2);% 把r 写成x,y 两个分量形式 vx=diff(r(:,1))./dt;vy=diff(r(:,2))./dt;开始构建方程 数值积分输入全局参数输出图形求2次导数求加速度输出加速度数值解结束wx=diff(vx)./dt(1:Ldt-1);wy=diff(vy)./dt(1:Ldt-1); %二次导数[t(2:Ldt),x(2:Ldt),y(2:Ldt),wx,wy] %显示数据在命令行输入>>work1>>vt=500;vm=1000;>>[x0;y0]=[3000;4000];>>tspan=[t0,tfinal]=[0,4.5]>>hold on>>work1>>vt=500;vm=800;>>[x0;y0]=[3000;4000];>>tspan=[t0,tfinal]=[0,6]运行结果:分别获得两组解,获得轨迹图如下两组绝对加速度的数值解按列以对应的时间、相对位置的x、y投影距离和x、y方向绝对加速度输出Vm=800ans =1.0e+003 *0.0002 2.8536 3.9036 0.0539 -0.03940.0003 2.7084 3.8062 0.0569 -0.0405 0.0005 2.5645 3.7080 0.0600 -0.0415 0.0006 2.4219 3.6088 0.0635 -0.0426 0.0008 2.2808 3.5087 0.0672 -0.0437 0.0009 2.1411 3.4076 0.0713 -0.0448 0.0011 2.0031 3.3055 0.0757 -0.0459 0.0012 1.8668 3.2023 0.0806 -0.0469 0.0014 1.7323 3.0981 0.0859 -0.0480 0.0015 1.5997 2.9929 0.0917 -0.0490 0.0017 1.4692 2.8865 0.0982 -0.0499 0.0018 1.3409 2.7790 0.1052 -0.0507 0.0020 1.2149 2.6703 0.1130 -0.0514 0.0021 1.0915 2.5605 0.1217 -0.0518 0.0023 0.9709 2.4495 0.1313 -0.0520 0.0024 0.8532 2.3374 0.1419 -0.0517 0.0026 0.7387 2.2241 0.1538 -0.0510 0.0027 0.6276 2.1096 0.1671 -0.0496 0.0029 0.5203 1.9941 0.1819 -0.0473 0.0030 0.4172 1.8774 0.1983 -0.0439 0.0032 0.3184 1.7598 0.2168 -0.0391 0.0033 0.2246 1.6413 0.2373 -0.0322 0.0035 0.1360 1.5221 0.2599 -0.0228 0.0036 0.0534 1.4023 0.2843 -0.0106 0.0038 -0.0229 1.2824 0.3122 0.0058 0.0039 -0.0921 1.1625 0.3415 0.0277 0.0041 -0.1537 1.0433 0.3711 0.0555 0.0042 -0.2069 0.9253 0.3996 0.0890 0.0044 -0.2511 0.8094 0.4317 0.1348 0.0045 -0.2856 0.6964 0.4570 0.1894 0.0047 -0.3099 0.5877 0.4692 0.2489 0.0048 -0.3235 0.4847 0.4184 0.2734 0.0049 -0.3269 0.4086 0.4678 0.3750 0.0050 -0.3237 0.3378 0.4514 0.4339 0.0052 -0.3144 0.2730 0.4110 0.4739 0.0053 -0.2993 0.2147 0.2959 0.40420.0053 -0.2874 0.1822 0.3379 0.53260.0054 -0.2738 0.1524 0.3056 0.54840.0055 -0.2585 0.1256 0.2653 0.54620.0056 -0.2419 0.1016 0.1991 0.46920.0056 -0.2285 0.0854 0.2022 0.53930.0057 -0.2146 0.0709 0.1770 0.53450.0057 -0.2001 0.0579 0.1483 0.51250.0058 -0.1852 0.0465 0.1062 0.41920.0058 -0.1741 0.0392 0.1085 0.48110.0059 -0.1629 0.0326 0.0940 0.46890.0059 -0.1516 0.0267 0.0783 0.44410.0059 -0.1401 0.0216 0.0458 0.29130.0060 -0.1357 0.0198 0.0606 0.41610.0060 -0.1313 0.0181 0.0562 0.40800.0060 -0.1268 0.0165 0.0518 0.3991Vm=1000ans =1.0e+003 *0.0001 2.8767 3.9097 0.0668 -0.04920.0002 2.7542 3.8188 0.0699 -0.05040.0003 2.6326 3.7272 0.0731 -0.05160.0004 2.5119 3.6350 0.0766 -0.05290.0006 2.3922 3.5421 0.0804 -0.05430.0007 2.2735 3.4485 0.0844 -0.05560.0008 2.1558 3.3542 0.0888 -0.05700.0009 2.0393 3.2592 0.0935 -0.05850.0010 1.9240 3.1635 0.0986 -0.06000.0011 1.8099 3.0670 0.1042 -0.06150.0012 1.6972 2.9697 0.1102 -0.06300.0014 1.5858 2.8716 0.1168 -0.06450.0015 1.4759 2.7727 0.1241 -0.06600.0016 1.3676 2.6730 0.1320 -0.06750.0017 1.2610 2.5724 0.1408 -0.0690 0.0018 1.1561 2.4710 0.1504 -0.0703 0.0019 1.0532 2.3686 0.1611 -0.0716 0.0020 0.9523 2.2654 0.1730 -0.0727 0.0021 0.8535 2.1612 0.1863 -0.0735 0.0022 0.7572 2.0561 0.2011 -0.0739 0.0024 0.6634 1.9501 0.2177 -0.0740 0.0025 0.5723 1.8431 0.2366 -0.0733 0.0026 0.4842 1.7352 0.2578 -0.0717 0.0027 0.3994 1.6264 0.2817 -0.0690 0.0028 0.3182 1.5167 0.3093 -0.0648 0.0029 0.2408 1.4062 0.3411 -0.0581 0.0030 0.1678 1.2950 0.3772 -0.0483 0.0032 0.0996 1.1831 0.4175 -0.0349 0.0033 0.0366 1.0708 0.4670 -0.0157 0.0034 -0.0204 0.9583 0.5238 0.0125 0.0035 -0.0708 0.8460 0.5857 0.0508 0.0036 -0.1138 0.7343 0.6459 0.0949 0.0037 -0.1487 0.6238 0.7458 0.1799 0.0038 -0.1740 0.5156 0.8446 0.2962 0.0039 -0.1887 0.4112 0.9078 0.4245 0.0041 -0.1919 0.3121 0.6878 0.3993 0.0041 -0.1895 0.2699 1.0184 0.7163 0.0042 -0.1844 0.2296 1.0405 0.8403 0.0042 -0.1767 0.1914 1.0333 0.9575 0.0043 -0.1664 0.1556 0.8512 0.8941 0.0043 -0.1579 0.1327 1.0076 1.1994 0.0043 -0.1481 0.1112 0.9850 1.3162 0.0044 -0.1372 0.0913 0.9290 1.3989 0.0044 -0.1252 0.0731 0.7705 1.2960 0.0044 -0.1148 0.0597 0.8337 1.6027 0.0044 -0.1038 0.0476 0.7886 1.7331 0.0045 -0.0923 0.0368 0.6839 1.72432、用周期样条求曲线轮廓并作图流程图:源代码: work2.m function ppx=[100 134 164 180 198 195 186 160 136 100 66 35 15 0 5 17 32 63 100];y=[503 525 514.3 451 326.5 188.6 92.2 59.6 62.2 102.7 147.1 191.6 236 280.5 324.9 369.4 413.8 458.3 503]; i=[0:pi/9:pi*2];xx=csape(i,x,'periodic'); yy=csape(i,y,'periodic'); ii=[0:pi/225:pi*2]; xpp=ppval(xx,ii); ypp=ppval(yy,ii);pp=plot(xpp,ypp,'r-',x,y,'bd'); 运行结果:获得封闭曲线如右图取作图用样点作图输出图形构建样条函数结束开始断点数据。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
+yd0*(qq-x0) * (qq-x1)/(x0-x1) * (qq-x1)/(x0-x1)
+yd1*(qq-x1) * (qq-x0)/(x1-x0) * (qq-x0)/(x1-x0);
y1=1.0/(1+25*x1*x1);
yd0=-(50*x0)*1.0/((1+25*x0*x0)*(1+25*x0*x0));
yd1=-(50*x1)*1.0/((1+25*x1*x1)*(1+25*x1*x1));
for(double qq=x0; qq<x1; qq+=0.005)
{
double pp= y0*(1+2*(qq-x0)/(x1-x0)) * (qq-x1)/(x0-x1) * (qq-x1)/(x0-x1)
2.分段三次Hermit插值函数是:
实验源代码
void CMy20141501069View::Onher()
{
// TODO: Add your command handler code here
int x00=300,y00=350,i,j;
double x;
CDC *pDC=GetDC();
pDC->SetMapMode(MM_LOMETRIC);
pDC->MoveTo(-10,680); //x箭头
pDC->LineTo(0,700);
pDC->MoveTo(0,700);
pDC->LineTo(10,680);
pDC->MoveTo(680,10); //y箭头
pDC->LineTo(700,0);
pDC->MoveTo(700,0);
pDC->LineTo(680,-10);
double yy[12];
for(i=0; i<=10; i++)
{
yy[i]=1.0/(1+25*yx[i]*yx[i]);
}
pDC->TextOut(-30,-10,"0");
pDC->TextOut(-30,430,"1");
pDC->TextOut(490,-10,"1");
pDC->TextOut(-490,-10,"-1");
pDC->TextOut(-30,700,"y");
pDC->TextOut(700,-10,"x");
//分段三次Hermite差值的函数
double x0,x1,yd1,yd0,y1,y0;
for(i=0; i<10; i++)
{
x0=yx[i],x1=yx[i+1];
y0=1.0/(1+25*x0*x0);
数值分析实验报告
专业:计算机科学与技术
班级:14汉(2)
学号:***********
姓名:***
指导教师:马季骕老师
实验项目
Hermite插值法
算法介绍
学会Hermite插值法,并应用该算法于实际问题.
求一个函数 (x)用来近似函数f(x),用分段三次Hermit插值的方法来求解近似函数 (x)并画出近似函数图像及原函数图像。
pDC->SetPixel(qq*500,pp*400,RGB(225,185,15));
}
}
}
实验结果
结果分析
通过本次实验我对分段三次Hermit插值有了更深刻更全面的掌握,它在给定了节点处的函数值和导数值以后,构造了一个整体上具有一阶连续微商的插值函数。分段三次Hermit插值降低了插值多项式的次数,而且保证了插值函数在节点处一阶导数连续,从而使插值函数的光滑性更好。但是在实际问题中给出节点处的函数值比较方便,给出导数值就很困难了。分段三次Hermit插值函数属于插值曲线,适合于已知曲线上的某些点而生成曲线的情形,在许多实际问题中缺少灵活性和直观性。况且它只具有一阶光滑性,但很多实际问题中需要更好的光滑性,这就要求有更好的方法来解决问题,比如Bezier曲线,B样条曲线等。
设在区间[a,b]上,给定n+1个插值节点 和相应的函数值 以及一阶导数值 ,求一个插值函数 ,满足以下条件:
(1)
(2) 在每一个小区间[ ]上是三次多项式。
(3)对于给定函数 。在区间 上画出f(x)和分段三次Hermit插值函数 的函数图像。
算法分析三次Hermit插值的做法是在每一个小区间上作三次Hermit插值,因此在每一个插值节点上都需要构造两个插值基函数 ,然后再作它们的线性组合。分段三次Hermit插值基函数如下:
pDC->SetViewportOrg(x00,y00);
//画坐标轴与原函数
for(i=-700; i<=700; i++)
{
pDC->SetPixel(i,0,RGB(0,0,0));
pDC->SetPixel(0,i,RGB(0,0,0));
}
double yx[]={-1,-0.8,-0.6,-0.4,-0.2,0,0.2,0.4,0.6,0.8,1};