見出し画像

LISPで連立方程式を解くプログラムを作ってみました

(setq mat (make-array '(3 4) :initial-contents '((3 2 4 17)(-1 4 2 15)(2 -1 -1 -3))))

まず、配列に行列式で設定する。

次に、2段階で逆行列を求めている。
最初に、下半分の三角形部分の添え字を0にしている。
次に、上半分の三角形部分の添え字を0にしている。

(dotimes(i 3)
 (setq a (aref mat i i))
 (dotimes(j 4)
   (setf (aref mat i j) (/ (aref mat i j) a))
   )
 (dotimes(ii (- 2 i))
   (setq bai ( / (aref mat (- 2 ii) i) (aref mat i i)))
   (dotimes(j 4)
     (setf (aref mat (- 2 ii) j) (- (aref mat (- 2 ii) j) (* (aref mat i j) bai)))
     )
   )
 )


(dotimes(i 2)
 (setq  ii (- 1 i))
 (dotimes(k (- 2 i ))
   (setq bai  (aref mat (- 1 k i) (- 2 i )))
   (dotimes(j (+ 2 i))
     (setq xx (- 1 k i))
     (setq yy (- (+ j 2) i))
     (setf (aref mat xx yy ) (- (aref mat xx yy ) ( * (aref mat (- 2 i) yy) bai)))
   (print mat)
     )))

次のが最終的な出力結果

#2A((1 0 0 1) (0 1 0 3) (0 0 1 2))

最終的に出てくる、 1,3,2が解です。
このプログラムは3次元にしか対応していません。
それぞれのプログラムの一番下の行の最後で、[CTRL]+[J]を押してください。
ごめんなさい。私の力不足です。
それと、私はLISPが好きなわけでなく、LISPで科学技術計算のプログラム作る人って、あまりいないだろうなという好奇心から挑戦したものです。
PROLOGで同じようなことが理論上できるのであれば、やってみたいと思うが、さすがに無理かな。
今後の研究課題です。

動作環境:
OS:WINDOWS11Pro
LISP:xyzzy 0.2.2.253

この記事が気に入ったらサポートをしてみませんか?