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$