数值计算作业:Guass列选主元消去法解线性方程组

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

      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值