Python+Sympy實現(xiàn)計算微積分
微積分的計算也許平時用不到,會讓人覺得有點高深。
但其實它在數(shù)學(xué)專業(yè)的人眼中,也不過是一種極其普通的計算,是一種和加減乘除差不多的級別的常用計算方式。
微積分和求極限運算本身不是很難,只是它們的計算規(guī)則不像加減乘除那么簡單。
它們的計算過程中需要使用很多計算規(guī)則(這些不太容易記?。?,就像計算三角函數(shù)要記住很多三角函數(shù)的公式和定理一樣。
使用 Sympy 可以有效減輕這方面的負(fù)擔(dān),讓我們用編程的方式來解決微積分問題。
1. 極限計算
極限計算的應(yīng)用場景很廣,也是學(xué)習(xí)微積分的前置步驟。
1.1. 函數(shù)極限
比如這個簡單的函數(shù)lim?x→∞1/x,
我們想知道它在x趨于無窮大時的值,普通的加減乘除算法就無法運算。
用 Sympy 來計算:
from sympy import Symbol, Limit, S Limit(1/x, x, S.Infinity).doit() #運行結(jié)果 0
當(dāng) x 趨向于0時,
Limit(1/x, x, 0).doit() #運行結(jié)果,下面的符號表示正無窮大 oo
1.2. 瞬時速度
在物理上,計算瞬時速度的時候,也會用極限的計算。
比如,存在一個路程和時間的公式:S=t2+2t+10 (S表示路程,t表示時間)
計算瞬時速度時,步驟如下:
- 假設(shè)初始路程S
- 經(jīng)過Δt時間后,路程變?yōu)?Delta;S=(t+Δt)2+2(t+Δt)+10
- 此時間間隔內(nèi)的平均速度為:V=(ΔS−S?)/Δt
- 當(dāng)Δt趨向于
0時,此速度V即為瞬時速度。
用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()運行結(jié)果:2t+2
這就是瞬時速度和時間的關(guān)系,通過這個公式,就能算出每個時間點的瞬時速度。
3. 微分計算
微分計算可以看做是一種求極限的運算方式,通過微分的運算規(guī)則,求極限更加簡單。
3.1. 導(dǎo)數(shù)
還是上面瞬時速度的例子,用微分的方式,可以更快的得到結(jié)果。
from sympy import Derivative #導(dǎo)數(shù) s = t * t + 2 * t + 10 Derivative(s, t).doit()
運行的結(jié)果:2t+2,和上面求極限的方式計算的結(jié)果一樣。
3.2. 偏導(dǎo)數(shù)
當(dāng)函數(shù)的變量不止一個的時候,可以分別對不同的變量求導(dǎo),這也就是偏導(dǎo)數(shù)。
比如函數(shù):f(x,y)=5x2+6y2+10xy+2x+3y
- 對變量
x的偏導(dǎo)數(shù):df(x,y)/dx=10x+10y+2 - 對變量
y的偏導(dǎo)數(shù):df(x,y)/dy=10x+12y+3
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()
運行結(jié)果:dx=10x+10y+2,dy=10x+12y+3
3.3. 高階導(dǎo)數(shù)
上面的微分計算求解的都是一階導(dǎo)數(shù),在尋找函數(shù)全局極值點的時候,還要用到高階導(dǎo)數(shù)。
計算高階導(dǎo)數(shù)也簡單,上面 Derivative 函數(shù)的第三個參數(shù)就是求導(dǎo)的階數(shù)(默認(rèn)是1)。
#高階導(dǎo)數(shù) f = x**5 - 3 * x**3 + 5 * x #3階導(dǎo)數(shù) dx3 = Derivative(f, x, 3).doit() #4階導(dǎo)數(shù) dx4 = Derivative(f, x, 4).doit()
運行結(jié)果:dx3=6(10x2−3),dx4=120x
4. 積分計算
積分是微分的逆運算,手動計算的話一般需要查詢積分表,非常麻煩。
使用Sympy的話,就是一行代碼的事兒。
from sympy import Integral expr = 2 * x Integral(expr).doit()
運行結(jié)果:x2
除了可以得到積分后的表達式,也可以直接計算積分的值。
比如計算:∫2.57.5(x2+2)
expr = x * x + 2 Integral(expr, (x, 2.5, 7.5)).doit() #運行結(jié)果:145.416666666667
5. 總結(jié)回顧
本篇主要介紹了Sympy在微積分方面的使用方法。
不過,能夠計算微積分這些還不是Sympy吸引我的地方,它最主要的特色是能夠符號化程序中的變量和表達式,這樣就使得編寫的程序和用數(shù)學(xué)公式推導(dǎo)的過程極其類似,可以更加直觀的表達自己的數(shù)學(xué)知識。
PS.
我在jupyter notebook中使用 Sympy 時,發(fā)現(xiàn)直接顯示Sympy的變量和表達式都非常漂亮,都是Latex格式的。
以上就是Python+Sympy實現(xiàn)計算微積分的詳細(xì)內(nèi)容,更多關(guān)于Python Sympy計算微積分的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python 處理telnet返回的More,以及get想要的那個參數(shù)方法
今天小編就為大家分享一篇python 處理telnet返回的More,以及get想要的那個參數(shù)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02
如何利用Python和matplotlib更改縱橫坐標(biāo)刻度顏色
對于圖表來說最簡單的莫過于作出一個單一函數(shù)的圖像,下面這篇文章主要給大家介紹了關(guān)于如何利用Python和matplotlib更改縱橫坐標(biāo)刻度顏色的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08
PyTorch中關(guān)于tensor.repeat()的使用
這篇文章主要介紹了PyTorch中關(guān)于tensor.repeat()的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11

