ごとにキーボードから入力し,その行列・ベクトルを使って,連立1 次方程式A⃗x = ⃗b を
部分ピボット選択付きガウスの消去法を用いて解け.
その計算課程も表示せよ.
表示は以下のようにせよ.
N=3 【Enter】
A[0][0] = 1 【Enter】
A[0][1] = 1 【Enter】
A[0][2] = 2 【Enter】
A[1][0] = 3 【Enter】
A[1][1] = 2 【Enter】
A[1][2] = -1 【Enter】
A[2][0] = 2 【Enter】
A[2][1] = -1 【Enter】
A[2][2] = 1 【Enter】
b[0] = 4 【Enter】
b[1] = -1 【Enter】
b[2] = 5 【Enter】
A, b =
1.0 1.0 2.0 | 4.0
3.0 2.0 -1.0 | -1.0
2.0 -1.0 1.0 | 5.0
column 0: row 1 is max
A, b =
3.0 2.0 -1.0 | -1.0
0.0 0.3 2.3 | 4.3
0.0 -2.3 1.7 | 5.7
column 1: row 2 is max
A, b =
3.0 2.0 -1.0 | -1.0
0.0 -2.3 1.7 | 5.7
0.0 -0.0 2.6 | 5.1
A, b =
3.0 2.0 -1.0 | -1.0
0.0 -2.3 1.7 | 5.7
0.0 -0.0 2.6 | 2.0
A, b =
3.0 2.0 -1.0 | -1.0
0.0 -2.3 1.7 | -1.0
0.0 -0.0 2.6 | 2.0
A, b =
3.0 2.0 -1.0 | 1.0
0.0 -2.3 1.7 | -1.0
0.0 -0.0 2.6 | 2.0
# include <stdio.h>
# include <stdlib.h>
# include <math.h>
void PrintAb(double *A, double *b, int n){
int i, j;
printf("\nA, b =\n ");
for(i=0; i<n; i++){
for(j=0; j<n; j++){
printf("%.2f\t", A[j]);
}
printf("| %.2f\t\n", b[i]);
A +=n;
printf(" ");
}
printf("\n");
return;
}
void swap(double *x, double *y){
double z = *x;
*x=*y;
*y=z;
}
int main(void){
int N, k, i, j, m;
double *A, *ai, *ak, *b, r;
/*N入力*/
printf("N = ");
scanf("%d", &N);
printf("\n");
/*A入力*/
A=(double*)malloc(N*N*sizeof(double));
if(A==NULL){
printf("Can't allocate memory. \n");
exit(1);
}
ai=A;
for(i=0; i<N; i++){
for(j=0; j<N; j++){
printf("A[%d][%d] = ", i, j);
scanf("%lf", ai+j);
printf("\n");
}
ai +=N;
}
ai=A;
/*b入力*/
b=(double*)malloc(N*sizeof(double));
if(b==NULL){
printf("Can't allocate memory. \n");
exit(1);
}
for(i=0; i<N; i++){
printf("b[%d] = ",i);
scanf("%lf",b+i);
printf("\n");
}
/*表示1*/
printf("\n\n");
PrintAb(A, b, N);
/*ak定義*/
ak=A;
/*前進消去*/
for (k=0; k<N-1; k++) { /* k=0,...,N-2 */
/* 絶対最大要素の検索 */
ak+=N*k;
m=k; /*A[k][k]が最大と仮定*/
for (i=k; i<N; i++){ /* i=k,...,N-1 */
ai+=N*i;
if( fabs(ak[k]) < fabs(ai[k]) ){
m=i;
}
ai=A;
}
printf("column %d: row %d is max\n", k, m);
/* m≠kのとき入れ替え */
if(m!=k){
ai+=N*m;
swap(&ak[k], &ai[k]);
swap(&b[k], &b[m]);
}
ai=A;
ak=A;
/*第k列消去*/
for (i=k+1; i<N; i++) { /* i=k+1,...,N-1 */
ai+=N*i;
ak+=N*k;
r = *(ai+k)/ *(ak+k);
for (j=k; j<N; j++) { /* j=k,...,N-1 */
*(ai+j) -= *(ak+j) * r;
}
b[i] -= b[k] * r;
ai=A;
ak=A;
}
PrintAb(A, b, N);
}
/*後退代入*/
ai=A+(N * (N-1));
for (i=N-1; i>=0; i--) { /* i=N-1,...,0 */
for (j=i+1; j<N; j++) { /* j=i+1,...,N-1 */
b[i]-=*(ai+j) * b[j];
}
b[i]=b[i]/ *(ai+i);
PrintAb(A, b, N);
ai-=N;
}
/*メモリ解放*/
free(A);
free(b);
return 0;
}
N = 3
A[0][0] = 1
A[0][1] = 1
A[0][2] = 2
A[1][0] = 3
A[1][1] = 2
A[1][2] = -1
A[2][0] = 2
A[2][1] = -1
A[2][2] = 1
b[0] = 4
b[1] = -1
b[2] = 5
A, b =
1.00 1.00 2.00 | 4.00
3.00 2.00 1.00 | -1.00
2.00 -1.00 1.00 | 5.00
column 0: row 2 is max
A, b =
2.00 1.00 2.00 | 5.00
0.00 0.50 -4.00 | -8.50
0.00 -1.50 0.00 | 1.50
column 1: row 2 is max
A, b =
2.00 1.00 2.00 | 5.00
0.00 -1.50 -4.00 | 1.50
0.00 0.00 -1.33 | -8.00
A, b =
2.00 1.00 2.00 | 5.00
0.00 -1.50 -4.00 | 1.50
0.00 0.00 -1.33 | 6.00
A, b =
2.00 1.00 2.00 | 5.00
0.00 -1.50 -4.00 | -17.00
0.00 0.00 -1.33 | 6.00
A, b =
2.00 1.00 2.00 | 5.00
0.00 -1.50 -4.00 | -17.00
0.00 0.00 -1.33 | 6.00
どこを正せばいいでしょうか。ご教示ください。宜しくお願いします。