我想使用 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
我是
sympy
和 numpy
的新手,所以我想我使用了错误的方法来确定导数。编辑:我打印了 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/