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