Python練手:想在做數(shù)學(xué)題的時(shí)候摸魚嗎?
?

Python練手:想在做數(shù)學(xué)題的時(shí)候摸魚嗎?
舉個(gè)例子,這是《高等數(shù)學(xué)》(同濟(jì)大學(xué)版)中的一道課后練習(xí)題(1998年,數(shù)學(xué)三真題),不妨來一起解一下這道題吧。

首先,根據(jù)題意,結(jié)合旋轉(zhuǎn)體體積公式,列出等式:
稍作化簡(jiǎn),即得:
兩邊分別求導(dǎo),得到一個(gè)微分方程:
將這個(gè)微分方程化成帶有的形式,并將
移到等式左側(cè):
之后,就可以使用程序來解這個(gè)微分方程了,

所以,求得為微分方程的通解為:
然后,使用程序化簡(jiǎn)一下這個(gè)表達(dá)式

化簡(jiǎn)后的表達(dá)式為:
將代入上式,使用代碼解方程:

解得C=1。
于是,所求最終的解為:
最后,我們來對(duì)照一下給出的標(biāo)準(zhǔn)答案解題步驟。

相比于標(biāo)準(zhǔn)答案的換元、分離變量等操作,我們只需要幾句代碼就可以一步求解出微分方程的通解,代入特值的方程也可以使用代碼一步求解。
由此可見,我們?cè)谧鰯?shù)學(xué)題的時(shí)候,還是可以在一定程度上使用代碼來摸魚的,那些乏味的解方程、化簡(jiǎn)的過程,就直接交給電腦去做吧。當(dāng)然,一般情況下,還是建議大家手動(dòng)計(jì)算,畢竟是要鍛煉計(jì)算能力的,代碼只是起到輔助作用,建議大家只在驗(yàn)算答案的時(shí)候使用代碼輔助計(jì)算,而不是完全依靠電腦為我們解題運(yùn)算。
記得有一次上課小測(cè)驗(yàn),老師有事沒來上課,讓課代表發(fā)了一張全是定積分的練習(xí)題,要求我們盡快做完,只寫結(jié)果就行,然后就默默拿出手機(jī)打開瀏覽器,找了個(gè)帶有sympy庫的python在線編譯環(huán)境,然后就...你懂得...
如果想要在做數(shù)學(xué)題的時(shí)候摸魚,那不妨來試試使用Python解方程、化簡(jiǎn)多項(xiàng)式、求極限、微積分、計(jì)算矩陣吧。
雖然,對(duì)于數(shù)學(xué)運(yùn)算來說,我們或許可以選擇更加專業(yè)的工具,比如matlab、mathematica等軟件,但是,python依然具備這些專業(yè)軟件不具備的優(yōu)勢(shì)。

