3
解決代數方程線性系統的高斯 - 喬丹方法的任務是我選擇在學習J中推進的練習。系統是Ax = b,其中A是ñ -by- ñ矩陣,b和未知X是ñ - 載體。首先,我從最簡單的控制結構開始:J:高斯 - 喬丹消除
gj0 =: dyad :0 NB. usage is same to %.
y=.y,.b
for_d.i.#y do.
for_r.i.#y do.
if.r=d do.continue.end. NB. do not eliminate d'th row
t=.%/ (<"1(r,d),:(d,d)) { y
for_c.d}.>:i.#y do.
y=.(((<r,c){y)-(t*(<d,c){y)) (<r,c)} y
end.
y=.0 (<r,d)} y NB. ensure zero
end.
end. NB. now A is diagonal but not identity matrix, so:
x=.{:"1 y NB. x = b
for_r.i.#y do.
x=.((r{x)%(<r,r){y) r} x NB. divide by coefficients on diagonal
end.
)
Ab =: (".;._2) 0 :0
0.25 _0.16 _0.38 0.17
0.19 _0.22 _0.02 0.41
0.13 0.08 _0.08 _0.13
0.13 _0.1 _0.32 0.65
)
b =: 0.37 0.01 0.01 1.51
(,.".&.>)('A';'b';'gj0 A,.b';'b %. A')
┌────────┬──────────────────────┐
│A │0.25 _0.16 _0.38 0.17│
│ │0.19 _0.22 _0.02 0.41│
│ │0.13 0.08 _0.08 _0.13│
│ │0.13 _0.1 _0.32 0.65│
├────────┼──────────────────────┤
│b │0.37 0.01 0.01 1.51 │
├────────┼──────────────────────┤
│b gj0 A │_1 3 _2 2 │
├────────┼──────────────────────┤
│b %. A │_1 3 _2 2 │
└────────┴──────────────────────┘
正確!接下來,我已經決定要擺脫儘可能多的控制結構儘可能:
gj1 =:dyad :0
y=.y,.b
for_d.i.#y do.
for_r.d ({.,]}.~[:>:[) i.#y do. NB. for indices without d
t=.%/ (<"1(r,d),:(d,d)) { y
y=.((r{y)-(t*d{y)) r}y NB. no need to iterate for each column
y=.0 (<r,d)} y
end.
end.
({:"1 y)%(+/}:"1 y) NB. b divide by sum of each item of A (drop zeroes)
)
b gj1 A
_1 3 _2 2
OK,現在我可以試着翻譯for_r.
-loop成默契的形式...但現在看來似乎會顯得比較繁瑣和我認爲我的方式是錯誤的 - 但是沒有錯誤的學習是什麼?我真想默認編碼高斯 - 喬丹法:以J
- 鍛鍊編碼
- 看它是否是更好的性能
- 試圖理解的代碼在幾周後:)
請幫我寫下來,或指出一個更好的方法。
'addons/math/misc/linear.ijs'中有一個Gauss Jordan消除。你可以看看那裏的想法。 – Eelvex 2014-10-11 21:22:11
擺脫'for'的一種方式是用輔助動詞使用'power ^:',但在這種情況下對我來說似乎是人爲的。 – Eelvex 2014-10-11 21:23:18
@Evevex謝謝。我已經完成了基於'linear.ijs'的任務。 – 2014-10-12 14:30:00