天天看點

高斯消元高斯消元

高斯消元

高斯消元,看起來好像很高端,其實它真的很高端,隻不過并不難。

模拟而已。

主要就是可以解決方程組的問題,還有矩陣的問題。

然而用到的,就是我們平常解多元一次方程組的方法,這個消元,可以說是模拟了,它模拟了我們平時的手算。

我們平時的手算也是一進制一進制的消掉:

先以一進制為例:3x=8

顯然x=8/3;

下面換為參數:ax=b

那麼我們就要分情況讨論了:

1.a!=0

此時顯然有x=b/a

2.a==0

此時若b也為0,我們就有無數多組解,若b不為0,則無解。

當然,一進制的是最簡單的,我們現在讨論二進制的。

{3x+2y=1

{x+3y=5

第一步,還是消元。我們先消x。

把第一個式子除以3,有:

x+2/3y=1/3

在用這個式子減去第二個式子,得到:

-7/3y=-14/3

我們現在又得到了一個一進制的方程。

解出y就可以了。

三元,四元,都可以化為一進制的。

看了代碼,就知道了。

下面有一道模闆題:洛谷3389

下面給出我的代碼:

#include<bits/stdc++.h>
using namespace std;
const int mm=200;
const double eps=1e-8;
double a[mm][mm];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n+1;j++)
        {
            cin>>a[i][j];
        }
    }
    int k=1;
    for(int i=1;i<=n;i++)
    {

        double div=a[i][i];
        if(fabs(div)<=eps)
        {
            int flag=0;
            for(int j=i+1;j<=n;i++)
            {
                if(fabs(a[j][i])>eps)
                {
                    for(int k=1;k<=n+1;k++)
                        swap(a[i][k],a[j][k]);
                    flag=1;
                    break;
                }
            }
            if(flag==0)
            {
                cout<<"No Solution";
                return 0;
            }
        }
        div=a[i][i];
        for(int j=i;j<=n+1;j++)
        {
            a[i][j]/=div;
        }

        for(int j=1;j<=n;j++)
        {
            double ti=a[j][i]/a[i][i];
            if(j!=i)
            for(int q=i;q<=n+1;q++)
            {
                a[j][q]-=ti*a[i][q];
            }
        }
    }
    /*for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n+1;j++)
        cout<<a[i][j]<<' ';
        cout<<endl;
    }*/
    for(int i=1;i<=n;i++)
    {
        printf("%.2f\n",a[i][n+1]);
    }
    return 0;

}
           

不着急,第一次看可能不懂,多看幾遍,搞清楚每一步是幹什麼就懂了。

如有問題歡迎讨論。