我想y=Abs(0.5-0.5*sqrt(1-4*x))
使用python 计算0.1的导数。这是我的代码:
x=Symbol('x') y=Abs(0.5-0.5*sqrt(1-4*x)) deriv=y.diff(x) d=lambdify(x,deriv,'numpy') print d(0.1)
这是我得到的:
Traceback (most recent call last): File "/home/milossimic/g4/s1/.../optimize.py", line 100, inprint d(0.1) File " ", line 1, in NameError: global name 'Derivative' is not defined
我是一个新手,sympy
而且numpy
,所以我想我使用了错误的方法来确定衍生物。
编辑:我打印了派生,这就是我得到的:
阅读此http://docs.sympy.org/dev/modules/functions/elementary.html之后,我尝试了fdiff()
:
x=Symbol('x') y=Abs(0.5-0.5*sqrt(1-4*x)) deriv=y.fdiff() d=lambdify(x,deriv,'numpy') print d(0)
但是,在尝试了其他值以计算导数之后,我发现结果deriv
实际上是-1、0或1 sign(-0.5*sqrt(-4*x + 1) + 0.5)
。
我该怎么办?
numpy和sympy都被导入:
from sympy import * import numpy as np
如果我尝试查找不在Abs下的函数的派生,则没有问题。
这比任何其他问题都更是一个数学问题。
>>> import sympy >>> x = sympy.symbols('x') >>> def f(x): ... return abs(x) ... >>> dx = f(x).diff(x) >>> dx (re(x)*Derivative(re(x), x) + im(x)*Derivative(im(x), x))/Abs(x)
注意,有一个实部和一个虚部。abs(x)在每个实数x处都是可微的,但为零。但是,涉及到复杂的值时存在一些问题(由于我不知道复杂的差异,所以无法解释)。我猜想sympy没有实现,因此返回Derivative(f)
而不是f的实际导数。
如果您只使用实数,则只需使用x = sympy.symbols('x', real=True)
:
>>> import sympy >>> x = sympy.symbols('x', real=True) >>> def f(x): ... return abs(0.5-0.5*(1-4*x)**0.5) ... >>> dx = f(x).diff(x) >>> dx (1.0*(-0.5*re((-4*x + 1)**0.5) + 0.5)*re((-4*x + 1)**(-0.5)) - 0.5*im((-4*x + 1)**(-0.5))*im((-4*x + 1)**0.5))/Abs(-0.5*(-4*x + 1)**0.5 + 0.5) >>> dx_ = sympy.lambdify(x, dx) >>> dx_(0.1) 1.2909944487358056