ガウスの消去法

 実行すると、方程式の変数の数をたずねてきます。入力すると、それぞれの変数の係数等をたずねてきます。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 木野田和正