Pythonsympyシンボル

Nov 01 2020

「x」と「z」を記号として使用する場合、このコードに問題はありません。

from sympy import *
x, z = symbols('x z')
y = -6*x**2 + 2*x*z**0.5 + 50*x - z
solve((diff(y, x), diff(y, z)))
y.subs({x: 5, z: 25})

しかし、「q」と「a」を使用すると、solveでは解決策が得られません。

q, a = symbols('q a')
y = -6*q**2 + 2*q*a**0.5 + 50*q - a
solve((diff(y, q), diff(y, a)))
y.subs({q: 5, a: 25})

ご覧のとおり、「subs」を使用して、目的関数にタイプミスがないことを確認します。

更新:「シンボル」を使用して各変数を個別に設定しましたが、「q」と「a」を使用しても機能しません。

# This works
x = Symbol('x')
z = Symbol('z')
y = -6*x**2 + 2*x*z**0.5 + 50*x - z
solve((diff(y, x), diff(y, z)))

# This does not work
q = Symbol('q')
a = Symbol('a')
y = -6*q**2 + 2*q*a**0.5 + 50*q-a
solve((diff(y, q), diff(y, a)))

ありがとうございました。

回答

5 Marcin Nov 02 2020 at 00:00

とった!

それはすべて、変数のアルファベット順に依存します。

最初の例でとの代わりに使用xするzzx動作も停止します。

内部的にsolveは式を関数_solveに送信し、関数はsympy.solvers方程式を解こうとして何度も失敗します。

最後に、最後の努力として、それが解決しようとする-sqrt(a) + qx - sqrt(z)、内部関数を介してシンボルを選択することによって、_ok_symsそれらをアルファベット順にソートする引数を使用します(この引数がなくても、それでもそうreversedなりますが、それでラップすると、魔法のように例が機能します正反対の方法で)。

そして、それはx - sqrt(z)asx: sqrt(z)-sqrt(a) + qasを解決しa: q**2ます。

前者の場合は簡単に解けるようになりますが、後者の場合は単純化できないため50 - 10*sqrt(z)失われます。-12*q + 2*sqrt(q**2) + 50sqrt(q**2)

出典:多くのテスト: https://github.com/sympy/sympy/blob/master/sympy/solvers/solvers.py