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

回答編集履歴

1

修正箇所の追加

2020/09/01 19:57

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -4,4 +4,46 @@
4
4
 
5
5
  これって、明らかに変ですよね。b[k] と b[m] を交換するなら、
6
6
 
7
- `double t = b[k]; b[k] = b[m]; b[m] = t;`
7
+ `double t = b[k]; b[k] = b[m]; b[m] = t;`
8
+
9
+ **追記**
10
+ ```C
11
+ /* 前進消去(ピボット選択)*/
12
+ for(k = 0; k < N-1; k++){ /* 第kステップ */
13
+ m = k;
14
+ mmax = fabs(*(ak+k));
15
+ ai = ak; // ★
16
+ for(i = k+1; i < N; i++){ /* ピボット選択 */
17
+ ai += N; // ★
18
+ if(fabs(*(ai+k)) > mmax){ // ★
19
+ m = i;
20
+ mmax = fabs(*(ai+k)); // ★
21
+ }
22
+ }
23
+ printf("column %d: row %d is max\n", k, m);
24
+ if(m != k){ /* 第k行と第m行を交換 */
25
+ double *am = A + m*N; // ★
26
+ for(i = k; i < N; i++){/* 係数行列 */
27
+ temp = *(ak+i);
28
+ *(ak+i) = *(am+i); // ★
29
+ *(am+i) = temp; // ★
30
+ }
31
+ /* 既知ベクトル */
32
+ temp = b[k];
33
+ b[k] = b[m];
34
+ b[m] = temp;
35
+ }
36
+ /* 第k列消去 */
37
+ ai = ak; // ★
38
+ for (i = k + 1; i < N; i++){
39
+ ai += N; // ★
40
+ r = *(ai+k) / *(ak+k); // ★
41
+ for (j = k; j < N; j++){
42
+ *(ai+j) -= *(ak+j) * r; // ★
43
+ }
44
+ b[i] -= b[k] * r;
45
+ }
46
+ PrintAb(A, b, N);
47
+ ak+=N;
48
+ }
49
+ ```