物理與計算
在物理學裏,研究的焦點是《力》!
數學裏我們用《向量》描述《力》,然後用《向量場》描述《力場》。
《經典物理》裏的《力場》有《引力場》與《電磁場》,而《量子物理》裏則多出了原子內的《弱作用力與強作用力》。
一維的力場
根據牛頓的引力公式,以微積分的符號描述一維的引力現象,可以寫成:
F=m a
F=m {dv \over dt}=m v'(t)
F=m {d^2x \over dt^2}=mx''(t)
多維的力場
牛頓為了描述《力》而發展出來的《微積分》,在多變數的狀況下,會變成《向量微積分》(基本上就是《多變數微積分》),在眾多數學家的持續發展之下,《向量微積分》成為計算物理學的利器。
一個《純量場》 (例如位能) 取微分成為《梯度》之後,就成為了《向量場》(例如引力) ,當然、反過來將《向量場》積分之後,就會變成《純量場》。
牛頓力學是如此,電磁學也是如此,《引力》和《靜電庫倫力》都會形成《力場》,而這些力場積分之後就形成了《引力位能》與《靜電力位能》。
《梯度》的數學定義如下:
\nabla_{x} f(x) = \left[ \frac{\partial }{\partial x_1} f(x), \frac{\partial }{\partial x_2} f(x),\cdots,\frac{\partial }{\partial x_n} f(x) \right]^T=\frac{\partial }{\partial{x}} f(x)
若把《梯度》當成一個《巨型算子》可以寫為如下形式:
\nabla_{x} = \left[ \frac{\partial }{\partial x_1}, \frac{\partial }{\partial x_2},\cdots,\frac{\partial }{\partial x_n} \right]^T=\frac{\partial }{\partial{x}}
這樣的數學雖然只是《基本的偏微分》,但是卻足以嚇倒很多人 (包括我在內!)。
梯度的計算
其實、很多數學只要回到基本定義,就一點都不可怕了!
讓我們先回頭看看梯度中的基本元素,也就是偏微分,其定義是:
\frac{\partial }{\partial x_1} f(x) = \lim_{h \to 0} \frac{f(x_1, ..., x_i+h, ...., x_n)-f(x_1, ..., x_i, ...., x_n)}{h}
舉例而言,假如對 $f(x,y) = x^2+y^2$ 這個函數而言,其對 x 的偏微分就是:
\frac{\partial }{\partial x} f(x,y) = \lim_{h \to 0} \frac{f(x+h,y)-f(x,y)}{h}
而對 y 的偏微分就是:
\frac{\partial }{\partial y} f(x,y) = \lim_{h \to 0} \frac{f(x,y+h)-f(x,y)}{h}
於是我們可以寫一個函數 df 來計算偏微分:
// 函數 f 對變數 k 的偏微分: df(p) / dk
let df = function (f, p, k, h=0.001) {
let p1 = clone(p)
p1[k] += h
return (f(p1) - f(p)) / h
}
這樣我們就可以用下列指令計算出 f(x,y) 在 (1,1) 這點的偏導數:
df(f, {x:1, y:1}, 'x')
只要我們對每個變數都取偏導數,然後形成一個向量,就能計算出《梯度》了! 其 JavaScript 程式如下:
// 函數 f 在點 p 上的梯度 ∇f(p)
let grad = function (f, p) {
let gp = {}
for (let k in p) {
gp[k] = nn.df(f, p, k) // 對變數 k 取偏導數後,放入梯度向量 gp 中
}
return gp
}
於是我們可以用 grad() 下列程式計算 f 在 (1,1) 這點的梯度。
grad(f, {x:1, y:1})
假如我們定義函數 f 為 $f(x,y) = x^2+y^2$ ,那麼 f 在 (1,1) 的梯度將會是 (2x, 2y) = (2,2)。
讓我們用程式實作一下,並驗證看看梯度的計算是否正確:
先定義函數 $f(x,y) = x^2+y^2$
function f (p) {
let {x,y} = p
return (x * x + y * y)
}
然後呼叫我們的示範套件 nn,看看其計算結果是否正確:
console.log('df(f(x:1,y:1), x) = ', df(f, {x:1, y:1}, 'x'))
console.log('grad(f(x:1,y:1))=', grad(f, {x:1, y:1}))
執行結果如下:
$ node .\gradientEx.js
df(f(x:1,y:1), x) = 2.010000000000023
grad(f(x:1,y:1))= { x: 2.010000000000023, y: 2.010000000000023 }
您可以看到《偏微分與梯度》的計算,基本上都非常接近,所以是正確的。
旋轉型的力場
對於《旋轉型的力》,我們一樣會用《向量場》表示,但由於《圓周運動》是描述《旋轉型力量》的關鍵,數學上我們通常用《三角函數》 sin, cos 來描述圓周運動。
但是根據以下的《尤拉公式》,我們可以將《實數空間》擴充到《複數空間》,就能更好的利用 $e^{i \theta}$ 來描述《旋轉型的力量》所造成的效果。
e^{i \theta} = cos(\theta) + i sin(\theta)
透過上述的《尤拉公式》,我們可以引出《傅立葉轉換》,將《點空間》轉換到《頻率空間》,因而形成
\hat{f}(\xi) = \int_{-\infty}^\infty f(x)\ e^{- 2\pi i x \xi}\,dx = \int_{-\infty}^\infty f(x)\ (cos (- 2\pi i x \xi) + i sin(- 2\pi i x \xi)) \,dx
在《訊號處理》領域,《傅立葉轉換》是用來描述《波函數》的利器,而這些波函數其實就是《粒子點的圓周運動》所造成的現象。
或許這就是《數學版的波粒二象性》吧!
像是《旋轉的鐵盤、齒輪》、以及《流體力學》的《液體漩渦》、還有《震盪的電荷》能產生《電磁波》、《量子力學》裏的《機率波》與《狄拉克波動方程》等等,都是可以用《複數空間》與《傅立葉轉換》處理的領域!
我很難想像,要是沒有這些數學,那麼該如何處理那些《圓周運動和波動》呢?