Javaで、ガウスの消去法を行うプログラムを書いているのですが、答えが違ってしまいます、、、どこが間違っているのでしょうか?
augMatrix.matrixはArrayList<ArrayList<Double>>型で、拡大係数行列で、
2.0 4.0 -2.0 -4.0 -10.0
-6.0 -12.0 12.0 24.0 60.0
4.0 2.0 2.0 -4.0 8.0
2.0 -4.0 -2.0 4.0 6.0
の行列が入っています
ans.vectorはArrayList<Double>型で、解を格納するものです。
今のプログラムでは、解が
10.0 -5.0 -5.0 2.5
となってしまうのですが、正しい解は
2.0 -1.0 3.0 1.0
です。
わかりずらいプログラムだと思いますが、よろしくお願いします。
Java
1Vector solve() { 2 3 Vector ans = new Vector(); 4 ArrayList<ArrayList<Double>> b = new ArrayList<ArrayList<Double>>(); 5 //行列の行数 6 int N=augMatrix.matrix.size(); 7 int pivot; 8 double p,q,m; 9 10 //初期化 11 for(int i=0;i<1;i++) { 12 ArrayList<Double> t = new ArrayList<Double>(); 13 for(int j=0;j<N+1;j++) { 14 t.add(j,0.0); 15 } 16 b.add(t); 17 } 18 19 //初期化 20 for(int i=0;i<N;i++) { 21 ans.vector.add(0.0); 22 } 23 24 for(int i=0;i<N;i++){ 25 m=0; 26 pivot=i; 27 28 for(int l=i;l<N;l++) { 29 if(Math.abs(augMatrix.matrix.get(l).get(i))>m) { 30 //i列の中で一番値が大きい行を選ぶ 31 m=Math.abs(augMatrix.matrix.get(l).get(i)); 32 pivot=l; 33 } 34 } 35 36 if(pivot!=i) { 37 38 //pivotがiと違えば、行の入れ替え 39 for(int j=0;j<N+1;j++) { 40 41 b.get(0).set(j,augMatrix.matrix.get(i).get(j)); 42 augMatrix.matrix.get(i).set(j,augMatrix.matrix.get(pivot).get(j)); 43 augMatrix.matrix.get(pivot).set(j,b.get(0).get(j)); 44 } 45 } 46 } 47 48 for(int k=0;k<N;k++) { 49 //対角要素を保存 50 p=augMatrix.matrix.get(k).get(k); 51 //対角要素は1になることがわかっているから 52 augMatrix.matrix.get(k).set(k,1.0); 53 54 for(int j=k+1;j<N+1;j++) { 55 augMatrix.matrix.get(k).set(j,(augMatrix.matrix.get(k).get(j))/p); 56 } 57 58 for(int i=k+1;i<N;i++) { 59 q=augMatrix.matrix.get(i).get(k); 60 for(int j=k+1;j<N+1;j++) { 61 augMatrix.matrix.get(i).set(j,-q*(augMatrix.matrix.get(k).get(j))); 62 } 63 //0となることがわかっているところ 64 augMatrix.matrix.get(i).set(k,0.0); 65 } 66 } 67 68 //解の計算 69 for(int i=N-1;i>=0;i--) { 70 ans.vector.set(i,(augMatrix.matrix.get(i).get(N))); 71 for(int j=N-1;j>i;j--) { 72 ans.vector.set(i,-1*(augMatrix.matrix.get(i).get(j))*ans.vector.get(j)); 73 } 74 } 75 76 //最終的な行列の表示 77 result1(augMatrix.matrix); 78 79 //解の出力 80 result2(ans.vector); 81 82 return ans; 83 }
Java
1void result1(ArrayList<ArrayList<Double>> matrix) { 2 for(int i=0;i<matrix.size();i++) { 3 for(int j=0;j<matrix.get(0).size();j++) { 4 System.out.print(matrix.get(i).get(j)+" "); 5 } 6 System.out.println(""); 7 } 8}
Java
1void result2(ArrayList<Double> vector) { 2 System.out.println("解は"); 3 for(int i=0;i<vector.size();i++) { 4 System.out.println(vector.get(i)); 5 } 6}
回答3件
あなたの回答
tips
プレビュー