質問編集履歴

3

コードの編集

2021/12/02 12:04

投稿

hanao_
hanao_

スコア6

test CHANGED
File without changes
test CHANGED
@@ -221,3 +221,43 @@
221
221
  }
222
222
 
223
223
  ```
224
+
225
+
226
+
227
+ ```Java
228
+
229
+ void result1(ArrayList<ArrayList<Double>> matrix) {
230
+
231
+ for(int i=0;i<matrix.size();i++) {
232
+
233
+ for(int j=0;j<matrix.get(0).size();j++) {
234
+
235
+ System.out.print(matrix.get(i).get(j)+" ");
236
+
237
+ }
238
+
239
+ System.out.println("");
240
+
241
+ }
242
+
243
+ }
244
+
245
+ ```
246
+
247
+
248
+
249
+ ```Java
250
+
251
+ void result2(ArrayList<Double> vector) {
252
+
253
+ System.out.println("解は");
254
+
255
+ for(int i=0;i<vector.size();i++) {
256
+
257
+ System.out.println(vector.get(i));
258
+
259
+ }
260
+
261
+ }
262
+
263
+ ```

2

コードの編集

2021/12/02 12:04

投稿

hanao_
hanao_

スコア6

test CHANGED
File without changes
test CHANGED
@@ -1,10 +1,50 @@
1
- Javaで、ガウスの消去法を行うプログラムを書いているのですが、答えが違ってしまいます、、、
1
+ Javaで、ガウスの消去法を行うプログラムを書いているのですが、答えが違ってしまいます、、、どこが間違っているのでしょうか?
2
+
2
-
3
+ ---
4
+
5
+ augMatrix.matrixはArrayList<ArrayList<Double>>型で、拡大係数行列で、
6
+
7
+
8
+
9
+ 2.0 4.0 -2.0 -4.0 -10.0
10
+
11
+ -6.0 -12.0 12.0 24.0 60.0
12
+
13
+ 4.0 2.0 2.0 -4.0 8.0
14
+
15
+ 2.0 -4.0 -2.0 4.0 6.0
16
+
17
+
18
+
19
+ の行列が入っています
20
+
21
+
22
+
23
+ ans.vectorはArrayList<Double>型で、解を格納するものです。
24
+
25
+
26
+
27
+ 今のプログラムでは、解が
28
+
29
+
30
+
31
+ 10.0 -5.0 -5.0 2.5
32
+
33
+
34
+
3
- どこが間違っているのでしょうか?
35
+ となってしまうのですが、正い解は
4
-
5
-
6
-
36
+
37
+
38
+
7
- augMatrix.matrixには拡大係数行列が入っています
39
+ 2.0 -1.0 3.0 1.0
40
+
41
+
42
+
43
+ です。
44
+
45
+
46
+
47
+
8
48
 
9
49
 
10
50
 
@@ -22,19 +62,23 @@
22
62
 
23
63
  ArrayList<ArrayList<Double>> b = new ArrayList<ArrayList<Double>>();
24
64
 
65
+ //行列の行数
66
+
25
67
  int N=augMatrix.matrix.size();
26
68
 
27
- int i,j,k,l,pivot;
69
+ int pivot;
28
70
 
29
71
  double p,q,m;
30
72
 
31
73
 
32
74
 
75
+ //初期化
76
+
33
- for(i=0;i<1;i++) {
77
+ for(int i=0;i<1;i++) {
34
78
 
35
79
  ArrayList<Double> t = new ArrayList<Double>();
36
80
 
37
- for(j=0;j<N+1;j++) {
81
+ for(int j=0;j<N+1;j++) {
38
82
 
39
83
  t.add(j,0.0);
40
84
 
@@ -46,7 +90,9 @@
46
90
 
47
91
 
48
92
 
93
+ //初期化
94
+
49
- for(i=0;i<N;i++) {
95
+ for(int i=0;i<N;i++) {
50
96
 
51
97
  ans.vector.add(0.0);
52
98
 
@@ -54,7 +100,7 @@
54
100
 
55
101
 
56
102
 
57
- for(i=0;i<N;i++){
103
+ for(int i=0;i<N;i++){
58
104
 
59
105
  m=0;
60
106
 
@@ -62,25 +108,29 @@
62
108
 
63
109
 
64
110
 
65
- for(l=i;l<N;l++) {
111
+ for(int l=i;l<N;l++) {
66
-
112
+
67
- if(Math.abs(augMatrix.matrix.get(l).get(i))>m) { //i列の中で一番値が大きい行を選ぶ
113
+ if(Math.abs(augMatrix.matrix.get(l).get(i))>m) {
114
+
115
+ //i列の中で一番値が大きい行を選ぶ
68
116
 
69
117
  m=Math.abs(augMatrix.matrix.get(l).get(i));
70
118
 
71
119
  pivot=l;
72
120
 
121
+ }
122
+
73
123
  }
74
124
 
125
+
126
+
75
- }
127
+ if(pivot!=i) {
76
-
77
-
78
-
128
+
129
+
130
+
79
- if(pivot!=i) { //pivotがiと違えば、行の入れ替え
131
+ //pivotがiと違えば、行の入れ替え
80
-
81
-
82
-
132
+
83
- for(j=0;j<N+1;j++) {
133
+ for(int j=0;j<N+1;j++) {
84
134
 
85
135
 
86
136
 
@@ -90,13 +140,47 @@
90
140
 
91
141
  augMatrix.matrix.get(pivot).set(j,b.get(0).get(j));
92
142
 
93
- //b[0][j]=a[i][j];
94
-
95
- // a[i][j]=a[pivot][j];
96
-
97
- //a[pivot][j]=b[0][j];
98
-
99
- }
143
+ }
144
+
145
+ }
146
+
147
+ }
148
+
149
+
150
+
151
+ for(int k=0;k<N;k++) {
152
+
153
+ //対角要素を保存
154
+
155
+ p=augMatrix.matrix.get(k).get(k);
156
+
157
+ //対角要素は1になることがわかっているから
158
+
159
+ augMatrix.matrix.get(k).set(k,1.0);
160
+
161
+
162
+
163
+ for(int j=k+1;j<N+1;j++) {
164
+
165
+ augMatrix.matrix.get(k).set(j,(augMatrix.matrix.get(k).get(j))/p);
166
+
167
+ }
168
+
169
+
170
+
171
+ for(int i=k+1;i<N;i++) {
172
+
173
+ q=augMatrix.matrix.get(i).get(k);
174
+
175
+ for(int j=k+1;j<N+1;j++) {
176
+
177
+ augMatrix.matrix.get(i).set(j,-q*(augMatrix.matrix.get(k).get(j)));
178
+
179
+ }
180
+
181
+ //0となることがわかっているところ
182
+
183
+ augMatrix.matrix.get(i).set(k,0.0);
100
184
 
101
185
  }
102
186
 
@@ -104,104 +188,36 @@
104
188
 
105
189
 
106
190
 
191
+ //解の計算
192
+
107
- for(k=0;k<N;k++) {
193
+ for(int i=N-1;i>=0;i--) {
108
-
109
-
110
-
194
+
111
- p=augMatrix.matrix.get(k).get(k);
195
+ ans.vector.set(i,(augMatrix.matrix.get(i).get(N)));
112
-
113
- augMatrix.matrix.get(k).set(k,1.0);
196
+
114
-
115
- //p=a[k][k]; //対角要素を保存
116
-
117
- //a[k][k]=1; //対角要素は1になることがわかっているから
118
-
119
-
120
-
121
- for(j=k+1;j<N+1;j++) {
197
+ for(int j=N-1;j>i;j--) {
122
-
198
+
123
- augMatrix.matrix.get(k).set(j,(augMatrix.matrix.get(k).get(j))/p);
199
+ ans.vector.set(i,-1*(augMatrix.matrix.get(i).get(j))*ans.vector.get(j));
124
-
125
- //a[k][j]/=p;
126
200
 
127
201
  }
128
202
 
129
-
130
-
131
- for(i=k+1;i<N;i++) {
132
-
133
- q=augMatrix.matrix.get(i).get(k);
134
-
135
- //q=a[i][k];
136
-
137
- for(j=k+1;j<N+1;j++) {
138
-
139
- augMatrix.matrix.get(i).set(j,-q*(augMatrix.matrix.get(k).get(j)));
140
-
141
- //a[i][j]-=q*a[k][j];
142
-
143
- }
203
+ }
144
-
145
- augMatrix.matrix.get(i).set(k,0.0);
204
+
146
-
147
- //a[i][k]=0; //0となることがわかっているところ
205
+
148
-
149
- }
206
+
150
-
151
- }
152
-
153
-
154
-
155
- /*解の計算*/
156
-
157
- for(i=N-1;i>=0;i--) {
158
-
159
- ans.vector.set(i,(augMatrix.matrix.get(i).get(N)));
160
-
161
- //x[i]=a[i][N];
207
+ //最終的な行列の表示
162
-
163
- for(j=N-1;j>i;j--) {
208
+
164
-
165
-
166
-
167
- ans.vector.set(i,-1*(augMatrix.matrix.get(i).get(j))*ans.vector.get(j));
168
-
169
- //x[i]-=a[i][j]*x[j];
170
-
171
- }
172
-
173
- }
174
-
175
-
176
-
177
- /*行列が最後どうなったかみる*/
178
-
179
-
180
-
181
- for(i=0;i<N;i++) {
182
-
183
- for(j=0;j<N+1;j++) {
184
-
185
- System.out.print(augMatrix.matrix.get(i).get(j) + " ");
186
-
187
- }
188
-
189
- System.out.println("");
190
-
191
- }
192
-
193
- System.out.println("解は");
194
-
195
- for(i=0;i<N;i++) {
196
-
197
- System.out.println(ans.vector.get(i));
209
+ result1(augMatrix.matrix);
198
-
199
- }
200
210
 
201
211
 
202
212
 
213
+ //解の出力
214
+
215
+ result2(ans.vector);
216
+
217
+
218
+
203
219
  return ans;
204
220
 
205
- }
221
+ }
206
222
 
207
223
  ```

