Python+Sympy實(shí)現(xiàn)計(jì)算微積分
微積分的計(jì)算也許平時(shí)用不到,會(huì)讓人覺得有點(diǎn)高深。
但其實(shí)它在數(shù)學(xué)專業(yè)的人眼中,也不過(guò)是一種極其普通的計(jì)算,是一種和加減乘除差不多的級(jí)別的常用計(jì)算方式。
微積分和求極限運(yùn)算本身不是很難,只是它們的計(jì)算規(guī)則不像加減乘除那么簡(jiǎn)單。
它們的計(jì)算過(guò)程中需要使用很多計(jì)算規(guī)則(這些不太容易記?。?,就像計(jì)算三角函數(shù)要記住很多三角函數(shù)的公式和定理一樣。
使用 Sympy 可以有效減輕這方面的負(fù)擔(dān),讓我們用編程的方式來(lái)解決微積分問(wèn)題。
1. 極限計(jì)算
極限計(jì)算的應(yīng)用場(chǎng)景很廣,也是學(xué)習(xí)微積分的前置步驟。
1.1. 函數(shù)極限
比如這個(gè)簡(jiǎn)單的函數(shù)lim?x→∞1/x,
我們想知道它在x趨于無(wú)窮大時(shí)的值,普通的加減乘除算法就無(wú)法運(yùn)算。
用 Sympy 來(lái)計(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)表示正無(wú)窮大 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)過(guò)Δ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來(lái)實(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)系,通過(guò)這個(gè)公式,就能算出每個(gè)時(shí)間點(diǎn)的瞬時(shí)速度。
3. 微分計(jì)算
微分計(jì)算可以看做是一種求極限的運(yùn)算方式,通過(guò)微分的運(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在微積分方面的使用方法。
不過(guò),能夠計(jì)算微積分這些還不是Sympy吸引我的地方,它最主要的特色是能夠符號(hào)化程序中的變量和表達(dá)式,這樣就使得編寫的程序和用數(shù)學(xué)公式推導(dǎo)的過(guò)程極其類似,可以更加直觀的表達(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)文章
解決PyCharm同目錄下導(dǎo)入模塊會(huì)報(bào)錯(cuò)的問(wèn)題
今天小編就為大家分享一篇解決PyCharm同目錄下導(dǎo)入模塊會(huì)報(bào)錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10
python-pymysql獲取字段名稱-獲取內(nèi)容方式
這篇文章主要介紹了python-pymysql獲取字段名稱-獲取內(nèi)容方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
Python pymysql連接數(shù)據(jù)庫(kù)并將查詢結(jié)果轉(zhuǎn)化為Pandas dataframe
這篇文章主要為大家介紹了Python pymysql連接數(shù)據(jù)庫(kù)并將結(jié)果轉(zhuǎn)化為Pandas dataframe實(shí)現(xiàn)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
利用Celery實(shí)現(xiàn)Django博客PV統(tǒng)計(jì)功能詳解
給網(wǎng)站增加pv、uv統(tǒng)計(jì),可以是件很簡(jiǎn)單的事,也可以是件很復(fù)雜的事。下面這篇文章主要給大家介紹了利用Celery實(shí)現(xiàn)Django博客PV統(tǒng)計(jì)功能的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-05-05
pytest使用@pytest.mark.parametrize()實(shí)現(xiàn)參數(shù)化的示例代碼
這篇文章主要介紹了pytest使用@pytest.mark.parametrize()實(shí)現(xiàn)參數(shù)化,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07

