a(0,0) * x(0) + a(0,1) * x(1) + a(0,2) * x(2) + ,,, a(0,n-1) * x(n-1) + a(0,n) = 0 |
a(1,0) * x(0) + a(1,1) * x(1) + a(1,2) * x(2) + ,,, a(1,n-1) * x(n-1) + a(1,n) = 0 |
a(2,0) * x(0) + a(2,1) * x(1) + a(2,2) * x(2) + ,,, a(2,n-1) * x(n-1) + a(2,n) = 0 |
,,, |
a(n-1,0)*x(0) + a(n-1,1)*x(1) + a(n-1,2)*x(2) + ,,, a(n-1,n-1)*x(n-1) + a(n-1,n) = 0 |
未知数の個数はn個。 |
a(i,j)が係数、x(i)が解(i=0~n-1, j=0~n) |
(1)CSV形式のn元連立一次方程式の係数項目ファイルを読み込んで多倍長演算で解を求めます。 |
(2)計算精度は京^-mで(m=1~1024)の範囲で指定できます。(京=10000000000000000=10^16) |
凡例)m=2の時は0.00000000000000000000000000000001(小数点以下32桁)の精度で演算します。 |
(3)1計算項目当たりの項目サイズは6クワード以上。(1クワード=8バイト) |
計算精度に比例して1計算項目当たりの項目サイズは大きくなる。 |
補足)項目サイズ設定値の目安はm<6未満のときは8、m≧6のときはm+2 |
(4)計算可能な未知数の個数は、項目サイズ=8、計算精度=4の条件では |
計算項目の確保サイズ(65536*4095)/項目サイズ(8)→確保できる項目数(33546240) |
n * (n+1) < 33546240 を満たす最大のn → 5791 |
計算時間の制限がなければ最大5791元連立一次方程式の解を求めることができます。 |
補足)5791元の場合の所要時間は35時間程度と予想されます |
(5)解の算出~検算の所要時間(項目サイズ=8、計算精度=4 Intel(R) Core(TM) i5-8500での実測値) |
n 所要時間 |
100 1秒360 |
200 10秒102 |
300 37秒232 |
400 1分21秒882 |
500 2分40秒094 |
600 4分42秒411 |
1000 21分54秒038 |
2000 171分20秒511 |
2000超 未実施 |
補足)所要時間はnが2倍になると2^3倍、計算精度を2倍にすると2倍になります。 |
次の何れかをダウンロードしてreadme.txtを参照の上利用してください。 |
連次朗v00.zip 連次朗データv00.zip←どちらかをクリック(違いはサンプルデータです) |
(102kb) (32,365kb) |
zipの解凍結果 zipの解凍結果 内容 |
linear.exe linear.exe プログラム本体 |
ren4ng.csv ren4ng.csv サンプルデータ(未知数4個で一意解がないケース) |
ren4.csv ren4.csv サンプルデータ(未知数4個) |
ren100.csv ren100.csv サンプルデータ(未知数100個) |
ren200.csv サンプルデータ(未知数200個) |
ren300.csv サンプルデータ(未知数300個) |
ren400.csv サンプルデータ(未知数400個) |
ren500.csv サンプルデータ(未知数500個) |
ren600.csv サンプルデータ(未知数600個) |
ren1000.csv サンプルデータ(未知数1000個) |
ren2000.csv サンプルデータ(未知数2000個) |
go.bat go2.bat サンプルデータ実行用バッチファイル |
readme.txt readme.txt インストール、使い方解説 |
連次朗.txt 連次朗.txt 利用説明書 |
係数項目a(i,j)をCSV形式で作成したテキストファイルを読み込んでガウスの消去法で解きます |
|
step1.係数ファイルを 配列a(0~n-1 ,0~n)へ読込 |
a(0,0) a(0,1) a(0,2) ,,, a(0,n-1) a(0,n) |
a(1,0) a(1,1) a(1,2) ,,, a(1,n-1) a(1,n) |
a(2,0) a(2,1) a(2,2) ,,, a(2,n-1) a(2,n) |
,,, |
a(n-1,0) a(n-1,1) a(n-1,2) ,,, a(n-1,n-1) a(n-1,n) |
|
step2.前進消去(部分ピボット選択を採用します) |
(1) (2) を i = 0,1,,,n-2 の順に実行 |
(1)ピボット選択 |
a(i,i)~a(n-1,i)から絶対値が最大となるa(x,i)を求める |
a(x,i)=0の時は一意解がない→処理終了 |
x≠i の時はi行とx行を総入替する |
(2)a(i,i)の行下部の削除および列右側の係数再計算 |
①~③をj = i+1,i+2,,,n-1の順に実行 |
①α←a(j,i) |
②a(j,i)←0 |
③列右側の係数再計算(y = i+1,i+2,,,n の順に実行) |
a(j,y) ← a(j,y) - (α * a(i,y)) / a(i,i) |
|
step3.後退代入 |
(1) (2) を i = n-1,n-2,,,0 の順に実行 |
(1) a(i,n) に a(i,j) * x(j) を加える[ただし、j=n-1,n-2,,,i+1] |
(2) x(i) ← -1 * a(i,n) / a(i,i) |
(3) 解(x(i))をCSV形式でファイル出力 |
|
step4.検算 |
(1) 係数項目の再読み込み |
(2) 解を代入して式の計算(i=0,1,,,n-1の順に実行) |
a(i,0) * x(0) + a(i,1) * x(1) + a(i,2) * x(2) + ,,, a(i,n-1) * x(n-1) + a(i,n) |