数值分析中的高斯消元 c语言实现附带注释

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lv414333532/article/details/82823040
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
double A[1010][1010];
double B[1010];
double l;
int main()
{
    int n;
    printf("请输入矩阵的阶数,如想要退出请按零:\n");
    while(~scanf("%d",&n))
    {
        if(n==0)
            return 0;
        printf("请按从上到下输入矩阵:\n");
        for(int i=1; i<=n; i++)    //记录原始矩阵A;
        {
            for(int j=1; j<=n; j++)
            {
                scanf("%lf",&A[i][j]);
            }
        }

       /* 由  i行 2 3 1
              j行 2 5 6
         变为 i行 2 3 1
              j行 0 2 5
        这一过程称为 去除第j行i因子;其中消零因子为:2/2=1*/
        (本人自己定义)

        for(int i=1; i<=n; i++)  //记录B;
        {
            scanf("%lf",&B[i]);
        }
        for(int i=1; i<n; i++)   //高斯消元;从第一行到n-1行;
        {

            for(int j=i+1; j<=n; j++)//当前消得是第j行;
            {
                l=A[j][i]/A[i][i];     //计算消零因子;
                for(int k=i; k<=n; k++)//消除第j行每一个数的i因子;
                {
                    A[j][k]-=l*A[i][k];
                }
                B[j]-=l*B[i];   //对应的B也消去j行i因子
            }
        }
        for(int i=n; i>=1; i--) //回代求X;
        {
            for(int j=n; j>i; j--)
            {
                B[i]-=A[i][j]*B[j];
            }
            B[i]/=A[i][i];
        }
        for(int i=1; i<=n; i++) //输出X;
        {
            printf("%f\n",B[i]);
        }

        printf("请输入矩阵的阶数,如想要退出请按零:\n");

    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/lv414333532/article/details/82823040