2020-05-26用Python學數(shù)學之Sympy代數(shù)符號運算

【注:轉載自http://www.itdecent.cn/p/182bca2c7731,純個人學習用,勿噴】

計算器與數(shù)學

說起數(shù)學計算器,我們常見的是加減乘除四則運算,有了它,我們就可以擺脫筆算和心算的痛苦。四位數(shù)以上的加減乘除在數(shù)學的原理上其實并不難,但是如果不借助于計算器,光依賴我們的運算能力(筆算和心算),不僅運算的準確度大打折扣,而且還會讓我們對數(shù)學的運用停留在一個非常淺的層次。

盡管四則運算如此簡單,但是多位數(shù)運算的心算卻在我們生活中被歸為天才般的能力。但是數(shù)學的應用應該生活化、普及化,而不是只屬于天才的專利,計算器改變了這一切,這就是計算器的魅力。

計算器還可以做科學運算,比如乘方、開方、指數(shù)、對數(shù)、三角函數(shù)等,盡管這些知識在我們初中時代,通過紙筆也是能運算起來的,但是也僅限于一些極其常用和簡單的運算,一旦復雜起來,通過紙筆來運算就是一項復雜的工程了。所以說,計算器可以讓我們離數(shù)學的應用更近。

但是我們學生時代所學的數(shù)學可遠不止這些,尤其是高等數(shù)學(微積分)、線性代數(shù)、概率統(tǒng)計等數(shù)學知識應用非常廣泛(我也是后來才知道),但是由于他們的運算非常復雜,我們即便掌握了這些知識,想要應用它又談何容易,那有沒有微積分、線性代數(shù)、概率統(tǒng)計等的計算器呢?

答案是有的,它們就是計算機代數(shù)系統(tǒng)Computer Algebra System,簡稱CAS,Python的Sympy庫也支持帶有數(shù)學符號的微積分、線性代數(shù)等進行運算。

有了計算器,我們才能真正脫離數(shù)學復雜的解題本身,把精力花在對數(shù)學原理和應用的學習上,而這才是(在工作方面)數(shù)學學習的意義。

計算機代數(shù)系統(tǒng)

Sympy可以實現(xiàn)數(shù)學符號的運算,用它來進行數(shù)學表達式的符號推導和驗算,處理帶有數(shù)學符號的導數(shù)、極限、微積分、方程組、矩陣等,就像科學計算器一樣簡單,類似于計算機代數(shù)系統(tǒng)CAS,雖然CAS通常是可視化軟件,但是維基百科上也把Sympy歸為CAS。

幾大知名的數(shù)學軟件比如Mathematica、MaximaMatlab(需Symbolic Math Toolbox)、Maple等都可以做符號運算,在上篇文章中我們已經(jīng)拿Python和R、Matlab對比了,顯然Python在指定場景下確實優(yōu)勢非常明顯,于是我又調研了一下Sympy與Mathematica的比較,在輸入公式以及生成圖表方面,Sympy確實不行(這一點Python有其他庫來彌補),Mathematica能夠做什么,Sympy基本也能做什么。

所以說Python在專業(yè)數(shù)學(數(shù)學、數(shù)據(jù)科學等)領域,由于其擁有非常多而且強大的第三方庫,構成了一個極其完善的生態(tài)鏈,即使是面對世界上最為強勢最為硬核的軟件也是絲毫不虛的。

本專欄用Python學數(shù)學的下一期也會介紹一些非常實用的數(shù)學工具和數(shù)學教材資源,讓數(shù)學的學習更簡單更生動。

Sympy的符號運算

如果之前是學數(shù)學相關專業(yè)了解計算機代數(shù)系統(tǒng)CAS,就會對數(shù)學符號的運算比較熟悉,而如果之前是程序員,可能會有點不太明白,下面我們就來了解一下。

Sympy與Math函數(shù)的區(qū)別

我們先來看一下Sympy庫和Python內置的Math函數(shù)對數(shù)值計算的處理有什么不同。為了讓代碼可執(zhí)行,下面的代碼都是基于Python3的完整代碼。

importsympy,mathprint(math.sqrt(8))print(sympy.sqrt(8))

執(zhí)行之后,結果顯示為:

2.82842712474619032*sqrt(2)

math模塊是直接求解出一個浮點值,而Sympy則是用數(shù)學符號表示出結果,結合LaTex的語法就可以得出我們在課本里最熟悉的的:

。

數(shù)學符號與表達式

我們要對數(shù)學方程組、微積分等進行運算時,就會遇到變量比如x,y,z,f等的問題,也會遇到求導、積分等代數(shù)符號表達式,而Sympy就可以保留變量,計算有代數(shù)符號的表達式的。

fromsympyimport*x=Symbol('x')y=Symbol('y')k,m,n=symbols('k m n')print(3*x+y**3)

