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

私はsympyandの初心者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)

derivしかし、導関数を計算するために他の値を試した後、実際にはであるため、結果が -1、0、または 1 であることがわかりましたsign(-0.5*sqrt(-4*x + 1) + 0.5)

私は何をすべきか?

numpy と sympy の両方がインポートされます。

from sympy import *
import numpy as np

Abs の下にない関数の導関数を見つけようとしても、問題はありません。

4

2 に答える 2

0

おそらく、 の導関数を にしたいだけでしょAbssign。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 に答える