2014-10-11 44 views
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

  • 鍛鍊編碼
  • 看它是否是更好的性能
  • 試圖理解的代碼在幾周後:)

請幫我寫下來,或指出一個更好的方法。

+1

'addons/math/misc/linear.ijs'中有一個Gauss Jordan消除。你可以看看那裏的想法。 – Eelvex 2014-10-11 21:22:11

+0

擺脫'for'的一種方式是用輔助動詞使用'power ^:',但在這種情況下對我來說似乎是人爲的。 – Eelvex 2014-10-11 21:23:18

+0

@Evevex謝謝。我已經完成了基於'linear.ijs'的任務。 – 2014-10-12 14:30:00

回答

3

感謝Eelvex,誰勸我addons/math/misc/linear.ijs看,我已經結束了與這個漂亮的代碼的任務:

gj=: monad :0 
    I=. i.#y 
    for_i. I do. y=. y - (col - i=I) */ (i{y) % i{col=. i{"1 y end. 
    ) 
    gj Ab 
1 0 0 0 _1 
0 1 0 0 3 
0 0 1 0 _2 
0 0 0 1 2 

它已經採取了一些時間來了解動詞pivotlinear.ijs - 但pencil-紙張法有幫助。