Julia ガウスの消去法

なんとなく手探りで作成。


```Julia
function fn_gaussianElimination(dm)
    # ax+by+cz = d の連立方程式を解く　項数はいくつでも可能
    # ただし０チェックや同じ値などによるチェックをしていないので解ナシの場合いろいろなエラーがでる可能性あり
    # (a1)x+(b1)y+(c1)z=d1・・・のような連立１次方程式を
    # dm=[a1 b1 c1 d1 ; a2 b2 c2 d2 ; a3 b3 c3 d3]のように係数として入力する
    #戻り値 [x y z]の値
    
    
    dmSize_tup = size(dm)
    #次元サイズチェック
    if dmSize_tup[1] != dmSize_tup[2]-1
        throw(DomainError(dm, "サイズが正しくありません"))
        return
    end
     
    #---前進消去--- エラーチェックしていないがよいのか？？
    for rowParent_num in 1:dmSize_tup[1]-1 
     #  rowParent_num ベースとなる行（分母となる方）番号
        dmChild =[]
        for rowChild_num in rowParent_num+1:dmSize_tup[1]
            #  rowChild_num 分子となる　行番号
            dm_x = dm[rowChild_num,:]-dm[rowParent_num,:] .* dm[rowChild_num,rowParent_num]/dm[rowParent_num,rowParent_num] 
            if size(dmChild)[1] == 0
                dmChild = dm_x' 
            else
                dmChild = vcat(dmChild,dm_x') #行列と行ベクトルの結合
            end
        end
        #dmを更新する  
        dm = vcat(dm[1:rowParent_num,:],dmChild)
    end
    # この時点で消去後の行列がdmに格納

    #---後退代入---
   answerValue_ary = zeros(1,dmSize_tup[2]-1) #ここに変数の正解値を入れる
    for checkRow_num in dmSize_tup[1]:-1:1
        checkColumn_num = checkRow_num #現在解いている変数の位置
        totalVariablesValues_num = 0
        for checkColumnAnswer_num in size(answerValue_ary)[2]:-1:checkColumn_num+1
            # checkColumnAnswer_num すでに解き終わった変数の値の位置
            # 変数合計値　+= 　係数　* 　変数値
            totalVariablesValues_num += dm[checkRow_num,checkColumnAnswer_num]*answerValue_ary[checkColumnAnswer_num]
        end
        #今解いている変数の値　= (数値項＋変数合計値)÷変数の係数
        variableValue_num = (dm[checkRow_num,dmSize_tup[2]]-totalVariablesValues_num)/dm[checkRow_num,checkColumn_num]
        answerValue_ary[checkColumn_num] = variableValue_num
    end
    return answerValue_ary
end
```

#### 確認
```julia
dm1 = [2 1 1 15; 4 6 3 41; 8 8 9 83]
println(fn_gaussianElimination(dm1))　# [5.0 2.0 3.0]
```

```julia
dm2=[2 3 7; 4 -5 3] 
println(fn_gaussianElimination(dm2))  #[2.0 1.0]
```

```julia
dm3=[2 3 1 7; 4 -5 -1 3; 6 -7 1 5] 
println(fn_gaussianElimination(dm3))  #[2.0 1.0]
```

#### 確認　解無しなど
```julia
dm4=[2 1 1 15; 4 6 3 41; 2 9 3 37] #解なしの場合
println(fn_gaussianElimination(dm4)) #[NaN NaN NaN]
```

```julia
dm5=[2 3 7;4 6 14] #解が無数にある場合　
println(fn_gaussianElimination(dm5)) #[NaN NaN]
```


```julia
dm6=[1 3 -2 2;2 5 1 4;3 8 -1 0] #こちらも解無し
println(fn_gaussianElimination(dm6))　#[NaN -Inf -Inf]
```

これだけで済むならばコンパクトかもですが。。

方程式と正解は以下を参考にしました。
- [キーポイント線形代数 P2](https://amzn.to/3oEFKWE)
- https://www.geisya.or.jp/~mwm48961/electro/simul_eq_total.htm

## 参考図書
[１から始めるプログラミング](https://amzn.to/3HHR7Yv)
<a href="https://www.amazon.co.jp/1%E3%81%8B%E3%82%89%E5%A7%8B%E3%82%81%E3%82%8B-Julia%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E9%80%B2%E8%97%A4-%E8%A3%95%E4%B9%8B/dp/433902905X?crid=2JGVUDQSK5GJQ&keywords=julia+%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E&qid=1671346628&sprefix=julia+%2Caps%2C224&sr=8-1&linkCode=li3&tag=buzz06-22&linkId=8f7deba521f52f812d35ecdbe756cc10&language=ja_JP&ref_=as_li_ss_il" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=433902905X&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=buzz06-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=buzz06-22&language=ja_JP&l=li3&o=9&a=433902905X" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

[Juliaプログラミングクックブック](https://amzn.to/3PFfb0a)
<a href="https://www.amazon.co.jp/Julia%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%AF%E3%83%83%E3%82%AF%E3%83%96%E3%83%83%E3%82%AF-%E2%80%95%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%80%81%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%80%81%E6%95%B0%E5%80%A4%E8%A8%88%E7%AE%97%E3%81%BE%E3%81%A7-Bogumi%C5%82-Kami%C5%84ski/dp/4873118891?crid=2JGVUDQSK5GJQ&keywords=julia+%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E&qid=1671346628&sprefix=julia+%2Caps%2C224&sr=8-2&linkCode=li3&tag=buzz06-22&linkId=4e34b4b620932164412ec18acff914a8&language=ja_JP&ref_=as_li_ss_il" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4873118891&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=buzz06-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=buzz06-22&language=ja_JP&l=li3&o=9&a=4873118891" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

[天才プログラマー タンメイが教える Julia超入門](https://amzn.to/3FJRpeW)
<a href="https://www.amazon.co.jp/%E5%A4%A9%E6%89%8D%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC-%E3%82%BF%E3%83%B3%E3%83%A1%E3%82%A4%E3%81%8C%E6%95%99%E3%81%88%E3%82%8B-Julia%E8%B6%85%E5%85%A5%E9%96%80-Tanmay-Bakshi/dp/4807920219?crid=2JGVUDQSK5GJQ&keywords=julia+%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E&qid=1671346628&sprefix=julia+%2Caps%2C224&sr=8-10&linkCode=li3&tag=buzz06-22&linkId=bf79aa67b5c5956c8fd26f9436401dc6&language=ja_JP&ref_=as_li_ss_il" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4807920219&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=buzz06-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=buzz06-22&language=ja_JP&l=li3&o=9&a=4807920219" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />