ガウスの消去法
実行すると、方程式の変数の数をたずねてきます。入力すると、それぞれの変数の係数等をたずねてきます。a + 2b + 3c = 4 の場合、A[11] のときは 1 、A[12] のときは 2 、A[13] のときは 3 、b[1] のときは 4 のように入力します。これを全ての式の分だけ入力すると、答えが表示されます。なお、このプログラムでは、メモリーの都合上、変数の数は 15 までしか対応していません。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX 15
float A[MAX + 1][MAX + 2];
int N;
void getnum();
void sentaku(int j);
void zenshin();
void koutai();
void hyouji();
main(){
getnum();
zenshin();
koutai();
}
void getnum() {
int i, j;
float t;
while(N<MAX){
printf("変数の数? ");
scanf("%d", &N);
printf("\n");
if(N>MAX){
printf("変数が多すぎます。\n\n");
N = 0;
}else{
break;
}
}
for(i=1; i<=N; i++) {
for(j=1; j<=N; j++) {
printf("A[%d%d] = ", i, j );
scanf("%f", &t);
A[i][j] = t;
}
printf("B[%d] = ", i);
scanf("%f", &t);
A[i][j] = t;
printf("\n");
}
printf("入力された値\n");
hyouji();
}
void sentaku(int j) {
int i, k, imax;
float amax, T[MAX + 1][MAX + 2];
for(i=j; i<=N; i++) {
imax = i;
amax = fabs(A[i][j]);
for(k=i; k<=N; k++){
if(fabs(A[k][j])>amax) {
imax = k;
amax = fabs(A[k][j]);
}
}
for(k=1; k<=N+1; k++) {
T[i][k] = A[i][k];
A[i][k] = A[imax][k];
A[imax][k] = T[i][k];
}
}
}
void zenshin() {
int i, j, k;
float t;
for(j=1; j<N; j++) {
sentaku(j);
hyouji();
for(i=j+1; i<=N; i++) {
t = A[i][j] / A[j][j];
for(k=j; k<=N+1; k++) {
A[i][k] -= t * A[j][k];
}
}
}
printf("前進消去後の値\n");
hyouji();
}
void koutai() {
float s[MAX], t;
int i, j;
printf("答え\n");
s[N] = A[N][N+1] / A[N][N];
printf("X[%d] = %lf\n",N ,s[N] );
for(i=N-1; i>=1; i--) {
t = 0;
for(j=i+1; j<=N; j++) {
t += A[i][j] * s[j];
}
s[i] = ( A[i][N+1] - t ) / A[i][i];
printf("X[%d] = %lf\n",i ,s[i] );
}
}
void hyouji() {
int i, j;
for(i=1; i<=N; i++) {
for(j=1; j<=N; j++) {
printf("%10.6f ", A[i][j]);
}
printf("| %10.6f\n", A[i][j]);
}
printf("\n");
}
プログラムパラダイスのメニューに戻る
Copyright (C) 1999-2000 木野田和正