我想知道如何在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
的派生词。
有人知道要解决吗?
非常感谢。
只需将导数分配给变量,然后在要使用导数的位置使用该变量。采用牛顿-拉夫森方程的等式形式: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
,请使用替换(使用整数时)或使用带替换的求值以更好地在使用浮点数时保留精度)
>>> 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)
使用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
尚不清楚您要问什么。但是,在这种情况下,澄清问题的最简单方法似乎是提出解决方案。
考虑
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系列。