python開源免費(fèi),占用體積小,隨用隨取,比專業(yè)的數(shù)學(xué)軟件更加自由靈活輕便。如果想要在做數(shù)學(xué)題的時(shí)候摸魚,大可不必使用付費(fèi)的專業(yè)數(shù)學(xué)軟件。而且,學(xué)習(xí)使用python的數(shù)學(xué)運(yùn)算,也可以讓我們?cè)谝院蠓治銎渌麊栴}的時(shí)候大展身手。結(jié)合python爬取數(shù)據(jù)的優(yōu)勢(shì),我們也可以快速部署各種研究項(xiàng)目。
本人非專業(yè)程序員,本文如有不足,還請(qǐng)海涵。
基礎(chǔ)知識(shí):數(shù)學(xué)運(yùn)算符
在正式開始之前,不妨先來了解一下Python當(dāng)中的數(shù)學(xué)運(yùn)算符(常用的算術(shù)運(yùn)算)。
① 加法 :+
② 減法:-
③ 乘法:*
④ 除法:/
⑤ 取余:%
⑥?整除://
⑦ 乘方:**
常用數(shù)學(xué)函數(shù):math庫
本文的主角是sympy函數(shù)庫,但在講解sympy函數(shù)庫之前,各位最好先了解一下Python自帶的math庫函數(shù)內(nèi)容,這樣有利于打基礎(chǔ)。當(dāng)然,如果各位對(duì)這部分不感興趣,也可以直接跳過,將文章下滑到sympy部分。
首先,需要導(dǎo)入math函數(shù)庫。(math庫是Python自帶的一個(gè)函數(shù)庫,主要包含基本的數(shù)學(xué)運(yùn)算函數(shù)與常數(shù)。)
求絕對(duì)值,例如|-2|。
以上兩種寫法都是可以的,輸出結(jié)果都是2。第一種方法是Python核心庫自帶的函數(shù),第二種方法則是調(diào)用math函數(shù)庫中的函數(shù)。
求開平方,例如求?。
以上兩種寫法都是可以的,輸出結(jié)果都是1.4142135623730951。第一種方法使用的是乘方的算法,開平方,其實(shí)就是計(jì)算一個(gè)數(shù)的0.5次方。
求階乘,例如求 5!。
輸出結(jié)果為120。
取整,例如對(duì)2.33和-2.33分別向上、向下取整。
首先是向上取整,這兩行代碼分別輸出3,-2。
接著是向下取整,這兩行代碼分別輸出2,-3。
四舍五入,例如對(duì)2.33333和6.66666分別進(jìn)行四舍五入,保留小數(shù)點(diǎn)后2位。
兩行代碼分別輸出2.33和6.67。這里的round函數(shù)是Python核心庫的函數(shù),非math庫函數(shù)。
數(shù)學(xué)常數(shù),一些具有代表性的常量。
使用好這些常量很重要,因?yàn)槟承┨囟ǖ暮瘮?shù)中需要使用到它們。
三角函數(shù),例如分別計(jì)算的正弦、余弦值,
的正切值。
由于計(jì)算精度的問題,所以這三行代碼分別返回1.0,6.123233995736766e-17(6.123233995736766×10的-17次方),0.9999999999999999。
只需要使用四舍五入函數(shù)進(jìn)行結(jié)果近似即可,近似后返回1.0,0.0,1.0。
反三角函數(shù),例如分別求1的反正弦、反余弦、反正切值。
三行代碼分別返回小數(shù)形式的結(jié)果,依次為1.5707963267948966(接近π/2),0.0,0.7853981633974483(接近π/4)。
反余弦值,結(jié)果范圍在0到π之間。
反正弦值,結(jié)果范圍在-π/2到π/2之間。
反正切值,結(jié)果范圍在-π/2到π/2之間之間。
值得注意的是,math函數(shù)庫中的反三角函數(shù)只能返回小數(shù)形式的結(jié)果,如果想要返回π/n的形式的結(jié)果,則需要使用sympy函數(shù)庫,別著急,我們會(huì)在下文介紹它。
冪函數(shù),例如求。
這3種寫法都是可以的,其中前2種寫法會(huì)返回8,第3種則會(huì)返回8.0。
自然冪函數(shù),例如求。
第1句代碼會(huì)返回7.38905609893065,這通常比math.e**2或pow(math.e,2)更精確。
對(duì)數(shù)函數(shù),例如求,
,
。
math.log(y,x)是通用的對(duì)數(shù)函數(shù)形式,用于表示。
當(dāng)僅賦予math.log函數(shù)一個(gè)參數(shù)時(shí),就會(huì)默認(rèn)底數(shù)為自然常數(shù)e。
使用專門的math.log2(x)與math.log10(x)函數(shù)要比math.log(x,2)與log(x,10)的運(yùn)算結(jié)果更加精確。
至此,本文已經(jīng)簡(jiǎn)單地介紹了math庫的常用數(shù)學(xué)函數(shù),如果有小伙伴想要了解完整的math函數(shù)庫內(nèi)容,請(qǐng)自行訪問:
https://docs.python.org/zh-cn/3/library/math.html
分?jǐn)?shù)運(yùn)算:fractions庫
在做數(shù)學(xué)題的時(shí)候,我們經(jīng)常會(huì)遇到分?jǐn)?shù)與分?jǐn)?shù)的各種運(yùn)算,而一般的計(jì)算器程序只會(huì)輸出小數(shù)結(jié)果,這讓我們非常不爽。于是,我們來嘗試一下使用Python進(jìn)行分?jǐn)?shù)的運(yùn)算。
首先,導(dǎo)入fractions函數(shù)庫,這是一個(gè)涉及分?jǐn)?shù)運(yùn)算的函數(shù)庫。
然后,使用Fraction函數(shù)創(chuàng)建一個(gè)分?jǐn)?shù)。比如,創(chuàng)建一個(gè)值為1/2的分?jǐn)?shù)。
以上創(chuàng)建分?jǐn)?shù)的3種方法均可:第一種是直接輸入數(shù)字形式的分子與分母,使用2個(gè)參數(shù);第二種是輸入文本形式的分?jǐn)?shù),記得加引號(hào);第三種是輸入小數(shù)形式的數(shù)字,會(huì)自動(dòng)轉(zhuǎn)化為分?jǐn)?shù)。
了解如何創(chuàng)建分?jǐn)?shù)以后,我們就可以進(jìn)行各種分?jǐn)?shù)的運(yùn)算了,比如計(jì)算114/514+514/114。
程序的輸出結(jié)果為Fraction(69298, 14649),也就是69298/14649。

