[英]How do i calculate the derivative of Lagrange polynomial Li Function?
目前我一直在尋找拉格朗日多項式 Li 函數的導數。 這就是我寫李function的方式:
def Li(x, xArr, n):
L = 1
resArr = []
for i in range(n):
for j in range(n):
if j == i:
continue
L = L * ((x - xArr[j])/ (xArr[i] - xArr[j]))
resArr.append(round(L,4))
L = 1
return resArr
我想從 function 計算數組結果的導數。 例如,如果我們嘗試對其進行硬編碼,使用給定的 xArr = [10.5, 12] 它將看起來像:
L[0] = (x - xArr[1]) / (xArr[0] - xArr[1]) * (x- xArr[0]) / (xArr[1] - xArr[0])
L[0] = (x - 12)/(10.5 - 12) * (x - 10.5)/(12 - 10.5)
L[0] = (x^2 - 22.5x + 126) / -2.25
然后我們將找到 L[0] 與 function (x^2 - 22.5x + 126) / -2.25的導數,在手動求解中,我們可以稍后插入 x,但如果我們編碼它,我假設代碼必須首先知道 x 值,對吧?
所以,例如我給 x 值 = 11.5,它使 L[0] = 0.3333 的結果
現在我想計算 L[0] 的導數,結果將是:
L'[0] = 2x - 22.5 / -2.25 for x = 11.5
L'[0] = 0.5
有什么辦法嗎? 我嘗試過使用 torch.tensor 和 np.diff,但結果並不令人滿意。 謝謝你。
尚不清楚您想要什么,因此@ombk 的每條評論的更多詳細信息會有所幫助,但是如果您想要 function 的數值導數,您可以這樣做。 請注意,我們使用numpy
對 arrays 進行算術運算,因為基本列表不能這樣工作
import numpy as np
eps = 0.1
L_base = Li(11.5, [10.5, 12], 2)
L_bumped = Li(11.5+eps, [10.5, 12], 2)
derivs = (np.array(L_bumped) - np.array(L_base))/eps
derivs
在這里我們將x
稍微增加一點,重新計算你的函數並查看變化率(這是一階導數的定義)
代碼產生
array([-0.666, 0.666])
這些是L[0]
和L[1]
在x=11.5
處相對於x
的(數值)導數
幾點評論。 你為什么在你的代碼中做round(L,4)
? 它很適合打印結果,但不適用於數值計算,因為您會失去精度。 特別是對於導數,在上面的代碼中將eps
設置為1e-4
不起作用,因為結果被四舍五入
此外,您的“手動”示例是錯誤的,並且與您的代碼不一致。 對於兩個元素的xArr
,'Li' 函數是線性的,所以它應該是
L[0] = (x - xArr[1]) / (xArr[0] - xArr[1])
L[1] = (x- xArr[0]) / (xArr[1] - xArr[0])
最后,您不需要n
作為 function arguments 之一,因為您可以從列表 xArr, n=len(xArr)
中計算它
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.