# Hermite插值
import numpy as np
import matplotlib.pyplot as plt
def f(x): # 函数
return np.exp(x)
def df(x): # 导数
return np.exp(x)
def H3(x, x0, x1, f0, f1, df0, df1): # 定义两点三次 Hermite 插值函数
return (f0 * (1 + 2 * (x - x0) / (x1 - x0)) + df0 * (x - x0)) * ((x - x1) / (x0 - x1)) ** 2 + (
f1 * (1 + 2 * (x - x1) / (x0 - x1)) + df1 * (x - x1)) * ((x - x0) / (x1 - x0)) ** 2
# 插值区间
a = -4
b = 4
N = [1, 2, 3, 5, 8]
k = 0
for n in N:
h = (b - a) / n # 步长
xi = np.linspace(a, b, n + 1) # 插值节点
fi = f(xi) # 对应函数值
dfi = df(xi) # 一阶导数值
x = np.linspace(a, b, 10)
L = len(x)
y = np.zeros((L, 1))
for j in range(0, L):
for k in range(0, n + 1):
if k < n + 1 and xi[k + 1] >= x[j]: # 使用与目标值最接近的两点进行插值计算!
break
y[j] = H3(x[j], xi[k], xi[k + 1], fi[k], fi[k + 1], dfi[k], dfi[k + 1])
plt.plot(x, f(x))
plt.plot(x, y)
plt.title('n=%d' % n)
plt.legend(['f(x)', 'H3(x)'])
plt.xlabel('x label')
plt.ylabel('y label')
plt.show()