武汉大学数值分析hermite插值多项式的例题
5.4埃尔米特(Hermite)插值
H3(xi) = yi
H´3(xi) = y´i x
(i=0,1,2)
1 1
0 0 0
1 1
y ( x) y f ( x )
解
所求三次Hermite的插值多项式为
H 3 ( x ) a0 a1 x a2 x 2 a3 x 3
i( x j ) 0 i ( x j ) 0
(i, j =0,1,2, …,n)
Hermite插值多项式可写成插值基函数表示的形式
H 2 n1 ( x ) i ( x ) f ( xi ) i ( x ) f ( xi )
i 0
n
计算方法
验证:
H 2n1 ( x j ) i ( x j ) f ( xi ) i ( x j ) f ( xi ) ij f ( xi ) 0 f ( x j )
n
计算方法
H2n+1(x)为满足条件
H ( xi ) f ( xi ),
H ( xi ) f ( xi )
( i 0,1, , n)
的2n+1次Hermite插值多项式。
计算方法
定理
满足插值条件
H ( xi ) f ( xi ) ( i 0,1, , n)
H ( xi ) f ( xi ),
其中
( x ) ( x x0 )( x x1 )( x xn )
(a, b)
定理的证明可仿照Lagrange插值余项的证明方法
实际中使用最广泛的是三次Hermite插值多项式,即 n=1的情况
计算方法
H 3 ( x ) j ( x ) f ( x j ) j ( x ) f ( x j )
埃尔米特(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; }。
基于降阶法的hermite插值多项式求解方法
基于降阶法的hermite插值多项式求解方法基于降阶法的Hermite插值多项式求解方法是一种数值分析方法,用于求解函数在给定点的值。
该方法的基本思想是将高阶多项式转化为低阶多项式,从而简化计算过程。
具体步骤如下:1. 定义插值点:选择一组已知的插值点 $(x_0, y_0), (x_1, y_1), \ldots, (x_n, y_n)$,其中 $x_0 < x_1 < \ldots < x_n$。
2. 构造降阶多项式:对于 $i = 0, 1, \ldots, n$,定义 $p_i(x) = (x - x_i)\cdot q_i(x)$,其中 $q_i(x)$ 是 $(n-1)$ 阶多项式。
3. 求解 $q_i(x)$:对于 $i = 0, 1, \ldots, n$,求解 $(n-1)$ 阶方程$q_i(x_j) = \delta_{ij}$,其中 $\delta_{ij}$ 是 Kronecker delta 函数。
4. 求解 $p_i(x)$:对于 $i = 0, 1, \ldots, n$,求解 $(n+1)$ 阶方程$p_i(x_j) = y_j$。
5. 计算插值多项式:最终的插值多项式为 $H(x) = \sum_{i=0}^{n} p_i(x)\cdot \varphi_i(x)$,其中 $\varphi_i(x) = \frac{(x - x_0)(x - x_1) \cdots (x - x_{i-1})(x - x_{i+1}) \cdots (x - x_n)}{(x_i - x_0)(x_i - x_1) \cdots (x_i - x_{i-1})(x_i - x_{i+1}) \cdots (x_i - x_n)}$。
通过以上步骤,可以求解出满足给定插值条件的 Hermite 插值多项式。
在实际应用中,可以根据具体问题选择合适的插值点,并利用该方法进行数值计算。
武汉大学研究生数值分析考试试题
武 汉 大 学2011~2012学年第一学期硕士研究生期末考试试题 科目:数值分析 学生所在院: 学号: 姓名:一、(12分)用杜利特尔(Doolittle )分解算法求解方程组 b Ax =,其中⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-=976034112A ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=34156b二、(12分)给定方程组 Ax b =,其中 323121A b 轾轾犏犏==犏犏臌臌(1)计算A 的条件数 ()cond A ¥(2)问常数a 取何值时,迭代格式 (1)()()()0,1,2,k k k x x b Ax k a +=+-=L 是收敛的。
三(12分)设*x c =是方程()0f x =的根,()f x 充分光滑可导,2()()()()()x x p x f x q x f x j =--。
试确定待定函数(),()p x q x ,使迭代格式 1(),0,1,n n x x n j +==L求方程()0f x =的根*x c =时至少有3阶局部收敛性。
四、(14(1)求)(x f 的Hermite 插值多项式)(3x H ,(2)利用上面的Hermite 插值多项式导出如下的求积公式及其积分余项: [][])()0(121)()0(2)(2h0h f f h h f f h dx x f '-'++≈⎰五、(12求形如 6sin 2b ax y += 的拟合曲线。
六、(12分)确定常数 a ,b 的值,使积分2121(,)I a b ax b x dx -轾=+-犏臌ò 取得最小值。
七、(12分)已知Legendre(勒让德)正交多项式)(x L n 有递推关系式:⎪⎪⎩⎪⎪⎨⎧=+-++===-+),2,1()(1)(112)()(,1)(1110 n x L n n x xL n n x L x x L x L n n n 试确定三点高斯-勒让德(G-L )求积公式⎰-++≈11332211)()()()(x f A x f A x f A dx x f的求积系数和节点。
数值计算方法实验之Hermite多项式插值(Python代码)
数值计算⽅法实验之Hermite多项式插值(Python代码)⼀、实验⽬的在已知f(x),x∈[a,b]的表达式,但函数值不便计算,或不知f(x),x∈[a,b]⽽⼜需要给出其在[a,b]上的值时,按插值原则f(x i)= y i(i= 0,1…….,n)求出简单函数P(x)(常是多项式),使其在插值基点x i,处成⽴P(x i)= y i(i=0,1,……,n),⽽在[a,b]上的其它点处成⽴f(x)≈P(x).⼆、实验原理三、实验内容求f(x)=x4在[0,2]上按5个等距节点确定的Hermite插值多项式.四、实验程序1import numpy as np2from sympy import *3import matplotlib.pyplot as plt456def f(x):7return x ** 48910def ff(x): # f[x0, x1, ..., xk]11 ans = 012for i in range(len(x)):13 temp = 114for j in range(len(x)):15if i != j:16 temp *= (x[i] - x[j])17 ans += f(x[i]) / temp18return ans192021def draw(L, newlabel= 'Lagrange插值函数'):22 plt.rcParams['font.sans-serif'] = ['SimHei']23 plt.rcParams['axes.unicode_minus'] = False24 x = np.linspace(0, 2, 100)25 y = f(x)26 Ly = []27for xx in x:28 Ly.append(L.subs(n, xx))29 plt.plot(x, y, label='原函数')30 plt.plot(x, Ly, label=newlabel)31 plt.xlabel('x')32 plt.ylabel('y')33 plt.legend()3435 plt.savefig('1.png')36 plt.show()373839def lossCal(L):40 x = np.linspace(0, 2, 101)41 y = f(x)42 Ly = []43for xx in x:44 Ly.append(L.subs(n, xx))45 Ly = np.array(Ly)46 temp = Ly - y47 temp = abs(temp)48print(temp.mean())495051def calM(P, x):52 Y = n ** 453 dfP = diff(P, n)54return solve(Y.subs(n, x[0]) - dfP.subs(n, x[0]), [m,])[0] 555657if__name__ == '__main__':58 x = np.array(range(11)) - 559 y = f(x)6061 n, m = symbols('n m')62 init_printing(use_unicode=True)6364 P = f(x[0])65for i in range(len(x)):66if i != len(x) - 1:67 temp = ff(x[0:i + 2])68else:69 temp = m70for j in x[0:i + 1]:71 temp *= (n - j)72 P += temp73 P = expand(P)7475 P = P.subs(m, calM(P, x))76 draw(P, newlabel='Hermite插值多项式')77 lossCal(P)五、运算结果。
数值分析实验六(分段三次Hermite插值)
数值分析实验六(分段三次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现象。
数值分析 习题库 答案 例题
11.简要回答下列问题(每小题5分,共35分)(1)简述Hermite 插值问题。
(2)构造插值型数值求积公式的思想和作法是什么?(3)三次样条插值与一般分段3次多项式插值的区别是什么?(4)区间[a,b ]上连续函数f (x )的次数不超过n次的最佳一致逼近多项式问题是什么?(5)区间[a,b ]上连续函数f (x )的次数不超过n 次的最佳平方逼近多项式问题是什么?(6)写出微分方程初值问题数值解的整体截断误差的表达式。
(7)对于离散数据的函数拟合问题,你知道哪两种方法,各自的特点是什么?2. 填空(每空3分,共 15分)(1) f (x )=x 7+ x 4+3x +1,则f [30, 31,…,38 (2) 一种不低于2(3) 设P k (xk ,y k ) , 其中x k =k, k =1,2,…,7, 为函数y =x 3-3x +1上的7个点,过P 1,…,P 7且次数(1) 不超过6次的牛顿插值多项式中x 3。
(4) n 个节点的Gauss (5) 设A =⎪⎪⎭⎫ ⎝⎛5203,则cond (A )1。
3. (15分) 设函数f (x )在其零点x *邻近二阶连续可微,且f /(x *) ≠ 0,为求零点x *的近似值, 欲用 Newton 迭代法,问其收敛速度如何?证明你的结论。
(2) 收敛速度≥2 (3) 证明收敛 5分(4) 证明阶数 5分4.(10分) 对于方程组⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=⎪⎪⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎪⎪⎭⎫ ⎝⎛4321701211032127112154321x x x x (1) 若用列主元消元法,其第一和第二次的列主元素是什么? 4分(2) 其雅格比迭代法收敛否?为什么? 3分(3) 写出其高斯-塞德尔迭代法的迭代矩阵。
3分5.(10分) 已知数据如右表,欲用一个多项式近似x 与y 之间的函数关系,(1) . 用2次多项式拟合,写出相应系数的法方程组(不要求求解该方程组)。
武汉大学数值分析期末考试(05-11年)
x1 + 2 x 2 − 2 x3 = 1, x1 + x 2 + x3 = −1, 2 x + 2 x + x = 0. 2 3 1 2a a 0 二、 (8 分)若矩阵 A = 0 a 0 ,说明对任意实数 a ≠ 0 ,方程组 AX = b 都是 0 0 a
dy = f (t , y ) 的单步法: 八、 (14 分)对于下面求解常微分方程初值问题 dt y (t 0 ) = y 0
λ
y n +1 = y n + hk 2 k1 = f (t n , y n ) 1 1 k 2 = f (t n + h, y n + hk1 ) 2 2 (1) 验证它是二阶方法; (2) 确定此单步法的绝对稳定区域。
1 1 y n +1 = y n + h( 2 k1 + 2 k 2 ) k1 = f ( x n , y n ) k = f ( x + h, y + hk ) n n 1 2 (1) 验证它是二阶方法; (2) 确定此单步法的绝对稳定域。
武 汉 大 学
2006~2007 学年第一学期硕士研究生期末考试试题 (A 卷)
非病态的(范数用 ⋅ ∞ ) 四 、(15 分)已知 y = f ( x) 的数据如下 : xi f ( xi ) f ′( xi )
0
0
1 2 1
2
6
求 f ( x) 的 Hermite 插值多项式 H 3 ( x) ,并给出截断误差 R ( x) = f ( x) − H 3 ( x) 。 五 、(10 分)在某个低温过程中,函数 y 依赖于温度 x(℃)的试验数据为 xi yi 1 0.8 2 1.5 3 1.8 4 2.0
实验四 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】王萼芳,石声明,高等代数,北京:高等教育出版社。
埃尔米特插值多项式练习题
埃尔米特插值多项式练习题埃尔米特插值多项式练习题埃尔米特插值多项式是一种用于逼近函数的方法,它不仅可以通过给定的函数值来逼近函数的值,还可以通过给定的导数值来逼近函数的导数值。
在数值计算和插值问题中,埃尔米特插值多项式是一种非常有用的工具。
假设我们有一个函数f(x),我们想要通过给定的函数值和导数值来逼近这个函数。
埃尔米特插值多项式可以通过以下步骤来求解:1. 首先,我们需要确定插值点。
插值点是我们已知的函数值和导数值的点。
通常,我们选择一组等距的插值点,以便于计算。
2. 接下来,我们需要构建拉格朗日插值多项式。
拉格朗日插值多项式是通过给定的函数值来逼近函数的值的多项式。
它可以通过以下公式来计算:L(x) = Σ [ f(xi) * Li(x) ] (i=0 to n)其中,Li(x)是拉格朗日基函数,它可以通过以下公式来计算:Li(x) = Π [ (x - xj) / (xi - xj) ] (j=0 to n, j ≠ i)这样,我们就可以得到拉格朗日插值多项式L(x)。
3. 接下来,我们需要构建埃尔米特插值多项式。
埃尔米特插值多项式是通过给定的函数值和导数值来逼近函数的多项式。
它可以通过以下公式来计算:H(x) = Σ [ f(xi) * Hi(x) + f'(xi) * Hi'(x) ] (i=0 to n)其中,Hi(x)是埃尔米特基函数,它可以通过以下公式来计算:Hi(x) = [ 1 - 2 * (x - xi) * Li'(xi) ] * (Li(x))^2Hi'(x)是埃尔米特基函数的导数,它可以通过以下公式来计算:Hi'(x) = (x - xi) * (Li(x))^2这样,我们就可以得到埃尔米特插值多项式H(x)。
通过以上步骤,我们可以得到一个逼近函数f(x)的埃尔米特插值多项式H(x)。
这个多项式可以在给定的插值点上非常精确地逼近函数的值和导数值。
数值分析课后答案(4)
数值分析课后答案(4)习题四1.已知ln(2.0)=0.6931;ln(2.2)=0.7885,ln(2.3)=0.8329, 试用线性插值和抛物插值计算.ln2.1的值并估计误差解:线形插值:取02.0x = 00.6931y = 12.2x = 10.7885y = 22.3x = 20.8329y = 110 2.1 2.3 2.1 2.0(0)(1)0.69310.832901102.0 2.32.3 2.0x x x x L f x f x x x x x ----=+=+----=0.7410抛物线插值:12200102()()()()x x x x l x x x x --=-- 02211012()()()()x x x x l x x x x --=-- 01222021()()()()x x x x l x x x x --=--2200211222L l y l y l y =++=0.7422.已知x=0,2,3,5对应的函数值分别为y=1,3,2,5.试求三次多项式的插值解:解:取00x = 12x = 23x = 35x = 12330010203()()()()()()x x x x x x l x x x x x x ---=--- 023********()()()()()()x x x x x x l x x x x x x ---=---01332202123()()()()()()x x x x x x l x x x x x x ---=--- 01233303132()()()()()()x x x x x x l x x x x x x ---=---3300311322333L l y l y l y l y =+++=1156261310323++-x x x3.设函数f(x)在[a,b]上具有直到二阶的连续导数,且f(a)=f(b)=0, 求证:2"1m ax |()|()m ax |()|8a x ba x bf x b a f x ≤≤≤≤≤-解:取01;x a x b ==,1()()0x a x b L f a f b a bb a--=+=--''''211()()()|()()||()()|||||224f f b a R f x L x x a x b εε-=-≤--≤∴''21()()|()||()|||||24f b a f x L x ε-≤+''1()|()||||()|8f L x b a ε=+-|||8)("|a b f -=ε4.证明n 次Lagrange 插值多项式基函数满足∑==ni ki n ki x x l x 0,)(, n k ≤≤0解:取()kf x x = 则n 0()nki i Ln lx x ==∑(1)()()()!n nii fx f x Ln Rn x x n +=-==-∑(1)0()()!k n nii x x x n +==-∑=0所以()()f x Ln x = 即证 5.证明 )(')()()(,xi x x x x l n i n i n ωω-=证明:、01110111()()()()()ln ()()()()()i i n i i i i i i i n x x x x x x x x x x i x x x x x x x x x x -+-+-----= -----01110111()()()()()()()()()()i i ni i ii i i i i nix x x x x x x x x x x x x x x x x x x x x x x x -+-+------=------取 0111()()()()()()n i ii n x x xx xxxx x x x x ω-+=------则 '1020111011()()()())()()()()()()()()()n nn i in n x x x x x x x x x x x x x xx xx x x x x x x x x xxω-+-=--+---+-----++--- ('0111()()()()()()n i i i i i i i i n x x x x x x x x x x x ω-+=-----所以,'()ln ()()n i n i x i x x x ωω=-6.设nn x a x a a x f ++=10)(有n 个不同的实根.,,21n x x x证明:=-=∑11,0)('n ni i kia x f x证明:取()kx x ?= 1()()n n x x xx ω=-- 而,0()nn f x a a x =++ 有n 个不同的实根。
数值计算(数值分析)试题及答案
武汉理工大学研究生课程考试标准答案用纸课程名称:数值计算(A ) 任课教师 :一. 简答题,请简要写出答题过程(每小题5分,共30分) 1.将227和355113作为 3.14159265358979π=L 的近似值,它们各有几位有效数字, 绝对误差和相对误差分别是多少3分)2分)2.已知()8532f x x x =+-,求0183,3,,3f ⎡⎤⎣⎦L ,0193,3,,3f ⎡⎤⎣⎦L .(5分)3.确定求积公式10120()(0)(1)(0)f x dx A f A f A f '≈++⎰中的待定系数,使其代数精度尽量高,并指明该求积公式所具有的代数精度。
解:要使其代数精度尽可能的高,只需令()1,,,m f x x x =L L 使积分公式对尽可能大的正整数m 准确成立。
由于有三个待定系数,可以满足三个方程,即2m =。
由()1f x =数值积分准确成立得:011A A += 由()f x x =数值积分准确成立得:121/2A A += 由2()f x x =数值积分准确成立得:11/3A =解得1201/3,1/6,2/3.A A A === (3分)此时,取3()f x x =积分准确值为1/4,而数值积分为11/31/4,A =≠所以该求积公式的最高代数精度为2次。
(2分)4.求矩阵101010202A -⎡⎤⎢⎥=⎢⎥⎢⎥-⎣⎦的谱半径。
解 ()()101011322I A λλλλλλλ--=-=---矩阵A 的特征值为1230,1,3λλλ=== 所以谱半径(){}max 0,1,33A ρ== (5分)5. 设10099,9998A ⎛⎫= ⎪⎝⎭计算A 的条件数()(),2,p cond A P =∞.解:**19899-98999910099-100A A A A --⎛⎫⎛⎫=⇒== ⎪ ⎪-⎝⎭⎝⎭矩阵A 的较大特征值为,较小的特征值为,则1222()198.00505035/0.0050503539206cond A A A -=⨯==(2分)1()199********cond A A A -∞∞∞=⨯=⨯= (3分)22001130101011010220100110110()(12)()(12)()()()()()x x x x x x x x H x y y x x x x x x x x x x x x x x y x x y x x x x ----=-+-------''+-+---(5分)并依条件1(0)1,(0),(1)2,(1) 2.2H H H H ''====,得2222331()(12)(1)2(32)(1)2(1)211122H x x x x x x x x x x x =+-+-+-+-=++ (5分)2.已知()()()12,11,21f f f -===,求()f x 的Lagrange 插值多项式。
数值分析实验,用程序实现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插值有了更深刻更全面的掌握,它在给定了节点处的函数值和导数值以后,构造了一个整体上具有一阶连续微商的插值函数。
数值计算(数值分析)实验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插值多项式的例题
例若()f x 在[a,b]上有三阶连续导数,且已知()f x 在[,]a b 上两个互异的 点01,x x 上的函数值01(),()f x f x 和一阶导数值'0()f x ,试求满足条件 ''001100()(),()(),()()H x f x H x f x H x f x ===的插值多项式,并估计误差。
解由给定的3 个插值条件,显然可确定一个次数不超过2次的埃尔米特插值多项式()H x , 又有()H x 应满足插值条件()()i i H x f x =,(0,1)i =,而节点01,x x 上的线性插值函数1()N x 也满足插值条件1()(),(0,1)i iN x f x i ==,故可设1()()()()H x N x A x x x x-=--,其中A 为待定常数,上式又可记为 101000101()()()()()()[,]()()H x N x A x x x x f x x x f x x A x x x x =+--=+-+--为了确定常数A ,对上式求导,得'0110()[,][()()]H x f x x A x x x x =+-+-,令0x x =代入,且注意插值条件''001010()[,]()()H x f x x A x x f x =+-=, 于是有'01010[,]()f x x f x A x x -=-,即()H x 为'010********[,]()()()()[,]()()f x x f x H x f x x x f x x x x x x x x -=+-+---,当然也可先采用拉格朗日多项式构造,同样得到满足相同条件的插值多项式()H x余项为(3)201()()()()6fR x x x x x ξ=--。
两点三次hermite插值例题
两点三次hermite插值例题Hermite插值是一种数值分析方法,用于在给定的数据点上生成一个多项式函数,以便通过这些数据点来近似描述一个函数。
Hermite插值是利用函数值和导数值来进行插值的一种方法,它可以更精确地逼近给定的数据点。
下面我将通过一个例题来说明Hermite插值的过程。
假设我们有以下数据点,(1, 2), (1, 3), (2, 1), (2, 2),我们要使用Hermite插值来找到通过这些点的多项式函数。
首先,我们需要计算每个数据点的导数值。
因为数据点中有重复的x值,我们需要分别计算每个x值对应的导数值。
对于数据点(1, 2)和(1, 3),我们可以假设它们对应的导数值分别为2和3;对于数据点(2, 1)和(2, 2),我们可以假设它们对应的导数值分别为1和2。
接下来,我们将使用这些数据点和导数值来构建Hermite插值多项式。
Hermite插值多项式的一般形式为:\[P(x) = \sum_{i=0}^{n}f[x_0, x_1, \ldots, x_i](x-x_0)(x-x_1)\ldots(x-x_{i-1}) + \sum_{i=0}^{n}f[x_0, x_1,\ldots, x_i, x_i](x-x_0)(x-x_1)\ldots(x-x_{i-1})^2\]其中,\[f[x_0, x_1, \ldots, x_i]\]表示数据点\[x_0, x_1, \ldots, x_i\]处的插值函数值。
这个式子的第一部分表示通过数据点的函数值进行插值,第二部分表示通过数据点的导数值进行插值。
我们可以根据给定的数据点和导数值,计算出Hermite插值多项式。
最终得到的多项式函数就是通过这些数据点进行Hermite插值得到的结果。
总结起来,Hermite插值是一种利用函数值和导数值进行插值的方法,可以更精确地逼近给定的数据点。
通过计算数据点的导数值和使用Hermite插值多项式的公式,我们可以得到一个通过这些数据点的多项式函数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
H ( x) ,
又有 H ( x ) 应满足插值条件 H ( xi ) f ( xi ) , (i 0,1) ,而节点 x0 , x1 上的线性插值函数
N1 ( x ) H( x)
也
满
足
插值条源自件N1 ( xi ) f xi
( i
)
, ,( 故 0可 , 设 1
)
1
N ( x)
0A(
x,其中 ( 为待定常数,上式又可记为 x )x 1 )x A
H ( x ) N1 ( x ) A( x x0 )( x x1 ) f ( x0 ) ( x x0 ) f [ x0 , x1 ] A( x x0 )( x x1 )
为了确定常数 A,对上式求导,得
H ' ( x) f [ x0 , x1 ] A[( x x1 ) ( x x0 )] ,
令 x x0代入, 且注意插值条件 H ( x0 ) f [ x0 , x1 ] A( x0 x1 ) f ( x0 ) ,
' '
f [ x0 , x1 ] f ' ( x0 ) 于是有 A ,即得所求的插值多项式 H ( x ) 为 x1 x0 H ( x ) f ( x0 ) ( x x0 ) f [ x0 , x1 ]
, 当然也可先采用拉格朗日多项式构造,同样得到满足相同条件的插值多项式 H ( x ) 余项为 R( x )
f [ x0 , x1 ] f ' ( x0 ) ( x x0 )( x x1 ) x1 x0
f (3) ( ) ( x x0 )2 ( x x1 ) 。 6
例
若 f ( x) 在[a,b]上有三阶连续导数,且已知 f ( x) 在 [a, b] 上两个互异的
点 x0 , x1 上的函数值 f ( x0 ), f ( x1 ) 和一阶导数值 f ' ( x0 ) ,试求满足条件
H ( x0 ) f ( x0 ), H ( x1 ) f ( x1 ), H ' ( x0 ) f ' ( x0 )