微積分的計算也許平時用不到,會讓人覺得有點高深。
但其實它在數學專業(yè)的人眼中,也不過是一種極其普通的計算,是一種和加減乘除差不多的級別的常用計算方式。
微積分和求極限運算本身不是很難,只是它們的計算規(guī)則不像加減乘除那么簡單。
它們的計算過程中需要使用很多計算規(guī)則(這些不太容易記?。?,就像計算三角函數要記住很多三角函數的公式和定理一樣。
使用 Sympy
可以有效減輕這方面的負擔,讓我們用編程的方式來解決微積分問題。
1. 極限計算
極限計算的應用場景很廣,也是學習微積分的前置步驟。
1.1. 函數極限
比如這個簡單的函數,
我們想知道它在x
趨于無窮大時的值,普通的加減乘除算法就無法運算。
用 Sympy
來計算:
from sympy import Symbol, Limit, S
Limit(1/x, x, S.Infinity).doit()
#運行結果
0
當 x 趨向于0時,
Limit(1/x, x, 0).doit()
#運行結果,下面的符號表示正無窮大
oo
1.2. 瞬時速度
在物理上,計算瞬時速度的時候,也會用極限的計算。
比如,存在一個路程和時間的公式: (S
表示路程,t
表示時間)
計算瞬時速度時,步驟如下:
用Sympy
來實現(xiàn)很方便:
# 2. 順時速度
t = Symbol('t')
s_t = t * t + 2 * t + 10
delta_t = Symbol('delta_t')
s_delta = s_t.subs({t: t + delta_t})
expr = Limit((s_delta - s_t) / delta_t, delta_t, 0)
expr.doit()
運行結果:
這就是瞬時速度和時間的關系,通過這個公式,就能算出每個時間點的瞬時速度。
3. 微分計算
微分計算可以看做是一種求極限的運算方式,通過微分的運算規(guī)則,求極限更加簡單。
3.1. 導數
還是上面瞬時速度的例子,用微分的方式,可以更快的得到結果。
from sympy import Derivative
#導數
s = t * t + 2 * t + 10
Derivative(s, t).doit()
運行的結果:,和上面求極限的方式計算的結果一樣。
3.2. 偏導數
當函數的變量不止一個的時候,可以分別對不同的變量求導,這也就是偏導數。
比如函數:
Sympy 實現(xiàn)方式:
f_xy = 5 * x * x + 6 * y * y + 10 * x * y + 2 * x + 3 * y
dx = Derivative(f_xy, x).doit()
dy = Derivative(f_xy, y).doit()
運行結果: ,
3.3. 高階導數
上面的微分計算求解的都是一階導數,在尋找函數全局極值點的時候,還要用到高階導數。
計算高階導數也簡單,上面 Derivative
函數的第三個參數就是求導的階數(默認是1
)。
#高階導數
f = x**5 - 3 * x**3 + 5 * x
#3階導數
dx3 = Derivative(f, x, 3).doit()
#4階導數
dx4 = Derivative(f, x, 4).doit()
運行結果:,
4. 積分計算
積分是微分的逆運算,手動計算的話一般需要查詢積分表,非常麻煩。
使用Sympy
的話,就是一行代碼的事兒。
from sympy import Integral
expr = 2 * x
Integral(expr).doit()
運行結果:
除了可以得到積分后的表達式,也可以直接計算積分的值。
比如計算:
expr = x * x + 2
Integral(expr, (x, 2.5, 7.5)).doit()
#運行結果:145.416666666667
5. 總結回顧
本篇主要介紹了Sympy
在微積分方面的使用方法。
不過,能夠計算微積分這些還不是Sympy
吸引我的地方,
它最主要的特色是能夠符號化程序中的變量和表達式,
這樣就使得編寫的程序和用數學公式推導的過程極其類似,可以更加直觀的表達自己的數學知識。
PS.
我在jupyter notebook中使用 Sympy
時,發(fā)現(xiàn)直接顯示Sympy
的變量和表達式都非常漂亮,都是Latex
格式的。