前期準(zhǔn)備:符號(hào)運(yùn)算SymPy與IDE工具Jupyter
SymPy 是一個(gè)由 Python 語言編寫的符號(hào)計(jì)算庫。什么是符號(hào)計(jì)算 ?處理數(shù)學(xué)對(duì)象的計(jì)算稱為符號(hào)計(jì)算。在符號(hào)計(jì)算中,數(shù)學(xué)對(duì)象是精確表示的,而不是近似的,未計(jì)算的數(shù)學(xué)表達(dá)式會(huì)以符號(hào)形式保留。
還記得我們?cè)谏衔恼f的反三角函數(shù)嗎?不如來比較一下math庫與sympy庫函數(shù)的計(jì)算結(jié)果吧。

除了精確表示以外,sympy還可以進(jìn)行符號(hào)運(yùn)算,這對(duì)我們求解方程非常方便。
然而,Python自帶的核心函數(shù)庫中并不包括SymPy,因此,我們需要使用pip命令額外安裝一下sympy函數(shù)庫。
按下Win+R鍵,輸入“cmd”,打開“命令提示符”,輸入“pip install sympy”,按下回車鍵,等待命令執(zhí)行完成。

由于在做數(shù)學(xué)題的時(shí)候,我們需要反復(fù)計(jì)算,因此,我們最好使用一個(gè)具備良好的交互性和記錄功能的IDE工具,這里推薦使用Jupyter Notebook。
IDE是什么?集成開發(fā)環(huán)境是用于提供程序開發(fā)環(huán)境的應(yīng)用程序,一般包括代碼編輯器、編譯器、調(diào)試器和圖形用戶界面等工具。集成了代碼編寫功能、分析功能、編譯功能、調(diào)試功能等一體化的開發(fā)軟件服務(wù)套。說句人話:IDE是寫代碼的工具。

按下Win+R鍵,輸入“cmd”,打開“命令提示符”,輸入“pip install jupyter”,按下回車鍵,等待命令執(zhí)行完成。

之后,我們新建一個(gè)文件夾,打開這個(gè)文件夾,來到這個(gè)文件夾目錄下。(之后我們?cè)贘upiter Notebook中編寫的代碼記錄都會(huì)保存在這個(gè)文件夾里。)
在資源管理器的地址欄輸入“cmd”,按下回車鍵,會(huì)彈出一個(gè)命令提示符窗口。

在這個(gè)黑色的窗口中,輸入“jupyter notebook”,按下回車鍵,等待命令執(zhí)行完成。

之后會(huì)使用默認(rèn)瀏覽器打開一個(gè)網(wǎng)頁,這里就是我們編寫代碼的環(huán)境了。點(diǎn)擊右上角的New,然后選擇Python3新建一個(gè)文件即可。

在方框中輸入代碼,然后點(diǎn)擊上方的“運(yùn)行”按鈕就可以運(yùn)行代碼了。(快捷鍵Ctrl+Enter)

