1. 程式人生 > >數值分析中的高斯消元 c語言實現附帶註釋

數值分析中的高斯消元 c語言實現附帶註釋

#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;
}