3

对求解线性代数方程组的 Gauss-Jordan 方法进行编码的任务是我在学习 J 时选择的一项练习。系统是Ax=b,其中An × n矩阵,b和未知xn -向量。首先,我从最简单的控制结构形式开始:

   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

好的,现在我可以尝试将for_r.-loop 翻译成默认形式......但它似乎看起来会更麻烦,我认为我走错路了——但是没有错误的学习是什么?我真的很想将 Gauss-Jordan 方法默认编码为:

  • J编码练习
  • 看看性能是否更好
  • 几周后尝试理解代码:)

请帮我把它写到最后或指出更好的方法。

4

1 回答 1

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

于 2014-10-12T14:26:47.963 回答