Guass列选主元消去法:

AX=B;

1)消元过程步骤

i从1到n-1列

a.列选主元:选取i列中绝对值最大的元素,即确定其值所在的行数,这里用max_val_index保存。

int max_val_index = 0;

for(int i=0; i<N; i++){


max_val_index = i;

for(int row_i=i+1; row_i<N; row_i++){


if (abs(Arr[row_i][i]) > abs(Arr[max_val_index][i])){


max_val_index = row_i;

}

}

b.换行:就是将max_val_index行与当前主元的行交换(交换系数矩阵和方程组右端矩阵)

double temp = 0.0;

for(int d=0; d<N; d++){


temp = Arr[max_val_index][d];

Arr[max_val_index][d] = Arr[i][d];

Arr[i][d] = temp;

}

temp = b[max_val_index];

b[max_val_index] = b[i];

b[i] = temp;

c.归一化:

temp=Arr[i][i];

for(int col_i=i;col_i<N;col_i++)

Arr[i][col_i]/=temp;

b[i]/=temp;

d.消元:

for(int row_i=i+1; row_i<N; row_i++){


temp=Arr[row_i][i];

for(int col_i=i; col_i<N; col_i++){


Arr[row_i][col_i]-=temp*Arr[i][col_i];

}

b[row_i] -= b[i] * temp;

}

2)回代过程

for(int row=N-1;row>=0;row–){


x[row]=b[row];

for(int col=N-1;col>row;col–)

x[row]-=Arr[row][col]*x[col];

}

源程序如下:

#include<stdio.h>

#include <math.h>

#define DATE_MAX 20

double matrix[DATE_MAX][DATE_MAX],sum[DATE_MAX],x[DATE_MAX]={0};

void Gauss_eliminate(double (*Arr)[DATE_MAX], double *b,double *x,int N){


// 列主元高斯消去法,分为消元过程和回代过程

//1.消元过程

//(a)列选主元

int max_val_index = 0;

double effecd = 0.0;

for(int i=0; i<N; i++){


max_val_index = i;

for(int row_i=i+1; row_i<N; row_i++){


if (abs(Arr[row_i][i]) > abs(Arr[max_val_index][i])){


max_val_index = row_i;

}

}

// 待循环结束,便是找到了主元所在列上的最大值所对应的索引

// 将max_val_index所指示的行交换到主行上去

//(b)换行

double temp = 0.0;

for(int d=0; d<N; d++){


temp = Arr[max_val_index][d];

Arr[max_val_index][d] = Arr[i][d];

Arr[i][d] = temp;

}

temp = b[max_val_index];

b[max_val_index] = b[i];

b[i] = temp;

//(c)归一化

temp=Arr[i][i];

for(int col_i=i;col_i<N;col_i++)

Arr[i][col_i]/=temp;

b[i]/=temp;

//(d)消元

for(int row_i=i+1; row_i<N; row_i++){


temp=Arr[row_i][i];

for(int col_i=i; col_i<N; col_i++){


Arr[row_i][col_i]-=temp*Arr[i][col_i];

}

b[row_i] -= b[i] * temp;

}

}

//回代过程

for(int row=N-1;row>=0;row–){


x[row]=b[row];

for(int col=N-1;col>row;col–)

x[row]-=Arr[row][col]*x[col];

}

}

void input(double (*a)[DATE_MAX],double *b,int n){


printf(“输入系数矩阵:\n”);

for(int i=0;i<n;i++)

for(int j=0;j<n;j++)

scanf(“%lf”,&a[i][j]);

printf(“输入方程组右端矩阵:\n”);

for(int i=0;i<n;i++)

scanf(“%lf”,&b[i]);

}

void output(double (*a)[DATE_MAX],double *b,double *c,int n){


int i,j;

printf(“系数矩阵:\n”);

for(i=0;i<n;i++){


for(j=0;j<n-1;j++)

printf(“%f “,a[i][j]);

printf(“%f\n”,a[i][j]);

}

printf(“方程组右端矩阵:\n”);

for(int i=0;i<n;i++)

printf(“%f\n”,b[i]);

printf(“方程组结果:\n”);

for(int i=0;i<n;i++)

printf(“x[%d]=%f\n”,i+1,c[i]);

}


int main(){


int n;

printf(“输入矩阵阶数:\n”);

scanf(“%d”,&n);

input(matrix,sum,n);

Gauss_eliminate(matrix,sum,x,n);

output(matrix,sum,x,n);

}

运行实例加结果:

输入矩阵阶数:

3

输入系数矩阵:

2.5 2.3 -5.1

5.3 9.6 1.5

8.1 1.7 -4.3

输入方程组右端矩阵:

3.7

3.8

5.5

系数矩阵:

1.000000 0.209877 -0.530864

0.000000 1.000000 0.508218

0.000000 0.000000 1.000000

方程组右端矩阵:

0.679012

0.023709

-0.419325

方程组结果:

x[1]=0.406705

x[2]=0.236818

x[3]=-0.419325



版权声明:本文为qq_40583795原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_40583795/article/details/103216453