Как получить числовую c производную функцию в python? - PullRequest
2 голосов
/ 24 февраля 2020

Мне интересно знать, как получить производную функцию в Python для составления ряда Тейлора. Я знаю различные методы, чтобы получить производную. Symboli c использует библиотеку SymPy следующим образом:

x = sy.Symbol('x')
y = 3*x**2 + 4*x**3
y.diff(x)

В результате я получаю новую функцию, но ничего не могу сделать с этой функцией.

Второй способ необходимо дифференцировать использование библиотеки scipy следующим образом:

def f(x):
    return 3*x**2 + 4*x**3
sc.derivative(f, 2)

Но она вычисляет производную в некоторой определенной точке.

Но нужно получить просто еще одну функцию f', которая является производной от f.

Кто-нибудь знает, как решить эту проблему?

Большое спасибо.

Ответы [ 3 ]

3 голосов
/ 24 февраля 2020

Используйте evalf ()

from sympy import *
x = Symbol('x')
y = 3*x**2 + 4*x**3
t = y.diff(x)
print(t.evalf(subs={x: 2}))

Результат:

t = y.diff (x)

t = 12 * (x**2) + (6*x)

t.evalf (subs = {x: 2})

t(at x =2) : 60
2 голосов
/ 24 февраля 2020

Просто назначьте производную переменной и используйте эту переменную там, где вы хотите использовать производную. Примите форму уравнения Ньютона-Рафсона: f(x) = f(x0) + (x - x0)/f'(x0). нам нужен f(x). Давайте назовем это fx:

>>> fx = 3*x**2 + 4*x**3

Нам нужна производная. Назовите это f1x:

>>> f1x = fx.diff(x)

Предполагая f(x) = 0, мы вычисляем x из x0 как x = x0 - f(x0)/f'(x0). Мы будем называть x xnew и x0 как x:

>>> xnew = x - fx/f1x; xnew
x - (4*x**3 + 3*x**2)/(12*x**2 + 6*x)

Для вычисления xnew из x = 1 вы используете подстановку (при работе с целыми числами) или вычисление с подстановкой в лучше сохранять точность при работе с Float)

>>> xnew.subs(x, 1)
>>> xnew.subs(x,1)
11/18
>>> xnew.n(subs={x:1})
0.611111111111111

Если вам удобнее работать с формой f(x), вы можете сделать то же самое, как описано ниже (и здесь я просто покажу шаги):

>>> f = Lambda(x, 3*x**2 + 4*x**3)
>>> f1 = Lambda(x, f(x).diff(x))
>>> xnew = x - f(x)/f1(x); xnew
x - (4*x**3 + 3*x**2)/(12*x**2 + 6*x)
>>> xnew.subs(x, 1)
11/18

В любом случае будьте осторожны, чтобы не использовать x в качестве переменной Python для чего-либо, кроме символа SymPy x. Если вы это сделаете, вы потеряете (временно и, возможно, загадочно, если вы новичок в Python / SymPy) вашу способность воссоздать f(x) с x:

>>> f(x)
4*x**3 + 3*x**2
>>> x = 2
>>> f(x)  # now interpreted as f(2)
44

Упс! Давайте x снова указываем на символ

>>>> from sympy.abc import x
>>> f(x)
4*x**3 + 3*x**2

Примечание: если вы хотите, чтобы несколько производных работали одновременно, вы можете сохранить их в списке и получить к ним доступ по порядку производных:

>>> deriv = [f(x).diff(x, i) for i in range(4)]
>>> deriv[2]
6*(4*x + 1)
0 голосов
/ 24 февраля 2020

Не совсем понятно, о чем вы спрашиваете. Однако, кажется, что самым простым способом прояснить вопрос в этом случае было бы предложить решение.

Рассмотрим

from scipy.misc import derivative

def f(x):
    return 3*x**2 + 4*x**3

fprime = lambda x : derivative(f, x, dx=1e-6)
print(fprime(2))

Возвращает

60.000000004833964

Что является цифра c производная. Затем вы можете повторить процесс, чтобы получить функции, которые соответствуют старшим производным, и использовать все это для оценки вашего ряда Тейлора как указано c point.

...