簡體   English   中英

我如何計算拉格朗日多項式 Li Function 的導數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM