Mil*_*los 5 numpy sympy derivative python-2.7
我想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)
Run Code Online (Sandbox Code Playgroud)
这是我得到的:
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
Run Code Online (Sandbox Code Playgroud)
我是一个新手,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)
Run Code Online (Sandbox Code Playgroud)
但是,在尝试了其他值以计算导数之后,我发现结果deriv实际上是-1、0或1 sign(-0.5*sqrt(-4*x + 1) + 0.5)。
我该怎么办?
numpy和sympy都被导入:
from sympy import *
import numpy as np
Run Code Online (Sandbox Code Playgroud)
如果我尝试查找不在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)
Run Code Online (Sandbox Code Playgroud)
注意,有一个实部和一个虚部。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
Run Code Online (Sandbox Code Playgroud)
您可能只想求 的导数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]))
Run Code Online (Sandbox Code Playgroud)
。
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1632 次 |
| 最近记录: |