本篇文章帶給大家的內容是關於Python中Sympy代數符號運算的介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
在我們初、高中和大學近10年的學習時間裡,數學一直佔據著非常大的分量,但是回憶過去可以發現,我們把大量的時間都花在反覆解題、不斷運算上,計算方法、運算技巧、筆算能力以及數學公式的記憶彷彿成了我們學習數學的全部。這些記憶和技巧沒幾年就忘記了,但很多人甚至還記得那份陰影;筆算與解題在AI、圖形影像、資料分析等上被軟體取代。那我們學生時代的數學還剩下什麼呢?
計算器與數學
說起數學計算器,我們常見的是加減乘除四則運算,有了它,我們就可以擺脫筆算和心算的痛苦。四位數以上的加減乘除在數學的原理上其實並不難,但是如果不借助於計算器,光依賴我們的運算能力(筆算和心算),不僅運算的準確度大打折扣,而且還會讓我們對數學的運用停留在一個非常淺的層次。
儘管四則運算如此簡單,但是多位數運算的心算卻在我們生活中被歸類為天才般的能力。但是數學的應用應該要生活化、普及化,而不是只屬於天才的專利,計算器改變了這一切,這就是計算器的魅力。
計算器還可以做科學運算,例如乘方、開方、指數、對數、三角函數等,儘管這些知識在我們初中時代,透過紙筆也是能運算起來的,但是也僅限於一些極其常用和簡單的運算,一旦複雜起來,透過紙筆來運算就是一項複雜的工程了。所以說,計算器可以讓我們離數學的應用更近。
但是我們學生時代所學的數學可遠不止這些,尤其是高等數學(微積分)、線性代數、機率統計等數學知識應用非常廣泛(我也是後來才知道),但是由於他們的運算非常複雜,我們即便掌握了這些知識,想要應用它又談何容易,那有沒有微積分、線性代數、機率統計等的計算器呢?
答案是有的,它們就是電腦代數系統Computer Algebra System,簡稱CAS,Python的Sympy函式庫也支援有數學符號的微積分、線性代數等運算。
有了計算器,我們才能真正脫離數學複雜的解題本身,把精力花在對數學原理和應用的學習上,而這才是(在工作方面)數學學習的意義。
Sympy可以實現數學符號的運算,用它來進行數學表達式的符號推導和驗算,處理帶有數學符號的導數、極限、微積分、方程群組、矩陣等,就像科學計算器一樣簡單,類似電腦代數系統CAS,雖然CAS通常是視覺化軟體,但維基百科上也把Sympy歸為CAS。
幾大知名的數學軟體例如Mathematica、Maxima、Matlab(需Symbolic Math Toolbox)、Maple等都可以做符號運算,在上篇文章中我們已經拿Python和R、Matlab對比了,顯然Python在指定場景下確實優勢非常明顯,於是我又調查了一下Sympy與Mathematica的比較,在輸入公式以及生成圖表方面,Sympy確實不行(這點Python有其他函式庫來彌補),Mathematica能夠做什麼,Sympy基本上也能做什麼。
所以說Python在專業數學(數學、數據科學等)領域,由於其擁有非常多而且強大的第三方庫,構成了一個極其完善的生態鏈,即使是面對世界上最為強勢最為硬派的軟體也是絲毫不虛的。
本專欄用Python學數學的下一期也會介紹一些非常實用的數學工具和數學教材資源,讓數學的學習更簡單更生動。
如果之前是學數學相關專業了解電腦代數系統CAS,就會對數學符號的運算比較熟悉,而如果之前是程式設計師,可能會有點不太明白,下面我們就來了解一下。
Sympy與Math函數的差異
我們先來看看Sympy函式庫和Python內建的Math函數對數值計算的處理有什麼不同。為了讓程式碼可執行,下面的程式碼都是基於Python3的完整程式碼。
import sympy,math print(math.sqrt(8)) print(sympy.sqrt(8))
執行之後,結果顯示為:
2.8284271247461903 2*sqrt(2)
math模組是直接解出一個浮點值,而Sympy則是用數學符號表示出結果,結合LaTex的語法就可以得出我們在課本裡最熟悉的:$2\sqrt{2}$。
數學符號與表達式
我们要对数学方程组、微积分等进行运算时,就会遇到变量比如x,y,z,f等的问题,也会遇到求导、积分等代数符号表达式,而Sympy就可以保留变量,计算有代数符号的表达式的。
from sympy import * x = Symbol('x') y = Symbol('y') k, m, n = symbols('k m n') print(3*x+y**3)
输出的结果为:3*x + y**3
,转化为LaTex表示法之后结果为$3x+y^3$,输出的结果就带有x和y变量。Symbol()函数定义单个数学符号;symbols()函数定义多个数学符号。
折叠与展开表达式
factor()
函数可以折叠表达式,而expand()
函数可以展开表达式,比如表达式:$x^4+xy+8x$,折叠之后应该是$x(x^3+y+8)$。我们来看具体的代码:
from sympy import * x,y = symbols('x y') expr=x**4+x*y+8*x f_expr=factor(expr) e_expr=expand(f_expr) print(f_expr) print(e_expr)
表达式的折叠与展开,对应的数学知识就是因式分解,相关的数学知识在人教版初二的教程里。用Python学习数学专栏的目的就是要Python与初高中、大学的数学学习结合起来,让数学变得更加简单生动。
表达式化简
simplify()函数可以对表达式进行化简。有一些表达式看起来会比较复杂,就拿人教版初二上的一道多项式的乘法为例,简化$(2x)^3(-5xy^2)$。
from sympy import * x,y = symbols('x y') expr=(2*x)**3*(-5*x*y**2) s_expr=simplify(expr) print(s_expr)
在人教版的数学教材里,我们初一上会接触一元一次方程组,初一下就会接触二元一次方程、三元一次方程组,在初三上会接触到一元二次方程,使用Sympy的solve()函数就能轻松解题。
解一元一次方程
我们来求解这个一元一次方程组。(题目来源于人教版七年级数学上)
$$6 \times x + 6 \times(x-2000)=150000$$
from sympy import * x = Symbol('x') print(solve(6*x + 6*(x-2000)-150000,x))
我们需要掌握Python的代码符号和数学符号之间的对应关系,解一元一次方程就非常简单。
解二元一次方程组
我们来看如何求解二元一次方程组。(题目来自人教版七年级数学下)
$$ \begin{cases} x+ y =10,\\ 2 \times x+ y=16 \end{cases} $$
from sympy import * x,y = symbols('x y') print(solve([x + y-10,2*x+y-16],[x,y]))
很快就可以得出{x: 6, y: 4}
,也就是
$$x=6,y=4$$。
解三元一次方程组
我们来看如何解三元一次方程组。(题目来自人教版七年级数学下)
$$ \begin{cases} x+y+z=12,\\ x+2y+5z=22,\\ x=4y. \end{cases} $$
执行之后,很快可以得出结果{x: 8, y: 2, z: 2}
,也就是
$$x=8,y=2,z=2$$
解一元二次方程组
比如我们来求解人教版九年级一元二次方程组比较经典的一个题目,$ax^2+bx+c=0$.
from sympy import * x,y = symbols('x y') a,b,c=symbols('a b c') expr=a*x**2 + b*x + c s_expr=solve( expr, x) print(s_expr)
执行之后得出的结果为[(-b + sqrt(-4*a*c + b**2))/(2*a), -(b + sqrt(-4*a*c + b**2))/(2*a)]
,我们知道根与系数的关系二次方程会有两个解,这里的格式就是一个列表。转为我们常见的数学公式即为:
$$\frac{-b+\sqrt{-4ac+b^2}}{2a} 、-\frac{b+\sqrt{-4ac+b^2}}{2a}$$
微积分是大学高等数学里非常重要的学习内容,比如求极限、导数、微分、不定积分、定积分等都是可以使用Sympy来运算的。
求极限
Sympy是使用limit(表达式,变量,极限值)函数来求极限的,比如我们要求$\lim \limits_{x \to 0} \frac{sinx(x)}{x}$的值。
from sympy import * x, y, z = symbols('x y z') expr = sin(x)/x l_expr=limit(expr, x, 0) print(l_expr)
执行后即可得到结果为1。
求导
可以使用diff(表达式,变量,求导的次数)函数对表达式求导,比如我们要对$sin(x)e^x$进行$x$求导,以及求导两次,代码如下:
from sympy import * 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)
,也就是$e^xsin(x)+e^xcos(x)$;求导两次的结果是2*exp(x)*cos(x)
,也就是
$$2e^xcosx$$
求不定积分
Sympy是使用integrate(表达式,变量)来求不定积分的,比如我们要求$\int(e^x\sin{(x)} + e^x\cos{(x)})\,dx$
from sympy import * x,y = symbols('x y') expr=exp(x)*sin(x) + exp(x)*cos(x) i_expr=integrate(expr,x) print(i_expr)
执行之后的结果为:exp(x)*sin(x)
转化之后为:
$$e^xsin(x)$$
求定积分
Sympy同样是使用integrate()函数来做定积分的求解,只是语法不同:integrate(表达式,(变量,下区间,上区间)),我们来看如果求解
$\int_{-\infty}^\infty \sin{(x^2)}\,dx$
from sympy import * x,y = symbols('x y') expr=sin(x**2) i_expr=integrate(expr, (x, -oo, oo)) print(i_expr)
执行之后的结果为sqrt(2)*sqrt(pi)/2
,也就是
$$\frac{\sqrt{2}\sqrt{\pi}}{2}$$
Sympy能够做的也远不止这些,初高中、大学的数学运算题在Sympy极为丰富的功能里不过只是开胃入门小菜而已。
本篇文章到这里就已经全部结束了,更多其他精彩内容可以关注PHP中文网的python视频教程栏目!
以上是Python中Sympy代數符號運算的介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!