您现在的位置是:首页 >技术杂谈 >分段三次Hermite插值的原理、matlab代码和Python代码网站首页技术杂谈
分段三次Hermite插值的原理、matlab代码和Python代码
简介python埃尔米特插值
目录
一、分段三次Hermite插值
已知,求一个分段函数H(x),使其满足:
(1)
(2)在每个子区间 上,H(x)是次数不超过3的多项式。
称满足上述条件的函数H(x)为分段三次Hermite插值多项式。
二、分段三次Hermite插值多项式的推导
采用基函数的方法来构造。
将表示为:
其中为插值函数,且均为次数不超过3的多项式。为满足插值条件,它们应满足:
,
由于,故含有因子。可设
其中a,b为待定系数。
由,可得。
由,可得。
将a,b代入得
类似地,将互换,可得:
由于,故含有因子。可设
其中c为待定系数。
由,可得。
类似地, 将互换,可得:
综上所述,三次Hermite插值多项式 的表达式为:
可以证明,其余项为:
其中,介于之间。
注:
作为多项式插值,三次已经是较高的次数,次数再高就有可能发生Runge现象,因此,对有n+1节点的插值问题,我们可以使用分段两点三次Hermite插值。
三、分段三次Hermite插值的matlab实现
例:已知f(x)在节点1,2处的函数值为f(1)=2,f(2)=3,f(x)在节点1,2处的导数值为。求f(x)的两点三次插值多项式及f(x)在x=1.5,1.7处的函数值。
function Hermite(A,B,C)
%输入 A代表分段三次Hermite插值所对应的节点
% B代表节点对应的函数值
% C代表节点对应的一阶导数值
%输出 f代表分段三次Hermite插值多项式
syms x a1 a2 b1 b2 df f
a1=(1+2*(x-A(1))/(A(2)-A(1)))*((x-A(2))/(A(1)-A(2)))^2
a2=(1+2*(x-A(2))/(A(1)-A(2)))*((x-A(1))/(A(2)-A(1)))^2
b1=(x-A(1))*((x-A(2))/(A(1)-A(2)))^2
b2=(x-A(2))*((x-A(1))/(A(2)-A(1)))^2
df=B(1)*a1+B(2)*a2+C(1)*b1+C(2)*b2
f=collect(df,x)
在命令行窗口中输入:
>> A=[1,2];
>> B=[2,3];
>> C=[0,-1];
>> Hermite(A,B,C)
最后得到的结果如下:
a1 =
(2*x - 1)*(x - 2)^2
a2 =
-(2*x - 5)*(x - 1)^2
b1 =
(x - 1)*(x - 2)^2
b2 =
(x - 1)^2*(x - 2)
df =
2*(2*x - 1)*(x - 2)^2 - (x - 1)^2*(x - 2) - 3*(2*x - 5)*(x - 1)^2
f =
- 3*x^3 + 13*x^2 - 17*x + 9
因此,f(x)的两点三次插值多项式是:
四、分段三次Hermite插值的Python实现
同样采用上面的例子。
from sympy import *
def Hermite(A,B,C):
x=Symbol('x')
a1=Symbol('a1')
a2=Symbol('a2')
b1=Symbol('b1')
b2=Symbol('b2')
df=Symbol('df')
f=Symbol('f')
a1=(1+2*(x-A[0])/(A[1]-A[0]))*((x-A[1])*(A[0]-A[1]))**2
a2=(1+2*(x-A[1])/(A[0]-A[1]))*((x-A[0])/(A[1]-A[0]))**2
b1=(x-A[0])*((x-A[0])/(A[1]-A[0]))**2
b2=(x-A[1])*((x-A[0])*(A[1]-A[0]))**2
df=B[0]*a1+B[1]*a2+C[0]*b1+C[1]*b2
f=factor(df)
return(f)
A=[1,2]
B=[2,3]
C=[0,-1]
f=Hermite(A,B,C)
print(f)
结果如下:
-3*x**3 + 13*x**2 - 17*x + 9
因此,f(x)的两点三次插值多项式是:
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。