我想使用 python 计算 0.1 中 y=Abs(0.5-0.5*sqrt(1-4*x)) 的导数。
这是我的代码:

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

我是 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 下的函数的导数,则没有问题。

最佳答案

您可能只希望 Abs 的导数是 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

关于python-2.7 - 在python中使用Abs查找函数的导数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20816229/

10-12 20:51