埃尔米特插值(等距节点,只用一个点的导数构造n+1阶Hermite多项式)Python实现
生活随笔
收集整理的這篇文章主要介紹了
埃尔米特插值(等距节点,只用一个点的导数构造n+1阶Hermite多项式)Python实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
函數
y=11+x2y=11+x2
埃爾米特插值
埃爾米特多項式構造方法有很多種。
這里只是用最簡單的一種,通過均差來進行構造,最后再通過任意一個點的導數來計算出一個待定系數(這里假設的是m)。
下面代碼中使用的是第一個點的導數相等來作為限制,算出這個多項式。
插值效果
代碼
下面代碼就是根據之前的拉格朗日插值改進得到的。所以那個label那個就是用拉格朗日的做默認值
有必要解釋一下,ff(x)這個函數,只能傳一個數組類型,然后算的這個數組的均差。
注意到,這里算出的來的跟之前直接用拉格朗日算出的來數值loss的絕對值均值基本相等。
import numpy as np from sympy import * import matplotlib.pyplot as pltdef f(x):return 1 / (1 + x ** 2)def ff(x): # f[x0, x1, ..., xk]ans = 0for i in range(len(x)):temp = 1for j in range(len(x)):if i != j:temp *= (x[i] - x[j])ans += f(x[i]) / tempreturn ansdef draw(L, newlabel= 'Lagrange插值函數'):plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = Falsex = np.linspace(-5, 5, 100)y = f(x)Ly = []for xx in x:Ly.append(L.subs(n, xx))plt.plot(x, y, label='原函數')plt.plot(x, Ly, label=newlabel)plt.xlabel('x')plt.ylabel('y')plt.legend()plt.savefig('1.png')plt.show()def lossCal(L):x = np.linspace(-5, 5, 101)y = f(x)Ly = []for xx in x:Ly.append(L.subs(n, xx))Ly = np.array(Ly)temp = Ly - ytemp = abs(temp)print(temp.mean())def calM(P, x):Y = 1 / (1 + n ** 2)dfP = diff(P, n)return solve(Y.subs(n, x[0]) - dfP.subs(n, x[0]), [m,])[0]if __name__ == '__main__':x = np.array(range(11)) - 5y = f(x)n, m = symbols('n m')init_printing(use_unicode=True)P = f(x[0])for i in range(len(x)):if i != len(x) - 1:temp = ff(x[0:i + 2])else:temp = mfor j in x[0:i + 1]:temp *= (n - j)P += tempP = expand(P)P = P.subs(m, calM(P, x))draw(P, newlabel='Hermite插值多項式(-5點導數相等)')lossCal(P)總結
以上是生活随笔為你收集整理的埃尔米特插值(等距节点,只用一个点的导数构造n+1阶Hermite多项式)Python实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python求偏导
- 下一篇: 拉格朗日插值--11次切比雪夫多项式零点