Как вычислить производную полинома Лагранжа функции Ли?

В настоящее время я застрял в поиске производной функции полинома Лагранжа Ли. Вот как я пишу функцию Ли:

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

И я хочу вычислить производные результатов массива от функции. Например, если мы попытаемся жестко запрограммировать его, с данным 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] с этой функцией (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, но результаты неудовлетворительны. Спасибо.


person stucknubie    schedule 29.11.2020    source источник
comment
добавьте больше деталей к своему вопросу, объясните, что вы ожидаете и т. д.   -  person ombk    schedule 29.11.2020


Ответы (1)


Не совсем понятно, чего вы хотите, поэтому было бы полезно получить более подробную информацию о каждом комментарии от @ombk, но если вам нужна числовая производная вашей функции, вы можете сделать это следующим образом. Обратите внимание, что мы используем numpy для арифметических операций с массивами, поскольку базовые списки так не работают.

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 в x=11.5

Несколько комментариев. Почему вы делаете 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 в качестве одного из аргументов функции, так как вы можете просто вычислить его из списка xArr, n=len(xArr)

person piterbarg    schedule 29.11.2020