- SymPy 教程
- SymPy - 首頁
- SymPy - 簡介
- SymPy - 安裝
- SymPy - 符號計算
- SymPy - 數值
- SymPy - 符號
- SymPy - 替換
- SymPy - sympify() 函式
- SymPy - evalf() 函式
- SymPy - Lambdify() 函式
- SymPy - 邏輯表示式
- SymPy - 查詢
- SymPy - 簡化
- SymPy - 導數
- SymPy - 積分
- SymPy - 矩陣
- SymPy - 函式類
- SymPy - 四元數
- SymPy - 求解器
- SymPy - 繪圖
- SymPy - 實體
- SymPy - 集合
- SymPy - 列印
- SymPy 有用資源
- SymPy - 快速指南
- SymPy - 有用資源
- SymPy - 討論
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$