teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

コードの編集

2021/12/02 12:04

投稿

hanao_
hanao_

スコア6

title CHANGED
File without changes
body CHANGED
@@ -109,4 +109,24 @@
109
109
 
110
110
  return ans;
111
111
  }
112
+ ```
113
+
114
+ ```Java
115
+ void result1(ArrayList<ArrayList<Double>> matrix) {
116
+ for(int i=0;i<matrix.size();i++) {
117
+ for(int j=0;j<matrix.get(0).size();j++) {
118
+ System.out.print(matrix.get(i).get(j)+" ");
119
+ }
120
+ System.out.println("");
121
+ }
122
+ }
123
+ ```
124
+
125
+ ```Java
126
+ void result2(ArrayList<Double> vector) {
127
+ System.out.println("解は");
128
+ for(int i=0;i<vector.size();i++) {
129
+ System.out.println(vector.get(i));
130
+ }
131
+ }
112
132
  ```

2

コードの編集

2021/12/02 12:04

投稿

hanao_
hanao_

スコア6

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

1

コードの編集

2021/12/02 12:00

投稿

hanao_
hanao_

スコア6

title CHANGED
File without changes
body CHANGED
@@ -27,28 +27,23 @@
27
27
  }
28
28
 
29
29
  for(i=0;i<N;i++){
30
- m=0;
30
+ m=0;
31
- pivot=i;
31
+ pivot=i;
32
32
 
33
- for(l=i;l<N;l++)
33
+ for(l=i;l<N;l++) {
34
- {
35
- if(Math.abs(augMatrix.matrix.get(l).get(i))>m) //i列の中で一番値が大きい行を選ぶ
34
+ if(Math.abs(augMatrix.matrix.get(l).get(i))>m) { //i列の中で一番値が大きい行を選ぶ
36
- {
37
- m=Math.abs(augMatrix.matrix.get(l).get(i));
35
+ m=Math.abs(augMatrix.matrix.get(l).get(i));
38
- pivot=l;
36
+ pivot=l;
39
- }
37
+ }
40
- }
38
+ }
41
39
 
42
- if(pivot!=i) //pivotがiと違えば、行の入れ替え
40
+ if(pivot!=i) { //pivotがiと違えば、行の入れ替え
43
- {
41
+
44
- for(j=0;j<N+1;j++)
42
+ for(j=0;j<N+1;j++) {
45
- {
43
+
46
- //b.get(0).remove(j);
47
- b.get(0).set(j,augMatrix.matrix.get(i).get(j));
44
+ b.get(0).set(j,augMatrix.matrix.get(i).get(j));
48
- //augMatrix.matrix.get(i).remove(j);
49
- augMatrix.matrix.get(i).set(j,augMatrix.matrix.get(pivot).get(j));
45
+ augMatrix.matrix.get(i).set(j,augMatrix.matrix.get(pivot).get(j));
50
- //augMatrix.matrix.get(pivot).remove(j);
51
- augMatrix.matrix.get(pivot).set(j,b.get(0).get(j));
46
+ augMatrix.matrix.get(pivot).set(j,b.get(0).get(j));
52
47
  //b[0][j]=a[i][j];
53
48
  // a[i][j]=a[pivot][j];
54
49
  //a[pivot][j]=b[0][j];
@@ -56,72 +51,54 @@
56
51
  }
57
52
  }
58
53
 
59
- for(k=0;k<N;k++)
54
+ for(k=0;k<N;k++) {
60
- {
55
+
61
56
  p=augMatrix.matrix.get(k).get(k);
62
- //augMatrix.matrix.get(k).remove(k);
63
57
  augMatrix.matrix.get(k).set(k,1.0);
64
58
  //p=a[k][k]; //対角要素を保存
65
59
  //a[k][k]=1; //対角要素は1になることがわかっているから
66
-
60
+
67
- for(j=k+1;j<N+1;j++)
61
+ for(j=k+1;j<N+1;j++) {
68
- {
69
- //augMatrix.matrix.get(k).remove(j);
70
- augMatrix.matrix.get(k).set(j,(augMatrix.matrix.get(k).get(j))/p);
62
+ augMatrix.matrix.get(k).set(j,(augMatrix.matrix.get(k).get(j))/p);
71
63
  //a[k][j]/=p;
72
- }
64
+ }
73
65
 
74
- for(i=k+1;i<N;i++)
66
+ for(i=k+1;i<N;i++) {
75
- {
76
- q=augMatrix.matrix.get(i).get(k);
67
+ q=augMatrix.matrix.get(i).get(k);
77
68
  //q=a[i][k];
78
-
79
- for(j=k+1;j<N+1;j++)
69
+ for(j=k+1;j<N+1;j++) {
80
- {
81
- //augMatrix.matrix.get(i).remove(j);
82
- augMatrix.matrix.get(i).set(j,-q*(augMatrix.matrix.get(k).get(j)));
70
+ augMatrix.matrix.get(i).set(j,-q*(augMatrix.matrix.get(k).get(j)));
83
71
  //a[i][j]-=q*a[k][j];
84
- }
72
+ }
85
- //augMatrix.matrix.get(i).remove(k);
86
- augMatrix.matrix.get(i).set(k,0.0);
73
+ augMatrix.matrix.get(i).set(k,0.0);
87
74
  //a[i][k]=0; //0となることがわかっているところ
88
75
  }
89
76
  }
90
77
 
91
78
  /*解の計算*/
92
- for(i=N-1;i>=0;i--)
79
+ for(i=N-1;i>=0;i--) {
93
- {
94
- //ans.vector.remove(i);
95
80
  ans.vector.set(i,(augMatrix.matrix.get(i).get(N)));
96
81
  //x[i]=a[i][N];
97
- for(j=N-1;j>i;j--)
82
+ for(j=N-1;j>i;j--) {
98
- {
83
+
99
- //ans.vector.remove(i);
100
- ans.vector.set(i,-1*(augMatrix.matrix.get(i).get(j))*ans.vector.get(j));
84
+ ans.vector.set(i,-1*(augMatrix.matrix.get(i).get(j))*ans.vector.get(j));
101
85
  //x[i]-=a[i][j]*x[j];
102
- }
86
+ }
103
87
  }
104
88
 
105
89
  /*行列が最後どうなったかみる*/
106
90
 
107
- for(i=0;i<N;i++) {
91
+ for(i=0;i<N;i++) {
108
- for(j=0;j<N+1;j++) {
92
+ for(j=0;j<N+1;j++) {
109
- System.out.print(augMatrix.matrix.get(i).get(j) + " ");
93
+ System.out.print(augMatrix.matrix.get(i).get(j) + " ");
110
94
  }
111
95
  System.out.println("");
112
-
113
96
  }
114
-
115
97
  System.out.println("解は");
116
- for(i=0;i<N;i++)
98
+ for(i=0;i<N;i++) {
117
- {
118
99
  System.out.println(ans.vector.get(i));
119
100
  }
120
-
121
-
122
-
101
+
123
102
  return ans;
124
-
125
- }
103
+ }
126
-
127
104
  ```