如何得到python中的数值导数函数?
How to get a numeric derivative function in python?
我想知道如何得到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
的导数。
有谁知道如何解决吗?
非常感谢。
你问的不是很清楚。然而,在这种情况下澄清问题的最简单方法似乎是提出解决方案。
考虑
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))
Returns
60.000000004833964
这是一个数值导数。然后,您可以重复该过程以获得对应于高阶导数的函数,并使用所有这些在特定点评估您的泰勒级数。
使用 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
只需将导数分配给一个变量,然后在您想要使用导数的地方使用该变量。采用方程的牛顿-拉夫森形式: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
我们从 x0
计算 x
为 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)
要从 x = 1
计算 xnew
,您可以使用替换(使用整数时)或使用替换求值以在使用浮点数时更好地保持准确性)
>>> 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
用作 SymPy 符号 x 以外的任何变量的 Python。如果你这样做,你将失去(暂时的,也许是神秘的,如果你是 Python/SymPy 的新手)你用 x
:
重建 f(x)
的能力
>>> f(x)
4*x**3 + 3*x**2
>>> x = 2
>>> f(x) # now interpreted as f(2)
44
糟糕!让我们 x
再次指向一个 Symbol
>>>> 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)
我想知道如何得到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
的导数。
有谁知道如何解决吗?
非常感谢。
你问的不是很清楚。然而,在这种情况下澄清问题的最简单方法似乎是提出解决方案。
考虑
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))
Returns
60.000000004833964
这是一个数值导数。然后,您可以重复该过程以获得对应于高阶导数的函数,并使用所有这些在特定点评估您的泰勒级数。
使用 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
只需将导数分配给一个变量,然后在您想要使用导数的地方使用该变量。采用方程的牛顿-拉夫森形式: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
我们从 x0
计算 x
为 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)
要从 x = 1
计算 xnew
,您可以使用替换(使用整数时)或使用替换求值以在使用浮点数时更好地保持准确性)
>>> 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
用作 SymPy 符号 x 以外的任何变量的 Python。如果你这样做,你将失去(暂时的,也许是神秘的,如果你是 Python/SymPy 的新手)你用 x
:
f(x)
的能力
>>> f(x)
4*x**3 + 3*x**2
>>> x = 2
>>> f(x) # now interpreted as f(2)
44
糟糕!让我们 x
再次指向一个 Symbol
>>>> 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)