當(dāng)然,如果各位嫌麻煩,也可以直接使用Python自帶的IDLE。

也有網(wǎng)友會(huì)問到,為什么不使用PyCharm等更加專業(yè)的IDE工具呢?這就好像在問,為什么剔牙的時(shí)候要用竹簽而不是用竹竿呢?PyCharm適合開發(fā)比較大的項(xiàng)目,它占用內(nèi)存太大了,對(duì)電腦要求較高,容易卡頓;而Jupiter Notebook輕便靈活,占用體積小,最重要的是,它會(huì)保存你輸入的代碼以及運(yùn)行的結(jié)果,方便以后回顧查看,對(duì)于數(shù)學(xué)研究類項(xiàng)目來說非常好用。

打好基礎(chǔ),做好準(zhǔn)備工作,接下來我們開始正式講解Python中常見的數(shù)學(xué)運(yùn)算中的科學(xué)計(jì)算功能。本文將會(huì)以舉例的形式進(jìn)行講解。
首先,依舊是需要導(dǎo)入sympy函數(shù)庫。
以上三種導(dǎo)入函數(shù)庫的方法均可,但是建議使用前兩種。
先來講解一下這三種導(dǎo)入方法的不同點(diǎn)。
如果采用第1種方法,那么調(diào)用相關(guān)函數(shù)的方法需要這樣寫(最標(biāo)準(zhǔn)的寫法):
如果采用第2種方法,那么調(diào)用相關(guān)函數(shù)的方法需要這樣寫:(第2種方法與第1種沒有本質(zhì)區(qū)別,只是命名了一個(gè)簡(jiǎn)寫)
如果采用第3種方法,那么調(diào)用相關(guān)函數(shù)的方法需要這樣寫(可以直接調(diào)用,無需額外寫函數(shù)庫名):
看起來第3種方法調(diào)用的時(shí)候更加方便誒~但是為什么建議使用前兩種呢?這是為了避免命名沖突。
比如說,張三函數(shù)庫里有個(gè)函數(shù)叫做喘氣,李四函數(shù)庫里也有個(gè)方法叫喘氣。
如果我們用前兩種方法,可以很清晰地知道需要調(diào)用誰的函數(shù)。
但是如果我們使用第3種方法的話,那么這個(gè)函數(shù)是調(diào)用誰的呢?
本文采取的導(dǎo)入方式為第1種。
注意:下文所寫代碼#開頭行為注釋,僅供閱讀代碼方便理解使用,在實(shí)際練習(xí)中,不需要額外書寫注釋行。
求解方程
(1)一元方程求解
例1. 求解?
首先,通過移項(xiàng),將方程的右邊變?yōu)?:x^2+4x+3=0
然后,使用代碼進(jìn)行求解:
求解的結(jié)果如下所示:該方程的解為-3或-1。

例2. 求解??
還是同樣的寫法,只不過需要注意的是,這里我們需要調(diào)用sympy庫中的exp()函數(shù),而不是math庫中的。
求解的結(jié)果如下所示:該方程的解為0。

(2)未知參數(shù)一元方程求解
例3. 求解?
有時(shí),我們的方程中含有未知參數(shù),這依然可以求解,只不過就是多定義幾個(gè)變量而已。
注意這里,因?yàn)楹卸鄠€(gè)未知數(shù),因此,我們需要在solve函數(shù)中添加第二個(gè)參數(shù)x,這樣程序才會(huì)求解關(guān)于f(x)=0的解,否則默認(rèn)就求解f(a)=0。
這是正確的寫法:

這是錯(cuò)誤的寫法:

(3)多元方程組求解
例4. 求解方程組
x - y + z = 9
3x + 2y - z = 15
x + 5y -z = 26
輸入以下代碼進(jìn)行求解:
求解結(jié)果如下所示:

求解不等式
(1)一元不等式求解
例5. 求解???
這里由于右側(cè)為常數(shù),所以可以不移項(xiàng),但如果右側(cè)含有未知數(shù),建議先移項(xiàng),將右側(cè)轉(zhuǎn)化為僅含0的形式
求解結(jié)果為 x<-3 或?x>-1

