chainsawriot

Home | About | Archive

Teach myself linear algebra using R #1

Posted on Nov 16, 2011 by Chung-hong Chan

我讀了多年書,都沒有學過 Linear Algebra 。近來由於學 Machine Learning 的關係要學點點 Linear Algebra 。
其實很多問題都可以用 Linear Algebra 解決,只不過以前讀書時沒有教以此方法解決。例如 Chemistry 的 Balancing redox equations 問題

a SnO2 + b H2 → c Sn + d H2O

典型的會考題目,就是解決以上 equation 的 a, b, c, d 。我已忘記了怎樣解決,大約的方法不外乎試 ( Trial and error ) 。先設定 a, b, c, d 都等於 1 。那時 equation 左邊的 Oxygen 有兩個,故此先試 d = 2 。而當 d = 2 ,右邊的 Hydrogen 又變成四個,故此 b 又要設為 2 。那樣這條 equation 就 balance 了。 ((通常最後還要寫出 equation 兩邊的各化學物的 state 。)) 因為 equation 左右兩邊的 Tin, Oxygen 和 Hydrogen 數量都相稱了。
如果用 linear algebra 的方法,我們可將以上問題,根據三種原素轉為三條線性方程

Tin: 1a + 0b -1c = 0d
Oxygen: 2a + 0b + 0c = 1d
Hydrogen: 0a + 2b + 0c = 2d

以上可以轉成分別是 3 x 3 的 matrix 和 4x1 的 column vector 。就叫它們為 coefs 和 d 。再 solve 此兩個 matrix 。

# < -
coefs <- matrix(c(1, 0, -1, 2, 0, 0, 0, 2, 0), nrow=3, byrow=TRUE, dimnames=list(c("Sn", "O", "H"), c("a", "b", "c")))
d <- matrix(c(0,1,2),  dimnames=list(c("Sn", "O", "H"), c("d")))
solve(coefs, d)

可得出當 d = 1 , a, b, c 是等於 0.5, 1.0 和 0.5 。將全部數值乘 2 ,就得出 a=1, b=2, c=2, d=2 。
所謂 solve ,其實是等於先找 coefs 的 inverse 再乘以 d 。

# < -
library(MASS)
ginv(coefs) %*% d

結果一樣。


Powered by Jekyll and profdr theme