[ create a new paste ] login | about

Link: http://codepad.org/3bGYoGjz    [ raw code | output | fork ]

C, pasted on Jun 4:
/* ガウスの消去法を行う関数を作成せよ。引数として拡大係数行列を受け取ることとする。
次の連立一次方程式をガウスの消去法を用いて解け。
7y-z+4w=36
3x-4y+z=20
x+2y-3w=-14
2x-3z-w=-26 */

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

#define MN_MAX 100
#define EPS 1.0E-3 //許容誤差

struct matrix_data{
  int row; //行数
  int col; //列数
  double dat[MN_MAX];
  
};

struct matrix_data AugmentedMatrix = {
  4,
  5,
  {
    0.0,  7.0, -1.0,  4.0,  36.0,
    3.0, -4.0,  1.0,  0.0,  20.0,
    1.0,  2.0,  0.0, -3.0, -14.0,
    2.0, -3.0,  0.0, -1.0, -26.0
  }
};

struct matrix_data init_matrix(int m, int n)
{
  struct matrix_data mat;

  mat.row = m;
  mat.col = n;

  return mat;
}


struct matrix_data set_matrix(struct matrix_data mat, int i, int j, double val)
{
  mat.dat[i*mat.col + j] = val;

  return mat;
}

double get_matrix(struct matrix_data mat, int i, int j)
{
  return mat.dat[i*mat.col + j];
}

//p行とq行を入れ替える
struct matrix_data exchange_matrix(struct matrix_data mat,int p, int q)
{
  int i;

  for(i = 0; i < mat.col; ++i){
    mat = set_matrix(mat, q, i, get_matrix(mat, p, i));
    mat = set_matrix(mat, p, i, get_matrix(mat, q, i));
  }
  return mat;
}

//行列の表示
void show_matrix(struct matrix_data mat)
{
  int i, j;

  for (i = 0; i < mat.row; i++){
    for(j = 0; j < mat.col; j++){
      printf("%f ",get_matrix(mat, i, j));
    }
    printf("\n");
  }
}

//ガウスの消去法
struct matrix_data Gaussian_Elimination(struct matrix_data mat)
{
  int i,j,k;
  int n;
  int max_row;
  double p,q;
  
  struct matrix_data x; 
  x = init_matrix(mat.col-1,1);
  n = mat.col;  
  max_row = k;
  
  for(k = 0; k < n-1; k++){
    for(i = k+1; i < n-1; i++){
      if(fabs(get_matrix(mat, i, k)) > fabs(get_matrix(mat, max_row ,k))){
	max_row = i; 
	exchange_matrix(mat, k, max_row);
      }else if(fabs(get_matrix(mat, max_row, k)) < EPS){
	exit(2);
      }
      
      p = get_matrix(mat, k, k);
      for(j = k; j < n; j++){
	get_matrix(mat, k, j) = get_matrix(mat, k, j) / p;
      }
    }
    
    for(i = k+1; i < n-1; i++){
      q = get_matrix(mat, i, k);
      for(j = k; j< n; j++){
	get_matrix(mat, i, j) = get_matrix(mat, i ,j) - get_matrix(mat, k, j)*q;
      }
    }
  }
  
  for(k = n-1; k >= 0; k--){
    q = get_matrix(mat, k, n);
    for(j = k+1; k < n-1; k++);
    q= q - get_matrix(mat, k ,j) * get_matrix(x, j, 1);
    get_matrix(x, k, 1) = q;
  }      
  return x;
}


int main(void)
{
  struct matrix_data x;

  printf("もとの行列を表示します");
  show_matrix(AugmentedMatrix);

  x = Gaussian_Elimination(AugmentedMatrix);
  printf("変数の値を表示します。");
  show_matrix(x);

  return 0;
}


Output:
1
2
3
4
In function 'Gaussian_Elimination':
Line 105: error: invalid lvalue in assignment
Line 112: error: invalid lvalue in assignment
Line 121: error: invalid lvalue in assignment


Create a new paste based on this one


Comments: