#python #polynomials #derivative
#python #многочлены #производная
Вопрос:
В настоящее время я застрял в поиске производной функции Li полинома Лагранжа. Вот как я пишу функцию Li :
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.33333
и теперь я хочу вычислить производную от L[0], и результат будет :
L'[0] = 2x - 22.5 / -2.25 for x = 11.5
L'[0] = 0.5
Есть ли какие-либо способы сделать это? Я пытался использовать torch.tensor и использовать np.diff, но результаты не удовлетворяют. Спасибо.
Комментарии:
1. добавьте больше деталей к вашему вопросу, объясните, чего вы ожидаете и т.д…
Ответ №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
небольшую величину, пересчитываем yourfunction и видим скорость изменения (которая является определением первой производной)
Код выдает
array([-0.666, 0.666])
это (числовые) производные L[0]
и L[1]
по отношению к x
at 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)