Python利用给定的一组坐标,实现三次Hermite差值曲线绘制的函数
时间: 2023-11-27 16:53:02 浏览: 95
下面是利用Python实现三次Hermite差值曲线绘制的函数:
```python
import numpy as np
import matplotlib.pyplot as plt
def hermite_cubic_interpolation(x, y, m):
"""
:param x: 数据点的横坐标,array_like
:param y: 数据点的纵坐标,array_like
:param m: 数据点处的导数,array_like
:return: 返回插值函数 f(x)
"""
n = len(x)
h = np.diff(x)
alpha = np.zeros(n)
for i in range(1, n-1):
alpha[i] = 3/h[i]*(y[i+1]-y[i]) - 3/h[i-1]*(y[i]-y[i-1])
l = np.zeros(n)
mu = np.zeros(n)
z = np.zeros(n)
l[0] = 1
mu[0] = 0
z[0] = 0
for i in range(1, n-1):
l[i] = 2*(x[i+1]-x[i-1])-h[i-1]*mu[i-1]
mu[i] = h[i]/l[i]
z[i] = (alpha[i]-h[i-1]*z[i-1])/l[i]
l[n-1] = 1
z[n-1] = 0
c = np.zeros(n)
b = np.zeros(n-1)
d = np.zeros(n-1)
for j in range(n-2, -1, -1):
c[j] = z[j]-mu[j]*c[j+1]
b[j] = (y[j+1]-y[j])/h[j] - h[j]*(c[j+1]+2*c[j])/3
d[j] = (c[j+1]-c[j])/(3*h[j])
def f(t):
"""
:param t: 自变量,scalar or array_like
:return: 因变量 f(t),scalar or array_like
"""
idx = np.searchsorted(x, t)
if idx == 0:
return y[0] + m[0]*(t-x[0])
elif idx == n:
return y[-1] + m[-1]*(t-x[-1])
else:
i = idx - 1
return y[i] + m[i]*(t-x[i]) + b[i]*(t-x[i])**2 + c[i]*(t-x[i])**3 + d[i]*(t-x[i])**3*(t-x[i+1])
return f
# 示例
x = np.array([0, 1, 2, 3, 4, 5])
y = np.array([0, 1, 3, 2, 1, 2])
m = np.array([1, 2, 3, 4, 5, 6])
f = hermite_cubic_interpolation(x, y, m)
t = np.linspace(0, 5, 1000)
plt.plot(x, y, 'o', t, f(t), '-')
plt.show()
```
其中,`x` 是数据点的横坐标,`y` 是数据点的纵坐标,`m` 是数据点处的导数。函数返回一个函数对象 `f`,通过调用 `f(t)` 可以得到自变量为 `t` 时的因变量值。示例中的数据点和导数都是随意构造的,可以根据具体需求进行修改。
阅读全文
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)