如何在python中获得数值导数函数?

问题描述 投票:2回答:3

我想知道如何在Python中获得派生函数以构成泰勒级数。我知道获得导数的各种方法。使用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的派生词。

有人知道要解决吗?

非常感谢。

python sympy derivative
3个回答
2
投票

只需将导数分配给变量,然后在要使用导数的位置使用该变量。采用牛顿-拉夫森方程的等式形式: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计算出x0x = x0 - f(x0)/f'(x0)。我们将x xnewx0称为x

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

要从xnew计算x = 1,请使用替换(使用整数时)或使用带替换的求值以更好地在使用浮点数时保留精度)

>>> 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 Symbol 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)

3
投票

使用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

0
投票

尚不清楚您要问什么。但是,在这种情况下,澄清问题的最简单方法似乎是提出解决方案。

考虑

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

哪个是数字导数。然后,您可以重复此过程以获取与高阶导数相对应的函数,并使用所有这些方法在特定点上评估taylor系列。

© www.soinside.com 2019 - 2024. All rights reserved.