1

コードの編集

2021/12/02 12:00

投稿

hanao_
hanao_

スコア6

test CHANGED
File without changes
test CHANGED
@@ -56,57 +56,95 @@
56
56
 
57
57
  for(i=0;i<N;i++){
58
58
 
59
- m=0;
59
+ m=0;
60
-
60
+
61
- pivot=i;
61
+ pivot=i;
62
-
63
-
64
-
62
+
63
+
64
+
65
- for(l=i;l<N;l++)
65
+ for(l=i;l<N;l++) {
66
-
67
- {
66
+
68
-
69
- if(Math.abs(augMatrix.matrix.get(l).get(i))>m) //i列の中で一番値が大きい行を選ぶ
67
+ if(Math.abs(augMatrix.matrix.get(l).get(i))>m) { //i列の中で一番値が大きい行を選ぶ
70
-
71
- {
68
+
72
-
73
- m=Math.abs(augMatrix.matrix.get(l).get(i));
69
+ m=Math.abs(augMatrix.matrix.get(l).get(i));
74
-
70
+
75
- pivot=l;
71
+ pivot=l;
72
+
73
+ }
74
+
75
+ }
76
+
77
+
78
+
79
+ if(pivot!=i) { //pivotがiと違えば、行の入れ替え
80
+
81
+
82
+
83
+ for(j=0;j<N+1;j++) {
84
+
85
+
86
+
87
+ b.get(0).set(j,augMatrix.matrix.get(i).get(j));
88
+
89
+ augMatrix.matrix.get(i).set(j,augMatrix.matrix.get(pivot).get(j));
90
+
91
+ augMatrix.matrix.get(pivot).set(j,b.get(0).get(j));
92
+
93
+ //b[0][j]=a[i][j];
94
+
95
+ // a[i][j]=a[pivot][j];
96
+
97
+ //a[pivot][j]=b[0][j];
76
98
 
77
99
  }
78
100
 
79
101
  }
80
102
 
81
-
82
-
83
- if(pivot!=i) //pivotがiと違えば、行の入れ替え
84
-
85
- {
86
-
87
- for(j=0;j<N+1;j++)
88
-
89
- {
90
-
91
- //b.get(0).remove(j);
92
-
93
- b.get(0).set(j,augMatrix.matrix.get(i).get(j));
94
-
95
- //augMatrix.matrix.get(i).remove(j);
96
-
97
- augMatrix.matrix.get(i).set(j,augMatrix.matrix.get(pivot).get(j));
98
-
99
- //augMatrix.matrix.get(pivot).remove(j);
100
-
101
- augMatrix.matrix.get(pivot).set(j,b.get(0).get(j));
102
-
103
- //b[0][j]=a[i][j];
104
-
105
- // a[i][j]=a[pivot][j];
106
-
107
- //a[pivot][j]=b[0][j];
108
-
109
- }
103
+ }
104
+
105
+
106
+
107
+ for(k=0;k<N;k++) {
108
+
109
+
110
+
111
+ p=augMatrix.matrix.get(k).get(k);
112
+
113
+ augMatrix.matrix.get(k).set(k,1.0);
114
+
115
+ //p=a[k][k]; //対角要素を保存
116
+
117
+ //a[k][k]=1; //対角要素は1になることがわかっているから
118
+
119
+
120
+
121
+ for(j=k+1;j<N+1;j++) {
122
+
123
+ augMatrix.matrix.get(k).set(j,(augMatrix.matrix.get(k).get(j))/p);
124
+
125
+ //a[k][j]/=p;
126
+
127
+ }
128
+
129
+
130
+
131
+ for(i=k+1;i<N;i++) {
132
+
133
+ q=augMatrix.matrix.get(i).get(k);
134
+
135
+ //q=a[i][k];
136
+
137
+ for(j=k+1;j<N+1;j++) {
138
+
139
+ augMatrix.matrix.get(i).set(j,-q*(augMatrix.matrix.get(k).get(j)));
140
+
141
+ //a[i][j]-=q*a[k][j];
142
+
143
+ }
144
+
145
+ augMatrix.matrix.get(i).set(k,0.0);
146
+
147
+ //a[i][k]=0; //0となることがわかっているところ
110
148
 
111
149
  }
112
150
 
@@ -114,93 +152,23 @@
114
152
 
115
153
 
116
154
 
117
- for(k=0;k<N;k++)
118
-
119
- {
120
-
121
- p=augMatrix.matrix.get(k).get(k);
122
-
123
- //augMatrix.matrix.get(k).remove(k);
124
-
125
- augMatrix.matrix.get(k).set(k,1.0);
126
-
127
- //p=a[k][k]; //対角要素を保存
128
-
129
- //a[k][k]=1; //対角要素は1になることがわかっているから
130
-
131
-
132
-
133
- for(j=k+1;j<N+1;j++)
134
-
135
- {
136
-
137
- //augMatrix.matrix.get(k).remove(j);
138
-
139
- augMatrix.matrix.get(k).set(j,(augMatrix.matrix.get(k).get(j))/p);
140
-
141
- //a[k][j]/=p;
142
-
143
- }
144
-
145
-
146
-
147
- for(i=k+1;i<N;i++)
148
-
149
- {
150
-
151
- q=augMatrix.matrix.get(i).get(k);
152
-
153
- //q=a[i][k];
154
-
155
-
156
-
157
- for(j=k+1;j<N+1;j++)
158
-
159
- {
160
-
161
- //augMatrix.matrix.get(i).remove(j);
162
-
163
- augMatrix.matrix.get(i).set(j,-q*(augMatrix.matrix.get(k).get(j)));
164
-
165
- //a[i][j]-=q*a[k][j];
166
-
167
- }
168
-
169
- //augMatrix.matrix.get(i).remove(k);
170
-
171
- augMatrix.matrix.get(i).set(k,0.0);
172
-
173
- //a[i][k]=0; //0となることがわかっているところ
174
-
175
- }
176
-
177
- }
178
-
179
-
180
-
181
155
  /*解の計算*/
182
156
 
183
- for(i=N-1;i>=0;i--)
157
+ for(i=N-1;i>=0;i--) {
184
-
185
- {
186
-
187
- //ans.vector.remove(i);
188
158
 
189
159
  ans.vector.set(i,(augMatrix.matrix.get(i).get(N)));
190
160
 
191
161
  //x[i]=a[i][N];
192
162
 
193
- for(j=N-1;j>i;j--)
163
+ for(j=N-1;j>i;j--) {
194
-
195
- {
164
+
196
-
197
- //ans.vector.remove(i);
165
+
198
-
166
+
199
- ans.vector.set(i,-1*(augMatrix.matrix.get(i).get(j))*ans.vector.get(j));
167
+ ans.vector.set(i,-1*(augMatrix.matrix.get(i).get(j))*ans.vector.get(j));
200
168
 
201
169
  //x[i]-=a[i][j]*x[j];
202
170
 
203
- }
171
+ }
204
172
 
205
173
  }
206
174
 
@@ -210,44 +178,30 @@
210
178
 
211
179
 
212
180
 
213
- for(i=0;i<N;i++) {
181
+ for(i=0;i<N;i++) {
214
-
182
+
215
- for(j=0;j<N+1;j++) {
183
+ for(j=0;j<N+1;j++) {
216
-
184
+
217
- System.out.print(augMatrix.matrix.get(i).get(j) + " ");
185
+ System.out.print(augMatrix.matrix.get(i).get(j) + " ");
218
186
 
219
187
  }
220
188
 
221
189
  System.out.println("");
222
190
 
191
+ }
192
+
193
+ System.out.println("解は");
194
+
195
+ for(i=0;i<N;i++) {
196
+
197
+ System.out.println(ans.vector.get(i));
198
+
199
+ }
200
+
223
201
 
224
202
 
225
- }
226
-
227
-
228
-
229
- System.out.println("解は");
230
-
231
- for(i=0;i<N;i++)
232
-
233
- {
234
-
235
- System.out.println(ans.vector.get(i));
236
-
237
- }
238
-
239
-
240
-
241
-
242
-
243
-
244
-
245
203
  return ans;
246
204
 
247
-
248
-
249
- }
205
+ }
250
-
251
-
252
206
 
253
207
  ```