用Julia學(xué)習(xí)微積分:這有一份高贊數(shù)學(xué)教程 | 附習(xí)題+代碼
Julia的優(yōu)勢(shì)是完全開(kāi)源和免費(fèi)。
曉查 發(fā)自 凹非寺
量子位 報(bào)道 | 公眾號(hào) QbitAI
以快速簡(jiǎn)潔聞名Julia,本身就是為計(jì)算科學(xué)的需要而生。用它來(lái)學(xué)習(xí)微積分再合適不過(guò)了,而且Julia的語(yǔ)法更貼近實(shí)際的數(shù)學(xué)表達(dá)式,對(duì)沒(méi)學(xué)過(guò)編程語(yǔ)音的初學(xué)者非常友好。
最近,來(lái)自紐約斯塔頓島學(xué)院的數(shù)學(xué)系教授John Verzani編寫(xiě)了一份微積分與Julia的教程,里面常見(jiàn)的微積分概念和圖像演示都有,比課本更生動(dòng)直觀,每個(gè)章節(jié)后還附習(xí)題供讀者鞏固知識(shí)。
雖然很多學(xué)校在使用Mathematica、Maple等數(shù)學(xué)軟件在進(jìn)行教學(xué),但是Julia的優(yōu)勢(shì)是完全開(kāi)源和免費(fèi)。
準(zhǔn)備工作
在使用教程之前,我們先給Julia安裝Plots包,這是用來(lái)繪制函數(shù)圖像的擴(kuò)展包。此外還要安裝SymPy科學(xué)計(jì)算庫(kù)等其他軟件包。
using Pkg Pkg.add("Plots") Pkg.add("SymPy") Pkg.add("Roots") Pkg.add("ForwardDiff") Pkg.add("ImplicitEquations") using Plots plot(sin, 0, 2pi)
安裝完以上的擴(kuò)展包,就可以繪制函數(shù)圖像了。我們簡(jiǎn)單繪制0到2π范圍的正弦函數(shù)圖像:
using Plots plot(sin, 0, 2pi)
Julia支持輸入特殊數(shù)學(xué)符號(hào),具體的方法是斜杠\后緊跟符號(hào)的LaTeX名稱(chēng),然后按下Tab鍵,就能輸出特殊字符。比如:
θ = 45; v? = 200
輸入θ的方法是\theta[tab],輸入v?的方法是v\_0[tab]。
導(dǎo)數(shù)
完成了Julia部分的基本教學(xué)后,下面就是微積分的基本概念了。
先回顧一下導(dǎo)數(shù)的定義,從函數(shù)圖像上來(lái)看,導(dǎo)數(shù)就是函數(shù)割線(xiàn)斜率的極限,當(dāng)割線(xiàn)上兩點(diǎn)合并成一點(diǎn)時(shí),它就變?yōu)榍芯€(xiàn)。
其實(shí)就是求下面的極限:
Julia集成了求極限的功能,對(duì)于正弦函數(shù)sin(x)而言,求它的導(dǎo)數(shù)就是[sin(x+h)-sin(x)]/h在h趨于0時(shí)的極限
using SymPy limit((sin(x+h) - sin(x))/ h, h, 0)
通過(guò)以上方法求得sin(x)在x=0處的導(dǎo)數(shù)為1,繪制成函數(shù)圖像就是:
f(x) = sin(x) c = 0 tl(x) = f(c) + 1 * (x - c) plot(f, -pi/2, pi/2) plot!(tl)
導(dǎo)數(shù)的應(yīng)用
1、牛頓法
通過(guò)切線(xiàn)逐步逼近,求方程的近似解。
2、洛必達(dá)法則求極限
寫(xiě)成Julia語(yǔ)言:
using SymPy a,x = symbols("a, x", positive=true, real=true) f(x) = sqrt(2a^3*x - x^4) - a * (a^2*x)^(1//3) g(x) = a - (a*x^3)^(1//4)
上面的表達(dá)式過(guò)于復(fù)雜,是0/0的未定式,對(duì)分子f(x)和分母g(x)分別分別求導(dǎo):
fp, gp = subs(diff(f(x),x), x=>a), subs(diff(g(x),x), x=>a)
得到結(jié)果
(-4*a/3, -3/4)
所以極限值為16a/9。
積分
定積分就是求函數(shù)曲線(xiàn)下包圍面積:
上圖展示了求定積分的方法:把函數(shù)下方圖形分割成若干個(gè)長(zhǎng)條,隨著長(zhǎng)條越分越細(xì),這些長(zhǎng)條的面積之和就越來(lái)越接近曲線(xiàn)下包圍的面積。
為了求函數(shù)f(x)=x2在[0,1]區(qū)間里的定積分的近似值,我們把整個(gè)區(qū)域劃分成50000份:
a, b = 0, 1 f(x) = x^2 n = 50_000 xs = a:(b-a)/n:b deltas = diff(xs) cs = xs[1:end-1] sum(f(cs[i]) * deltas[i] for i in 1:length(deltas))
最后求得結(jié)果為:
0.3333233333999998
顯然用這種方法求定積分太過(guò)復(fù)雜,這就需要引入不定積分的概念。不定積分是已知導(dǎo)數(shù)f’(x)求原函數(shù)f(x)。
定積分與不定積分由牛頓-萊布尼茲公式聯(lián)系起來(lái):
積分的應(yīng)用
學(xué)會(huì)了積分以后,教程里給出了它的幾個(gè)實(shí)際應(yīng)用案例:
1、求曲線(xiàn)長(zhǎng)度
求解f(x)=x2在[0,1]這段區(qū)間里的弧長(zhǎng),實(shí)際上求積分。
先求不定積分:
using SymPy @vars x F = integrate(sqrt(1 + (2x)^2), x)
F(1)-F(0)就是所求弧長(zhǎng):
2、求體積
求體積的方法是把物體“切”成一圈圈的米其林,每一圈的體積加起來(lái)就是總體積。
將直線(xiàn)x/r+y/h=1繞著y軸旋轉(zhuǎn)一周,得到一個(gè)底面直徑為r,高度為h的圓錐體。
using SymPy @vars r h x y R = r*(1 - y/h) integrate(pi*R^2, (y, 0, h))
最后求得體積:
教程中還有很多其他基本概念,由于篇幅較長(zhǎng),我們就不一一介紹了,感興趣的朋友可以去博客中進(jìn)一步學(xué)習(xí)。
原文地址:
https://calculuswithjulia.github.io/
- 腦機(jī)接口走向現(xiàn)實(shí),11張PPT看懂中國(guó)腦機(jī)接口產(chǎn)業(yè)現(xiàn)狀|量子位智庫(kù)2021-08-10
- 張朝陽(yáng)開(kāi)課手推E=mc2,李永樂(lè)現(xiàn)場(chǎng)狂做筆記2022-03-11
- 阿里數(shù)學(xué)競(jìng)賽可以報(bào)名了!獎(jiǎng)金增加到400萬(wàn)元,題目面向大眾公開(kāi)征集2022-03-14
- 英偉達(dá)遭黑客最后通牒:今天必須開(kāi)源GPU驅(qū)動(dòng),否則公布1TB機(jī)密數(shù)據(jù)2022-03-05