連立方程式


部分ピボット選択を行いながらGaussの消去法で連立方程式を解く プログラムを以下に示す. ピボットは対象となる要素のうちで絶対値が最大のものを選択するようにしている.

#include <stdio.h>
#include <math.h>

#define DIM  4

int pivot( double a[ DIM ][ DIM + 1 ], int i ){

      double p = fabs( a[ i ][ i ] ), t;
      int ii, j, k = i;

      for ( ii = i + 1; ii < DIM; ii++ ){
          if ( fabs( a[ ii ][ i ] ) > p ){
              k = ii;
              p = fabs( a[ ii ][ i ] );
          }
      }
      if ( k != i ){
         for ( j = i; j < DIM + 1; j++ ){
             t = a[ k ][ j ];
             a[ k ][ j ] = a[ i ][ j ];
             a[ i ][ j ] = t;
         }
      }
      return k;
}

int main(){

    double a[ DIM ][ DIM + 1 ] = { { 2, -3, 1, -1, -3 }, 
                                   { 1, 2, -3, 1, 6 }, 
                                   { 3, -1, 1, 2, -4 },
                                   { 2, 1,  2, 0, 2 } };
    double x[ DIM ], s, t;
    int i, ii, j, imax, jmax;

    imax = DIM;
    jmax = DIM + 1;

/*  forward elimination */
    for ( i = 0; i < imax; i++ ){
       pivot( a, i );
       for ( ii = i + 1; ii < imax; ii++ ){
           t = a[ ii ][ i ] / a[ i ][ i ];
           for ( j = 0; j < jmax; j++ ) 
               a[ ii ][ j ] -= t * a[ i ][ j ];			
       }
    }

/*  backward substitution */
    for ( i = imax - 1; i >= 0; i-- ){
       for ( j = i + 1, s = 0; j < imax; j++ ) 
           s += a[ i ][ j ] * x[ j ];
       x[ i ] = ( a[ i ][ jmax - 1 ] - s ) / a[ i ][ i ];
    }

/*  output solutions */
    for ( i = 0; i < imax; i++ )
       printf( "x( %d ) = %10.5f\n", i, x[ i ] );

	return 0;

}

お問い合わせはメールにて: akasaka@klc.ac.jp

戻る
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送