連立一次方程式


クラメールの公式により、J言語を用いて連立一次方程式を解く。

   NB. 3x + 2y = 4
   NB. 5x + 7y = 3
   ]a=:2 2$3 2 5 7
3 2
5 7
   ]b=:4 3
4 3
   -/ . * a   NB.aの行列式determinantを求める
11
   ]x=: ( (-/ . *) b ,. 1{"1 a) % 11
2
   ]y=: ( (-/ . *) (0{"1 a) ,. b) % 11
_1
   NB. 以下検証
   X=: 2 _1
   a (+/ . *) X   NB.行列の積 
4 3
   b = a (+/ . *) X   NB.bと一致
1 1

未知数が3つ以上でもOkです。

   NB. x + y + z = 6
   NB. 2x + 3y + 4z = 20
   NB. 3x + 2y + 3z = 16
   ] a1 =: 1 1 1
1 1 1
   ] a2 =: 2 3 4
2 3 4
   ] a3 =: 3 2 3
3 2 3
   ] a  =: 3 3 $ a1, a2, a3
1 1 1
2 3 4
3 2 3
   ] b =: 6 20 16
6 20 16
   ] det=: -/ . *
] -/ .*
   ] deta =: det a 
2
   ] x=: ( det ( b ,. (1{"1 a) ,. (2{"1 a) ) ) % deta
1
   ] y=: ( det ( (0{"1 a) ,. b ,. (2{"1 a) ) ) % deta
2
   ] z=: ( det ( (0{"1 a) ,. (1{"1 a) ,. b ) ) % deta
3
   NB. 以下検証
   X=: 1 2 3
   a (+/ . *) X
6 20 16
   b = a (+/ . *) X
1 1 1

逆行列%.(パーセントドット、逆行列)を使った場合は以下のようになります。

   NB.2x+y-z=0
   NB.3x+y+z=4
   NB.-x+2y+3z=-5   
   ]a=:3 3$2 1 _1 3 1 1 _1 2 3
 2 1 _1
 3 1  1
_1 2  3
   ]b=:0 4 _5
0 4 _5
   ]x=:b %. a  NB.二項動詞として%.を使うとb %. aがb (+/ . *) %.aと同等の意味になる
2 _3 1
   a (+/ . *) x
0 4 _5
   NB.x + y + z = 6
   NB.2x+3y+4z=20
   NB.3x+2y+3z=16
   ]a=:3 3$1 1 1 2 3 4 3 2 3
1 1 1
2 3 4
3 2 3
   ]b=:6 20 16
6 20 16
   ]x=:b %. a
1 2 3