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するzとz、x動作も停止します。
内部的にsolveは式を関数_solveに送信し、関数はsympy.solvers方程式を解こうとして何度も失敗します。
最後に、最後の努力として、それが解決しようとする-sqrt(a) + qかx - 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