Python圈中的符號計算庫-Sympy

Python圈中的符號計算庫-Sympy

import math
math.sqrt(8)
2.8284271247461903

我們知道,

Python圈中的符號計算庫-Sympy

那麼我們看看Python中結果


math.sqrt(8).math.sqrt(8)
8.000000000000002

本以爲會得到8.0,但沒想到得到8.000000000000002。

一、爲什麼會這樣?
簡單的說Python對給定的一個有限位數的數字進行計算,python認爲

Python圈中的符號計算庫-Sympy

那麼

Python圈中的符號計算庫-Sympy
此外

經歷過高中數學的朋友們估計會很熟悉下面這樣的表達

Python圈中的符號計算庫-Sympy

而不是

Python圈中的符號計算庫-Sympy

如果我們平常計算的任務常常有類似於上面的例子這樣的表達式,那麼直接用python計算其結果只是真實值的逼近。如果這樣的計算很大很多,誤差會逐漸積累,這是我們不能忍受的,所以這時候就需要Python能處理

Python圈中的符號計算庫-Sympy

這種數學符號計算。

二、什麼是數學符號計算?
數學符號計算能處理表徵數字的符號計算。這意味着數學對象被精確地表示,而不是近似地表示,而具有未被計算的變量的數學表達式被留在符號形式中。

sympy庫簡介
SymPy是Python的一個數學符號計算庫。它目的在於成爲一個富有特色的計算機代數系統。它保證自身的代碼儘可能的簡單,且易於理解,容易擴展。SymPy完全由Python寫成,不需要額外的庫。

sympy的表達式與我們平常的手寫的數學表達式略微有所區別,下面是sympy的方程表示符號

  • 加號 +

  • 減號 -

  • 除號 /

  • 乘號 *

  • 等號 Eq()

  • 指數 **

  • 對數 log()

  • e的指數次冪 exp()

上面的例子我們用Python實現一下。


import sympy
sympy.sqrt(8)
2*sqrt(2)

用sympy計算

Python圈中的符號計算庫-Sympy


sympy.sqrt(8)*sympy.sqrt(8)
8

三、 簡單學一下sysmpy中的幾個實例

  • 定義數學符號(類似於數學中的變量)

  • 展開與摺疊

  • 簡化表達式

  • 解方程

  • 賦值計算

  • log計算

  • 導數

  • 積分

  • 求極限

3.1 定義數學符號
讓我們定義一個符號表達式代表數學表達式 x+2y。首先我們要注意到python中的變量必須賦值才能使用,所以無法表達該數學表達式。所以這裏一定要引入特殊的符號,這裏有兩種方法

#方法一
from sympy import symbols
x,y = symbols('x y')
expr = x + 2*y
expr
x + 2*y
#方法二from sympy.abc import x,y
expr2 = x + 2*y
expr2
x + 2*y

當數學表達式中的變量不是x,y這種單一字符,而是result這種多個字符長度的變量時,只能用方法一。

3.2 展開與摺疊
Python圈中的符號計算庫-Sympy


from sympy import expand,factor
from sympy.abc import x,y

expr = x**2+x*y+3*x
expr
x**2 + x*y + 3*x
#摺疊
factor(expr)
x**2 + x*y + 3*x
#展開
expr2 = x*(x+y+3)
expand(expr2)
x**2 + x*y + 3*x

3.3 簡化表達式
有時候我們需要簡化表達式,如

Python圈中的符號計算庫-Sympy


#普通的化簡
from sympy import simplify
from sympy.abc import x
simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
#三角化簡trigsimp
from sympy import trigsimp,sin,cos
from sympy.abc import x,y
y = sin(x)/cos(x)

trigsimp(y)
tan(x)

指數化簡

Python圈中的符號計算庫-Sympy


from sympy import powsimp
from sympy.abc import x,a,b
y = x**a * x**b
y
x**a*x**b
#指數化簡
powsimp(y)
x**(a + b)

3.4 解方程

Python圈中的符號計算庫-Sympy
注意在python中=是賦值的意思,==雖然表示等於,但是會有很大的問題。在sympy中,我們使用Eq(x,y)表示等於x=y


from sympy.abc import x,y
from sympy import solve,linsolve,Eq

#對一個方程求解,使用solve
solve(Eq(2*x-1,3), x)
[2]

注意,當我們對多個方程求解時,我們習慣把等式設定爲等於0.即將等式右邊的內容移動到左邊。

Python圈中的符號計算庫-Sympy

這時候我們再使用linsolve([方程1,方程2,...],(變量1,變量2,...))


#對多個方程求解,使用linsolve。方程的解爲x=-1,y=3
linsolve([x+2*y-5,2*x+y-1], (x,y))
{(-1, 3)}

3.5 賦值計算

Python圈中的符號計算庫-Sympy


from sympy.abc import x,y
from sympy import sin,cos
y = sin(x)+cos(x)y
sin(x) + cos(x)

Python圈中的符號計算庫-Sympy


y.subs(x, x**2)
sin(x**2) + cos(x**2)

這裏的賦值,不僅可以實現變量的替換,還可以賦與數字,進行計算。

Python圈中的符號計算庫-Sympy


y.subs(x, 0)
1

3.6 log運算
Python圈中的符號計算庫-Sympy


from sympy import log,expand_log
from sympy.abc import x,y,e

#expand_log爲展開log,但需要將force=True,展開才能發生

expand_log(log(x**3), force=True)
3*log(x)
#expand_log爲展開log,但需要將force=True,展開才能發生

expand_log(log(x**3))
log(x**3)
expand_log(log(e**x), force=True)
x*log(e)

3.7 導數
如果經歷過考研求導數,大家都應該都還記得這些吧。

Python圈中的符號計算庫-Sympy


from sympy import diff,sin,cos
from sympy.abc import x,y,z,f

#對sin(x)求導
diff(sin(x))
cos(x)
diff(cos(x))
-sin(x)

偏導

Python圈中的符號計算庫-Sympy


#求偏導
f = 3*x**2*y*z
diff(f, x,y)
6*x*z

3.8 積分
Python圈中的符號計算庫-Sympy


from sympy.abc import pi,x
from sympy import integrate,sin

integrate(sin(x), (x,0,pi))
-cos(pi) + 1

3.9 極限

Python圈中的符號計算庫-Sympy


from sympy.abc import x
from sympy import limit
limit(1/x, x, 0, '+')
oo

3.10 展開式

Python圈中的符號計算庫-Sympy


from sympy import exp,symbols

x = symbols('x')

expr = exp(x)

expr.series(x, 0, 3)
1 + x + x**2/2 + O(x**3)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章