Python科學計算庫SymPy初探


SymPy基礎應用

 

 

 

SymPy基礎應用

 

Rational值

SymPy 具有用於處理有理數的Rational。 有理數是可以表示為兩個整數(分子 p 和非零分母 q)的商或分數 p / q 的任何數字。

In [1]:
from sympy import Rational

r = Rational(1/10)

val = r * 3
print(val.evalf())

val2 = 1/10 * 3
print(val2)
 
0.300000000000000
0.30000000000000004
In [2]:
print(type(val))
print(type(val2))
 
<class 'sympy.core.numbers.Rational'>
<class 'float'>
In [3]:
print(val.evalf())
print(val2)
 
0.300000000000000
0.30000000000000004
 

SymPy pprint

pprint()用於在控制台上漂亮地打印輸出。 LaTeX 可以達到最佳效果,例如 在 Jupyter 筆記本中。

prettify.py

In [4]:
from sympy import pprint, Symbol, exp, sqrt
from sympy import init_printing

init_printing(use_unicode=True)  # 對於某些字符,我們需要啟用 unicode 支持

x = Symbol('x')

a = sqrt(2)
pprint(a)
print(a)

print("------------------------")

c = (exp(x) ** 2)/2
pprint(c)
print(c)
 
√2
sqrt(2)
------------------------
 2⋅x
ℯ   
────
 2  
exp(2*x)/2
 

平方根

平方根是一個數字,乘以它會產生指定的數量。

In [5]:
from sympy import sqrt, pprint, Mul

x = sqrt(2)
y = sqrt(2)

pprint(Mul(x,  y, evaluate=False))  # 使用evaluate屬性推遲對乘法表達式的求值。
print('equals to ')
print(x * y)
 
√2⋅√2
equals to 
2
In [6]:
Mul(x,y)
Out[6]:
$\displaystyle 2$
 

SymPy 符號

符號計算適用於符號,以后可以對其進行求值。 使用符號之前,必須在 SymPy 中定義符號。

In [7]:
from sympy import Symbol, symbols
from sympy.abc import x, y

expr = 2*x + 5*y
print(expr)

a = Symbol('a')
b = Symbol('b')

expr2 = a*b + a - b
print(expr2)

i, j = symbols('i j')
expr3 = 2*i*j + i*j
print(expr3) 
 
2*x + 5*y
a*b + a - b
3*i*j
 

from sympy.abc import x, y 可以從sympy.abc模塊導入符號。 它將所有拉丁字母和希臘字母導出為符號,因此我們可以方便地使用它們。

 

SymPy 規范表達形式

SymPy 會自動將表達式轉換為規范形式。 SymPy 僅執行廉價操作; 因此,表達式可能無法求值為最簡單的形式。

In [8]:
from sympy.abc import a, b
expr = b*a + -4*a + b + a*b + 4*a + (a + b)*3
print(expr)
 
2*a*b + 3*a + 4*b
 

SymPy 擴展代數表達式

使用expand(),我們可以擴展代數表達式; 即該方法嘗試消除冪和乘法。

In [9]:
from sympy import expand, pprint
from sympy.abc import x

expr = (x + 1) ** 2

pprint(expr)

print('-----------------------')
print('-----------------------')

expr = expand(expr)
pprint(expr)
 
       2
(x + 1) 
-----------------------
-----------------------
 2          
x  + 2⋅x + 1
 

SymPy 簡化表達式

可以使用simplify()將表達式更改為更簡單的形式。

In [10]:
from sympy import sin, cos, simplify, pprint
from sympy.abc import x,y

expr = sin(x+y) / (sin(y)*cos(x))

pprint(expr)

print('-----------------------')

expr = simplify(expr)
pprint(expr)
 
  sin(x + y) 
─────────────
sin(y)⋅cos(x)
-----------------------
tan(x)    
────── + 1
tan(y)    
 

SymPy 比較表達式

SymPy 表達式與equals()而不是==運算符進行比較。

In [11]:
from sympy import pprint, Symbol, sin, cos

x = Symbol('x')

a = cos(x)**2 - sin(x)**2
b = cos(2*x)

print(a.equals(b)) #  在應用該方法之前,SymPy 嘗試簡化表達式。

# we cannot use == operator
print(a == b)
 
True
False
 

SymPy 求值表達式

可以通過替換符號來求值表達式。

In [12]:
from sympy import pi
print(pi.evalf(10))  # 保留十位有效數字
 
3.141592654
In [13]:
# 通過用數字替換a和b符號來求值表達式
from sympy.abc import a, b
from sympy import pprint
expr = b*a + -4*a + b + a*b + 4*a + (a + b)*3
print(expr.subs([(a, 3), (b, 2)]))
 
29
 

