SymPy-ソルバー
シンボル=と==はPythonで代入演算子と等式演算子として定義されているため、シンボリック方程式の定式化には使用できません。SymPyは、方程式を設定するためのEq()関数を提供します。
>>> from sympy import *
>>> x,y=symbols('x y')
>>> Eq(x,y)
上記のコードスニペットは、以下の式と同等の出力を提供します-
x = y
x = yは、xy = 0の場合にのみ可能であるため、上記の式は次のように記述できます。
>>> Eq(x-y,0)
上記のコードスニペットは、以下の式と同等の出力を提供します-
x − y = 0
SymPyのソルバーモジュールは、プロトタイプが次のようなsoveset()関数を提供します。
solveset(equation, variable, domain)
ドメインはデフォルトでS.Complexesです。resolveset()関数を使用すると、次のように代数方程式を解くことができます。
>>> solveset(Eq(x**2-9,0), x)
次の出力が得られます-
{−3, 3}
>>> solveset(Eq(x**2-3*x, -2),x)
上記のコードスニペットを実行すると、次の出力が得られます。
{1,2}
ソルブセットの出力は、ソリューションの有限集合です。解決策がない場合は、EmptySetが返されます
>>> solveset(exp(x),x)
上記のコードスニペットを実行すると、次の出力が得られます。
$\varnothing$
一次方程式
線形方程式を解くには、linsolve()関数を使用する必要があります。
たとえば、方程式は次のとおりです。
xy = 4
x + y = 1
>>> from sympy import *
>>> x,y=symbols('x y')
>>> linsolve([Eq(x-y,4),Eq( x + y ,1) ], (x, y))
上記のコードスニペットを実行すると、次の出力が得られます。
$\lbrace(\frac{5}{2},-\frac{3}{2})\rbrace$
linsolve()関数は、行列形式で表現された線形方程式を解くこともできます。
>>> a,b=symbols('a b')
>>> a=Matrix([[1,-1],[1,1]])
>>> b=Matrix([4,1])
>>> linsolve([a,b], (x,y))
上記のコードスニペットを実行すると、次の出力が得られます-
$\lbrace(\frac{5}{2},-\frac{3}{2})\rbrace$
非線形方程式
この目的のために、nonlinsolve()関数を使用します。この例の方程式-
a 2 + a = 0 ab = 0
>>> a,b=symbols('a b')
>>> nonlinsolve([a**2 + a, a - b], [a, b])
上記のコードスニペットを実行すると、次の出力が得られます-
$\lbrace(-1, -1),(0,0)\rbrace$
微分方程式
まず、cls = Functionをsymbols関数に渡して、未定義の関数を作成します。微分方程式を解くには、dsolveを使用します。
>>> x=Symbol('x')
>>> f=symbols('f', cls=Function)
>>> f(x)
上記のコードスニペットを実行すると、次の出力が得られます。
f(x)
ここで、f(x)は未評価の関数です。その導関数は次のとおりです-
>>> f(x).diff(x)
上記のコードスニペットは、以下の式と同等の出力を提供します-
$\frac{d}{dx}f(x)$
まず、次の微分方程式に対応するEqオブジェクトを作成します
>>> eqn=Eq(f(x).diff(x)-f(x), sin(x))
>>> eqn
上記のコードスニペットは、以下の式と同等の出力を提供します-
$-f(x) + \frac{d}{dx}f(x)= \sin(x)$
>>> dsolve(eqn, f(x))
上記のコードスニペットは、以下の式と同等の出力を提供します-
$f(x)=(c^1-\frac{e^-xsin(x)}{2}-\frac{e^-xcos(x)}{2})e^x$