5

我想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, in <module>
    print d(0.1)
  File "<string>", line 1, in <lambda>
NameError: global name 'Derivative' is not defined

我是 and 的新手sympynumpy所以我想我使用错误的方法来确定导数。

编辑:我打印了 deriv,这就是我得到的:

在此处输入图像描述

阅读此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)

但是在尝试了其他值来计算导数之后,我发现结果是 -1、0 或 1,因为deriv实际上是sign(-0.5*sqrt(-4*x + 1) + 0.5).

我应该怎么办?

numpy 和 sympy 都被导入:

from sympy import *
import numpy as np

如果我尝试找到不在 Abs 下的函数的导数,则没有问题。

4

2 回答 2

6

这比其他任何事情都更像是一个数学问题。

>>> 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
于 2013-12-28T20:44:16.350 回答
0

您可能只想要Absto的导数sign。SymPy 确实这样做了,但前提是它可以推断出绝对值的参数是真实的,在这种情况下它不能(即使x是真实的)。

您可以通过子类化和覆盖该方法来制作自己的自定义版本,Abs该版本总是很容易使用:sign_eval_derivative

class MyAbs(Abs):
    def _eval_derivative(self, x):
        return Derivative(self.args[0], x, evaluate=True)*sign(conjugate(self.args[0]))

.

In [110]: x = Symbol('x')

In [111]: y = MyAbs(0.5-0.5*sqrt(1-4*x))

In [112]: deriv = y.diff(x)

In [113]: print(deriv)
1.0*sign(-0.5*conjugate(sqrt(-4*x + 1)) + 0.5)/sqrt(-4*x + 1)

In [114]: lambdify(x, deriv, 'numpy')(0.1)
Out[114]: 1.29099444874
于 2013-12-29T04:53:09.203 回答