/* ガウスの消去法を行う関数を作成せよ。引数として拡大係数行列を受け取ることとする。
次の連立一次方程式をガウスの消去法を用いて解け。
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;
}