SymPy - 求解器



由於符號 = 和 == 在 Python 中分別定義為賦值運算子和相等運算子,因此它們不能用於構建符號方程。SymPy 提供了 Eq() 函式來設定方程。

>>> from sympy import * 
>>> x,y=symbols('x y') 
>>> Eq(x,y)

以上程式碼片段給出的輸出等效於以下表達式:

x = y

由於 x=y 成立當且僅當 x-y=0,因此上述方程可以寫成:

>>> Eq(x-y,0)

以上程式碼片段給出的輸出等效於以下表達式:

x − y = 0

SymPy 中的求解器模組提供了 solveset() 函式,其原型如下:

solveset(equation, variable, domain)

預設情況下,域為 S.Complexes。使用 solveset() 函式,我們可以如下求解代數方程:

>>> solveset(Eq(x**2-9,0), x)

得到以下輸出:

{-3, 3}

>>> solveset(Eq(x**2-3*x, -2),x)

執行以上程式碼片段後,得到以下輸出:

{1,2}

solveset 的輸出是解的有限集。如果沒有解,則返回空集

>>> solveset(exp(x),x)

執行以上程式碼片段後,得到以下輸出:

$\varnothing$

線性方程

我們必須使用 linsolve() 函式來求解線性方程。

例如,方程如下:

x-y=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() 函式。此示例的方程為:

a2+a=0 a-b=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$

廣告

© . All rights reserved.