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