當(dāng)前位置:
首頁 >
埃尔米特插值(等距节点,只用一个点的导数构造n+1阶Hermite多项式)Python实现
發(fā)布時(shí)間:2025/4/16
47
豆豆
生活随笔
收集整理的這篇文章主要介紹了
埃尔米特插值(等距节点,只用一个点的导数构造n+1阶Hermite多项式)Python实现
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
函數(shù)
y=11+x2y=11+x2
埃爾米特插值
埃爾米特多項(xiàng)式構(gòu)造方法有很多種。
這里只是用最簡單的一種,通過均差來進(jìn)行構(gòu)造,最后再通過任意一個(gè)點(diǎn)的導(dǎo)數(shù)來計(jì)算出一個(gè)待定系數(shù)(這里假設(shè)的是m)。
下面代碼中使用的是第一個(gè)點(diǎn)的導(dǎo)數(shù)相等來作為限制,算出這個(gè)多項(xiàng)式。
插值效果
代碼
下面代碼就是根據(jù)之前的拉格朗日插值改進(jìn)得到的。所以那個(gè)label那個(gè)就是用拉格朗日的做默認(rèn)值
有必要解釋一下,ff(x)這個(gè)函數(shù),只能傳一個(gè)數(shù)組類型,然后算的這個(gè)數(shù)組的均差。
注意到,這里算出的來的跟之前直接用拉格朗日算出的來數(shù)值loss的絕對(duì)值均值基本相等。
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插值函數(shù)'):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='原函數(shù)')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插值多項(xiàng)式(-5點(diǎn)導(dǎo)數(shù)相等)')lossCal(P)總結(jié)
以上是生活随笔為你收集整理的埃尔米特插值(等距节点,只用一个点的导数构造n+1阶Hermite多项式)Python实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python求偏导
- 下一篇: 拉格朗日插值--11次切比雪夫多项式零点