無論是三大數學軟體Matlab(通訊、控制等工程例外)、Maple、Mathematica,還是三大統計軟體Spass、Stata、SAS,這些視覺化的軟體本身就是程式設計的一個體現,它們在一定程度上降低了我們使用數學的門檻,但另一方面它們背後的功能是可以被程式設計取代的,而Python在數學和資料科學領域的流行,也是逐漸取代這些軟體的一個過程。
在職業方面,精算師、金融工程、商業分析、資料分析師、資料探勘、資料建模、量化工程師、演算法工程師、資料產品經理、資料運營、數字營銷、大資料、遊戲開發、人工智慧等諸多職業崗位都對數學有要求,但是我們會發現這些崗位對數學的應用都需要使用到數學軟體以及需要與程式設計結合,可以說我們要應用數學,天然就應該與程式設計有機結合起來。而在數學、資料領域,由於Python程式語言的膠水性質以及極為豐富的第三方庫,Python漸已成為學數學最值得推薦的程式語言。
用Python學數學技術專欄就嘗試如何將數學與程式設計有機結合起來,讓數學的學習迴歸到基礎概念的理解和實際應用之中去。(當然專欄的目的主要是為資料科學和機器學習等的基礎服務)
為什麼數學那麼難學且無用?
所謂將數學與程式設計有機結合,一是在數學學習的方向上就以數學的實際應用為重心;二是數學在符號上、圖形上等的表現形式應該與程式語言無縫結合。
在我們學生時代的數學教學存在著諸多弊端:
- 一是以往的教育過於強調具體的計算能力,很多數學學得好的,不過是解題高手,一些極其複雜的微分方程、矩陣等還停留在筆算技巧和筆算能力上,而且對數學的應用需要死記硬背大量複雜的數學公式,這無疑加大了數學學習的難度,也偏離了數學原本的方向;在專欄的代數符號運算裡面,我們就提到過可以藉助於Sympy這種CAS工具來進行復雜的數學運算,從此數學公式的記憶與筆算不再是學習的重點;
- 二是真正好的數學教學是應該要複雜的數學理論知識簡化,國內大學教程相比於國外存在很多不足之處,所以接下來我們也會推薦一些比較好的數學教程。很多人數學學不好、學不會在很大程度上也與教程對數學概念的講解有一定的關係;
- 三是結合Python程式設計是可以對一些數學的問題進行建模的,通過程式設計來進行數學建模在前面我們提到的那麼多職業,他們對數學的要求基礎大多是微積分、概率統計、線性代數相關的知識,只是在以往的學習裡,我們看不到數學是如何應用到這些職業裡的;
四是結合Python以及一些數學軟體,我們可以做出一些動態圖形,加深大家對數學公式的理解
精選數學教程
到了大學之後,線性代數、概率統計、微積分等數學知識的難度較中學時代更高,整個數學的畫風變化過大,很多概念開始變得難以理解,不知道怎麼突然就冒出來了,也不知道學了有什麼用。關於這些,其實有一部分是我們教材的原因,國內大學教材的編寫者沒有產品經理思維,沒有切實站在學生的角度、沒有以學生為中心來寫教材。這裡推薦一些公認比較好的教材:
線性代數
關於線性代數這裡我們推薦兩個教程,一個是William Gilbert Strang(威廉·吉爾伯特·斯特朗)的視訊教程麻省理工公開課:線性代數,這個視訊教程有配套的教材線性代數導論,價格有點性感,不過不看書也是OK的。Strang是麻省理工MIT的教授,寫過很多經典的數學教材。他親自傳授的這個線性代數課程也是享有盛譽。我們還可以在MIT的開放課程裡檢視更多關於課程的資訊:MIT線性代數課程官網。這個課程還有配套的習題課,在網易雲課堂上也可以看到MIT線性代數習題課
二是3Blue1Brown的線性代數的本質。3Blue1Brown是史丹佛大學畢業的一個小哥創辦的Youtube頻道,擅長用直觀的方法來闡述難以理解的概念,非常推薦。
微積分
微積分的課程我們也同樣是推薦MIT和3Blue1Brown的課程。微積分在MIT分為單變數微積分和多變數微積分,而且都有配套的習題視訊,在網易雲課堂都可以看到。
單變數微積分、單變數微積分習題課、多變數微積分、多變數微積分習題課。如果想看更多視訊內容也可以去MIT官網上了解一下,單變數微積分官網、多變數微積分官網。
3Blue1Brown的微積分的本質講的也是一如既往的好,可以在學習MIT課程前先看。
統計學
統計學是一門非常重要的知識,這裡我們推薦Khan Academy可汗學院的統計學教程,雖然也有MIT統計學教程,可惜的是沒有字幕,如果你聽不懂,可以去Youtube上藉助AI字幕來看,也可以去MIT統計學基礎官網上獲取更多資料。還有一個史丹佛大學的統計學習入門(英文字幕)相當不錯。
以上教程可能有的使用的R或MATLAB,這些都是可以用Python來代替的。
數學公式與影像展示
有趣的數學圖形
為了加深我們對數學公式的理解,我們通常都需要輔之以一些圖形,比如函式的圖形、幾何圖形、空間圖形等。以往我們作圖都是通過在紙上手繪一些圖形,不僅麻煩,而且非常不精確,更無法讓圖形根據變數取值的變化來直觀的調整圖形。
比如下面這個公式:
$$y=x^{\frac{2}{3}}+0.9\sqrt{3.3-x^2}\sin\left(\pi x\right)$$
為了手繪出這個圖形,我們不僅要研究這個數學公式的特性(比如最高點、最低點、拐點、凹凸性)、還要通過賦值的方式來確定圖形的輪廓。當然由於賦值的有限,圖形自然是無法做到精準的。這還是隻有一個變數的情況下,有時我們為了研究數學公式,可能會有多個變數,比如下面的公式除了x這個變數以外,還會有變數b:
$$y=x^{\frac{2}{3}}+0.9\sqrt{3.3-x^2}\sin\left(b\pi x\right)$$
由於公式過於複雜,學生時代數學公式的圖形繪製也花了我們大量的時間。但是圖形卻又是有必要的,因為它可以加深我們對數學公式的理解。其實我們是可以藉助於計算機軟體來實現這個公式的圖形的。
數學圖形繪製軟體
那上面這個數學公式圖形的動畫效果是怎麼做的呢,可以使用Desmos或Geogebra 線上版本來繪製,雖然萬能的Wolfram Alpha( Mathematica產品也是該公司的)也可以做到,不過體驗比較差還收費。Desmos、Geogebra、Wolfram Alpha(收費)都有非常不錯的App產品,非常值得學習數學的朋友使用這些軟體來增進對數學公式、概念等的理解。
Desmos、Geogebra可以通過虛擬鍵盤的方式來輸入公式,非常方便,而且公式輸入框裡面的公式格式是LaTex,可以直接複製公式到VS Code的Markdown裡,加上$$$$
符號即可顯示,對LaTex不瞭解的童鞋可以閱讀本專欄用Python學數學裡面的《使用Markdown輸出LaTex數學公式》。同時你也可以直接把LaTex格式的數學公式直接貼上到Desmos、Geogebra的數學公式輸入框裡面。比如把下面LaTex格式的數學公式貼上到數學公式輸入框裡面,將b作為變數:
x^{\frac{2}{3}}+0.9\sqrt{3.3-x^2}\sin\left(b\pi x\right)
Desmos、Geogebra可以給數學公式新增變數,你可以使用Slider來調整變數的值,圖形會實時繪製並展示出來,堪稱教學神器,以後再也不用手繪數學圖形啦~
其他數學相關軟體(含App)
既然都已經是網際網路時代了,藉助於PC端線上版本的軟體以及手機端的App來學習數學是理所應當的,在美國等國家,這些數學軟體早已走進了課堂(對中小學數學軟體感興趣的朋友可以自行搜尋整理了解一下,這裡就不介紹了)。
Symbolab:告訴你運算步驟的數學軟體
Symbolab :這是一個高等數學計算器,支援Online版本(也有不錯的App軟體),可以用來計算一些基礎的代數、函式、三角、微積分等數學公式以及化學公式的運算,它最有特色的功能是可以給出比較詳細運算的步驟,如果你想計算下列數學公式的值:
$$\int \left(x^2+ax-3\right)^2dx$$
用Symbolab來計算,除了可以得出如下結果:
$$\int \left(x^2+ax-3\right)^2dx=\frac{ax^4}{2}+\frac{x^5}{5}-2x^3+\frac{a^2x^3}{3}-3ax^2+9x+C$$
它還會把整個運算步驟的細節也給你展示出來,非常適合學生再做數學習題時,來檢查自己運算步驟是否錯誤,也適合老師出數學習題。
類似這樣的數學軟體還有MathPapa(整體感覺比Symbolab要差),Photomath (有手機App,除了可以拍照識別公式外,也不如Symbolab)、Mathway(也比較一般,手機App倒是不錯)。你也可以在應用商店通過搜尋“Math”來獲取其他數學App,不過它們的功能和以上所說的這些都是類似的。
Python是萬能的
我們一直強調的是以上所述所有數學軟體都是可以被Python取代的(需要GUI圖形點選操作也可以,只是比較複雜,不推薦而已),用數學軟體是很難做到與程式設計結合的,也無法使用到一些API將資料對接到生產環節裡去。不能與程式設計結合,數學公式就是死的,不能有效將資料應用到生產實踐裡,資料的商業價值就大打折扣。所以,除了繪製數學圖形外,學習數學就應該完全與程式設計有機結合。
那Python怎麼繪製數學圖形呢?我們可以使用最常用的資料視覺化庫matplotlib以及可以做代數符號運算的Sympy來繪製數學圖形。
使用matplotlib繪製 $3x+2x-4$的數學圖形:
import numpy as np
import matplotlib.pyplot as plt
def graph(formula, x_range):
x = np.array(x_range)
y = eval(formula)
plt.plot(x, y)
plt.show()
graph('x**3+2*x-4', range(-10, 11))
使用Sympy繪製$x^2$和$x$交叉的數學圖形:
from sympy import symbols
from sympy.plotting import plot
x = symbols('x')
p1 = plot(x*x, show=False)
p2 = plot(x, show=False)
p1.append(p2[0])
p1.show()
另:使用Python的Sympy Gamma也同樣獲得解題的詳細步驟,不過使用體驗上是沒法和Symbolab相比的