SymPy 求解方程

solve()solveset()求解方程。

In [14]:
from sympy import Symbol, solve
x = Symbol('x')
sol = solve(x**2 - x, x)
print(sol)
 
[0, 1]
 

solve()的第一個參數是公式。 該公式以適合 SymPy 的特定形式編寫; 即x**2 - x代替x**2 = x。 第二個參數是我們需要解決的符號。

或者,我們可以將Eq用於公式。

In [15]:
from sympy import pprint, Symbol, Eq, solve
x = Symbol('x')
eq1 = Eq(x + 1, 4)
pprint(eq1)
sol = solve(eq1, x)
print(sol)
 
x + 1 = 4
[3]
In [16]:
from sympy.solvers import solveset
from sympy import Symbol, Interval, pprint

x = Symbol('x')

sol = solveset(x**2 - 1, x, Interval(0, 50))
print(sol)
 
{1}
 

使用solveset(),我們找到了給定間隔的解決方案。

 

SymPy 序列

序列是其中允許重復的對象的枚舉集合。 序列可以是有限的或無限的。 元素的數量稱為序列的長度。 與集合不同,同一元素可以在序列中的不同位置出現多次。 元素的順序很重要。

In [17]:
from sympy import summation, sequence, pprint
from sympy.abc import x

s = sequence(x, (x, 1, 10))
print(s)
pprint(s)
print(list(s))

print(s.length)

print(summation(s.formula, (x, s.start, s.stop)))
# print(sum(list(s)))
 
SeqFormula(x, (x, 1, 10))
[1, 2, 3, 4, …]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
10
55
 

SymPy 極限

極限是函數(或序列)“接近”作為輸入(或索引)“接近”某個值的值。

In [18]:
from sympy import sin, limit, oo
from sympy.abc import x,y

l1 = limit(1/x, x, oo)
print(l1)

l2 = limit(exp(x)/(y), x, 1)
print(l2)
 
0
E/y
 

SymPy 矩陣

在 SymPy 中,我們可以使用矩陣。 矩陣是數字或其他數學對象的矩形數組,為其定義了運算(例如加法和乘法)。

矩陣用於計算,工程或圖像處理。

In [19]:
from sympy import Matrix, pprint

M = Matrix([[1, 2], [3, 4], [0, 3]])
print(M)
pprint(M)

N = Matrix([2, 2])

print("---------------------------")
print("M * N")
print("---------------------------")

pprint(M*N)
 
Matrix([[1, 2], [3, 4], [0, 3]])
⎡1  2⎤
⎢    ⎥
⎢3  4⎥
⎢    ⎥
⎣0  3⎦
---------------------------
M * N
---------------------------
⎡6 ⎤
⎢  ⎥
⎢14⎥
⎢  ⎥
⎣6 ⎦
 

SymPy 繪圖

SymPy 包含用於繪圖的模塊。 它基於 Matplotlib 構建。

In [20]:
import sympy
from sympy.abc import x
from sympy.plotting import plot
plot(sin(x))
 
<Figure size 640x480 with 1 Axes>
Out[20]:
<sympy.plotting.plot.Plot at 0x227ddeceec8>
 

一元函數的導函數

In [21]:
from sympy import *
x = symbols('x')
expr = sin(x) * exp(x)
pprint(diff(expr, x))
 
 x           x       
ℯ ⋅sin(x) + ℯ ⋅cos(x)
 

求不定積分

In [22]:
from sympy import *
x = symbols('x')
expr = exp(x) * sin(x) + exp(x) * cos(x)
pprint(integrate(expr, x))
 
 x       
ℯ ⋅sin(x)
 

求定積分

In [23]:
from sympy import *
x = symbols('x')
expr = exp(x) * sin(x) + exp(x) * cos(x)
pprint(integrate(expr, x, (x,-oo,oo)))
 
<-∞, ∞>
 

求微分方程的解

In [24]:
from sympy import *
y = Function('y')
t = Symbol('t')
sol = dsolve(Eq(y(t).diff(t, t) - y(t), exp(t)), y(t))
print(sol)
 
Eq(y(t), C2*exp(-t) + (C1 + t/2)*exp(t))
 

打印latex公式

In [25]:
from sympy import *
x = symbols('x')
expr = cos(x)**2
latex(Integral(expr, (x, 0, pi)))
Out[25]:
'\\int\\limits_{0}^{\\pi} \\cos^{2}{\\left(x \\right)}\\, dx'
In [26]:
latex(expr)
Out[26]:
'\\cos^{2}{\\left(x \\right)}'
In [27]:
pprint(Integral(expr, (x, 0, pi)))
 
π           
⌠           
⎮    2      
⎮ cos (x) dx
⌡           
0           
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM