高斯消元
高斯消元,看起來好像很高端,其實它真的很高端,隻不過并不難。
模拟而已。
主要就是可以解決方程組的問題,還有矩陣的問題。
然而用到的,就是我們平常解多元一次方程組的方法,這個消元,可以說是模拟了,它模拟了我們平時的手算。
我們平時的手算也是一進制一進制的消掉:
先以一進制為例: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;
}
不着急,第一次看可能不懂,多看幾遍,搞清楚每一步是幹什麼就懂了。
如有問題歡迎讨論。