(2)一元不等式組求解
例6. 求解不等式組
這里需要先移項(xiàng),將右側(cè)轉(zhuǎn)化為僅含0的形式,然后再編寫代碼,求解的時(shí)候,要用[ ]將兩個(gè)條件包裹起來,solve函數(shù)只需要一個(gè)參數(shù),這個(gè)參數(shù)是一個(gè)list。
求解結(jié)果如下:x≤-13/7

處理多項(xiàng)式
(1)因式分解
例7. 分解多項(xiàng)式?
分解多項(xiàng)式需要用到factor函數(shù)。
分解結(jié)果如下:

(2)多項(xiàng)式展開
例8. 展開多項(xiàng)式?
展開多項(xiàng)式需要用到expand函數(shù)。
展開結(jié)果如下所示:

(3)多項(xiàng)式化簡(jiǎn)
例9. 化簡(jiǎn)多項(xiàng)式?
化簡(jiǎn)多項(xiàng)式需要用到cancel函數(shù)。
化簡(jiǎn)結(jié)果如下所示:

求極限
(1)函數(shù)求極限
例10. 求極限?
在代碼中,需要使用sympy.oo(兩個(gè)英文小寫字母o)代表+∞,limit函數(shù)需要3個(gè)參數(shù),第二個(gè)參數(shù)是自變量x,第一個(gè)參數(shù)是函數(shù)y=y(x),第三個(gè)參數(shù)是自變量x趨近的值。
求得極限值為0.5

例11. 求極限?
方法是一樣的,只不過把∞換成了常數(shù)。
結(jié)果中的oo代表∞

(2)數(shù)列求和求極限
例12.? 求極限?
使用summation函數(shù)構(gòu)造數(shù)列求和的形式,第一個(gè)參數(shù)為表達(dá)式,第二個(gè)參數(shù)為包含自變量、起點(diǎn)、終點(diǎn)。
使用Juputer有個(gè)好處,如果直接調(diào)用變量的話,會(huì)輸出優(yōu)化后的顯示結(jié)果。

如果直接使用print函數(shù)輸出的話,就是普通的文本形式。

求導(dǎo)函數(shù)
(1)一元函數(shù)求導(dǎo)數(shù)
例13. 求函數(shù)? 的一階導(dǎo)數(shù)?
使用diff函數(shù)構(gòu)造導(dǎo)函數(shù),如果只填寫一個(gè)參數(shù),就默認(rèn)求一階導(dǎo)。
求導(dǎo)結(jié)果如下所示:

例14. 求函數(shù)??的10階導(dǎo)數(shù)
使用diff函數(shù)構(gòu)造導(dǎo)函數(shù),第三個(gè)參數(shù)可以指定求幾階導(dǎo)數(shù),第二個(gè)參數(shù)需要寫自變量。
求導(dǎo)結(jié)果如下所示:

(2)多元函數(shù)求偏導(dǎo)
例15. 已知函數(shù)???
求偏導(dǎo)數(shù),依然使用diff函數(shù),只不過各位需要額外注意參數(shù)的放置情況
求偏導(dǎo)結(jié)果如下所示:

(3)隱函數(shù)求導(dǎo)
例16. 求隱函數(shù)??的導(dǎo)數(shù)
隱函數(shù)求導(dǎo)需要使用idiff函數(shù)。
求導(dǎo)結(jié)果如下所示:

(4)參數(shù)方程求導(dǎo)
例17. 求參數(shù)方程的導(dǎo)數(shù)
x = 2cost
y = 3sint
求導(dǎo)結(jié)果如下所示:

(5)求泰勒展開式
例18. 求 f(x) = cosx ?在 x = 0 處的5階泰勒展開式
求解泰勒展開式需要使用series函數(shù),第一個(gè)參數(shù)是自變量,第二個(gè)參數(shù)是x的值,第三個(gè)變量是階數(shù)。
泰勒展開式結(jié)果如下所示:

求函數(shù)積分
(1)求不定積分
例19. 求不定積分?
求不定積分,需要使用函數(shù)integrate,第一個(gè)參數(shù)是被積函數(shù),第二個(gè)參數(shù)只需要自變量x。
積分結(jié)果如下所示:-x + tanx +C?(記得手動(dòng)加常數(shù)C)