輸出的結果為:3*x + y**3,轉化為LaTex表示法之后結果為

,輸出的結果就帶有x和y變量。Symbol()函數(shù)定義單個數(shù)學符號;symbols()函數(shù)定義多個數(shù)學符號。

折疊與展開表達式

factor()函數(shù)可以折疊表達式,而expand()函數(shù)可以展開表達式,比如表達式:

,折疊之后應該是

。我們來看具體的代碼:

fromsympyimport*x,y=symbols('x y')expr=x**4+x*y+8*xf_expr=factor(expr)e_expr=expand(f_expr)print(f_expr)print(e_expr)

表達式的折疊與展開,對應的數(shù)學知識就是因式分解,相關的數(shù)學知識在人教版初二的教程里。用Python學習數(shù)學專欄的目的就是要Python與初高中、大學的數(shù)學學習結合起來,讓數(shù)學變得更加簡單生動。

表達式化簡

simplify()函數(shù)可以對表達式進行化簡。有一些表達式看起來會比較復雜,就拿人教版初二上的一道多項式的乘法為例,簡化

。

fromsympyimport*x,y=symbols('x y')expr=(2*x)**3*(-5*x*y**2)s_expr=simplify(expr)print(s_expr)

求解方程組

在人教版的數(shù)學教材里,我們初一上會接觸一元一次方程組,初一下就會接觸二元一次方程、三元一次方程組,在初三上會接觸到一元二次方程,使用Sympy的solve()函數(shù)就能輕松解題。

解一元一次方程

我們來求解這個一元一次方程組。(題目來源于人教版七年級數(shù)學上)

fromsympyimport*x=Symbol('x')print(solve(6*x+6*(x-2000)-150000,x))

我們需要掌握Python的代碼符號和數(shù)學符號之間的對應關系,解一元一次方程就非常簡單。

解二元一次方程組

我們來看如何求解二元一次方程組。(題目來自人教版七年級數(shù)學下)

fromsympyimport*x,y=symbols('x y')print(solve([x+y-10,2*x+y-16],[x,y]))

很快就可以得出{x: 6, y: 4},也就是

。

解三元一次方程組

我們來看如何解三元一次方程組。(題目來自人教版七年級數(shù)學下)

執(zhí)行之后,很快可以得出結果{x: 8, y: 2, z: 2},也就是

解一元二次方程組

比如我們來求解人教版九年級一元二次方程組比較經(jīng)典的一個題目,

.

fromsympyimport*x,y=symbols('x y')a,b,c=symbols('a b c')expr=a*x**2+b*x+cs_expr=solve(expr,x)print(s_expr)

執(zhí)行之后得出的結果為[(-b + sqrt(-4*a*c + b**2))/(2*a), -(b + sqrt(-4*a*c + b**2))/(2*a)],我們知道根與系數(shù)的關系二次方程會有兩個解,這里的格式就是一個列表。轉為我們常見的數(shù)學公式即為:

微積分Calculus

微積分是大學高等數(shù)學里非常重要的學習內容,比如求極限、導數(shù)、微分、不定積分、定積分等都是可以使用Sympy來運算的。

求極限

Sympy是使用limit(表達式,變量,極限值)函數(shù)來求極限的,比如我們要求

的值。

fromsympyimport*x,y,z=symbols('x y z')expr=sin(x)/xl_expr=limit(expr,x,0)print(l_expr)

執(zhí)行后即可得到結果為1。

求導

可以使用diff(表達式,變量,求導的次數(shù))函數(shù)對表達式求導,比如我們要對

進行

求導,以及求導兩次,代碼如下:

fromsympyimport*x,y=symbols('x y')expr=sin(x)*exp(x)diff_expr=diff(expr,x)diff_expr2=diff(expr,x,2)print(diff_expr)print(diff_expr2)

求導一次的結果就是exp(x)*sin(x) + exp(x)*cos(x),也就是

;求導兩次的結果是2*exp(x)*cos(x),也就是

求不定積分

Sympy是使用integrate(表達式,變量)來求不定積分的,比如我們要求

fromsympyimport*x,y=symbols('x y')expr=exp(x)*sin(x)+exp(x)*cos(x)i_expr=integrate(expr,x)print(i_expr)

執(zhí)行之后的結果為:exp(x)*sin(x)轉化之后為:

求定積分

Sympy同樣是使用integrate()函數(shù)來做定積分的求解,只是語法不同:integrate(表達式,(變量,下區(qū)間,上區(qū)間)),我們來看如果求解

fromsympyimport*x,y=symbols('x y')expr=sin(x**2)i_expr=integrate(expr,(x,-oo,oo))print(i_expr)

執(zhí)行之后的結果為sqrt(2)*sqrt(pi)/2,也就是

Sympy能夠做的也遠不止這些,初高中、大學的數(shù)學運算題在Sympy極為豐富的功能里不過只是開胃入門小菜而已。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容