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
この記事が気に入ったらサポートをしてみませんか?