(2)求定積分
例20. 求定積分?
求不定積分,依然使用函數(shù)integrate,第一個(gè)參數(shù)是被積函數(shù),第二個(gè)參數(shù)分別寫自變量x、積分上限、積分下限,用( )包裹起來。
積分結(jié)果如下所示:1

(3)求多重積分
例21. 求二重積分?
多重積分也是用integrate函數(shù),只不過是需要往后繼續(xù)堆參數(shù)而已。這里就只展示二重積分了,其他更多重積分只需要往后疊加就可以了。
積分結(jié)果如下所示:

求解微分方程
(1)求解可分離變量的微分方程
例22. 求方程??的通解
首先,將方程轉(zhuǎn)化為一邊為的形式:
然后,使用代碼進(jìn)行求解。令。
其中:cls=sympy.Function代表此處為需要求解的函數(shù);Eq表示相等,即建立f'(x)與右側(cè)式子相等的關(guān)系。
輸出結(jié)果非常直觀,直接輸出原函數(shù),但是建議大家化簡(jiǎn)一下:

(2)求解線性微分方程
例23. 求?5?f '(x) + 2 f(x) = cosx 的通解
這里依然需要?jiǎng)?chuàng)建Eq對(duì)象,分別將等式兩邊放入兩個(gè)參數(shù)的位置。
計(jì)算結(jié)果如下所示:

例24. 求??的通解
如果遇到高階導(dǎo)函數(shù),只需要在diff中輸入第二個(gè)參數(shù)表示階數(shù)即可,其他與一階的求解方法相同。
計(jì)算結(jié)果如下所示:

矩陣計(jì)算
(1)創(chuàng)建矩陣
根據(jù)不同的需求,有以下幾種方法創(chuàng)建矩陣。
創(chuàng)建結(jié)果如下所示:

(2)修改矩陣
如果需要修改矩陣的某個(gè)元素值,可以直接按照類似修改數(shù)組的方式對(duì)其進(jìn)行修改。只不過格式有些不同,坐標(biāo)之間需要用逗號(hào)隔開,或者直接按照由行到列的順序從0開始進(jìn)行編號(hào)。
兩種方法修改結(jié)果如下所示:

也可以直接修改某一行或某一列。矩陣的第一個(gè)坐標(biāo)代表行,第二個(gè)坐標(biāo)代表列,使用:(冒號(hào))代表所有的行或所有的列,例如m[2,:]代表第3行以及所有的列(從0開始編號(hào),所以2代表第3行,第3行以及所有的列的交集就是第3行)。
修改結(jié)果如下所示:

(3)矩陣計(jì)算
矩陣計(jì)算包括但不限于矩陣加減乘法、求轉(zhuǎn)置矩陣、求逆矩陣、求伴隨矩陣、求矩陣行列式值、求矩陣特征值、求矩陣多項(xiàng)式等。
計(jì)算結(jié)果如下圖所示:

求積分變換
(1)拉普拉斯變換
例25. 求??的拉普拉斯變換
求解拉普拉斯變換需要用到laplace_transform函數(shù)。
解得??:

(2)拉普拉斯逆變換
例26. 求??的拉普拉斯逆變換
求解拉普拉斯逆變換需要用到inverse_laplace_transform函數(shù)。
解得?f(t)=2sint :

(3)傅里葉變換
傅里葉變換使用fourier_transform函數(shù),其他部分與拉普拉斯變換一致,在此不再重復(fù)敘述。
(4)傅里葉逆變換
傅里葉逆變換使用inverse_fourier_transform函數(shù),,其他部分與拉普拉斯逆變換一致,在此不再重復(fù)敘述。
學(xué)了代碼,可以摸魚嗎?
為了檢測(cè)學(xué)習(xí)效果如何,這里有幾道題幫大家練練手:

如果本文對(duì)你有所幫助,歡迎點(diǎn)贊、評(píng)論、轉(zhuǎn)發(fā),聽說關(guān)注我的人都變帥了。誒嘿~
