高斯消元

高斯消元

高斯消元,看起来好像很高端,其实它真的很高端,只不过并不难。

模拟而已。

主要就是可以解决方程组的问题,还有矩阵的问题。

然而用到的,就是我们平常解多元一次方程组的方法,这个消元,可以说是模拟了,它模拟了我们平时的手算。

我们平时的手算也是一元一元的消掉:

先以一元为例: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
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<

不着急,第一次看可能不懂,多看几遍,搞清楚每一步是干什么就懂了。

如有问题欢迎讨论。

你可能感兴趣的:(数学,数学,高斯消元)