高斯消元
高斯消元,看起来好像很高端,其实它真的很高端,只不过并不难。
模拟而已。
主要就是可以解决方程组的问题,还有矩阵的问题。
然而用到的,就是我们平常解多元一次方程组的方法,这个消元,可以说是模拟了,它模拟了我们平时的手算。
我们平时的手算也是一元一元的消掉:
先以一元为例: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;
}
不着急,第一次看可能不懂,多看几遍,搞清楚每一步是干什么就懂了。
如有问题欢迎讨论。