正しい結果が表示されない
以下のプログラムはガウスの消去法を使って
解を求めるプログラムです。
しかし、gauss関数にprintf関数を入れてコンパイルすると
正しい結果
5
3
1
0
0
がでますが、gauss関数にprintf関数をいれずmain関数に書くと
0
0
0
0
0
となります。 なぜでしょうjか??
#include<stdio.h>
#include<math.h>
#define N 5
void gauss(double a[N][N+1]);
int main(){
double a[N][N+1] = { { 1,-1,-1,-1,-1, 1},
{-1, 1,-1,-1,-1,-3},
{-1,-1, 1,-1,-1,-7},
{-1,-1,-1, 1,-1,-9},
{-1,-1,-1,-1, 1,-9}
};
double x[N];
int i;
gauss(a);
printf("\n[x]=\n"); /* x[i] を表示する */
for(i=0; i<N; i++){
printf(" %8.3lf\n", x[i]);
}
return(0);
}
void gauss(double a[N][N+1])
{
int i,j,k,p;
double m, pmax, s, x[N];
for(k = 0; k < N-1; k++){ /* ピボット操作 */
p = k; /* p, pmax の初期値 */
pmax = fabs(a[k][k]);
for(i = k+1; i < N; i++){ /* 最大値を検索 */
if(fabs(a[i][k]) > pmax){
p = i;
pmax = fabs(a[i][k]);
}
}
if(fabs(pmax) < 1.0e-12){ /* 最大値がゼロに近い時はエラー */
fprintf(stderr, "too small pivot!\n");
exit(1);
}
if(p != k){ /* ピボット操作 */
for(j = 0; j < N+1; j++) {
s = a[k][j]; /* 値の入れ替え */
a[k][j] = a[p][j];
a[p][j] = s;
}
}
for(i = k+1; i < N; i++) { /* 第 i 行 */
m = a[i][k] / a[k][k]; /* 倍率 m を計算 */
a[i][k] = 0; /* 注1 (下記参照) */
for(j = k+1; j < N+1; j++) { /* 第 j 列 */
a[i][j] = a[i][j] - a[k][j] * m;
}
}
}
for(i = N-1; i >= 0; i--){ /* 後退代入 */
m = 0;
for(j = N-1; j > i; j--){
m = m + a[i][j] * x[j];
}
x[i] = (a[i][N] - m) / a[i][i];
}
}
お礼
なるほど、引用元を調べてみたら確かにそのようになっていました。 範囲を正確に記述するのを忘れて申し訳ありませんでした。