以下代码为数值计算中 的Lagrange插值公式,Newton插值公式以及Hermite插值公式的python代码实现,代码亲测可用且无误,可放心使用和借鉴~
1.lagrange插值公式
代码:
chazhi_x=[0]+list(map(float,input().split()))
chazhi_y=[0]+list(map(float,input().split()))
x=float(input())
n=len(chazhi_x)
m=len(chazhi_y)
s=[0]+[0]*n
if m!=n:
print("x与y维数不相同,请重新输入")
for i in range(1,n):
d=1.0
for j in range(1,n):
if j!=i:
d*=((x-chazhi_x[j])/(chazhi_x[i]-chazhi_x[j]))
s[i]=d
L=0.0
for i in range(1,n):
L+=chazhi_y[i]*s[i]
print("插值结果为:",L)
2.Newton插值公式
代码:
chazhi_x=list(map(float,input().split()))
chazhi_y=list(map(float,input().split()))
x=float(input())
n=len(chazhi_x)
m=len(chazhi_y)
if n!=m:
print("x与y维数不相同,请重新输入")
D=[[0]*(n) for i in range(n)]
for i in range(n):
D[i][0]=chazhi_y[i]
ans=chazhi_y[0]
t=1.0
for i in range(1,n):
t*=(x-chazhi_x[i-1])
for j in range(i,n):
D[j][i]=(D[j][i-1]-D[j-1][i-1])/(chazhi_x[j]-chazhi_x[j-i])
ans+=D[i][i]*t
print("插值结果为:",ans)
print("差商表如下:")
for i in range(n):
for j in range(n):
print("%.6f"%D[i][j],end='\t')
print()
3.Hermite插值公式
代码:
xi=list(map(float,input().split()))
yi=list(map(float,input().split()))
zi=list(map(float,input().split()))
x=float(input())
if len(xi)==len(yi)==len(zi):
pass
else:
print("维数不相同,请重新输入")
H=0.0
len=len(xi)
for i in range(len):
t1=1.0
t2=0.0
for j in range(len):
if j!=i:
t1=t1*((x-xi[j])/(xi[i]-xi[j]))
t2=t2+1/(xi[i]-xi[j])
alpha=(1-2*(x-xi[i])*t2)*t1*t1
beta=(x-xi[i])*t1*t1
H=H+yi[i]*alpha+zi[i]*beta
print("插值结果为:",H)