【高斯消元】
【高斯消元】
时间复杂度\(O(n^{3})\)
高斯消元解决加法方程组
每次选绝对值最大的系数交换上来,然后消元
主元:系数不为0
自由元:系数为0
自由元之间相互独立,互不影响
主元的值可能会由自由元确定
唯一解:主元系数都不为0,值也不为0
矛盾解、多解:
若主元系数为0时,值不为0->矛盾
若主元系数为0时,值为0->多解
流程图解:若该行主元为0,在看后续行的时候也要把该行纳入考虑
表达式冗余,补充变量:\(0x_{n+1}\)
表达式不足,补充表达式:\(0x_i+0x_2+...=0\)
模版题
https://www.luogu.com.cn/problem/P3389
const int N=110;
int n;
const double eps=1e-7;//判0精度
double mat[N][N];
void solve(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n+1;j++){
cin>>mat[i][j];
}
}
//选绝对值最大的系数交换上来
for(int i=1;i<=n;i++){
int max=i;
for(int j=1;j<=n;j++){
if(j<i && abs(mat[j][j])>=eps){//该行已有主元
continue;
}
if(abs(mat[j][i])>abs(mat[max][i])){
max=j;
}
}
//把两行进行交换
for(int k=1;k<=n+1;k++){
double temp=mat[i][k];
mat[i][k]=mat[max][k];
mat[max][k]=temp;
}
//如果有找到一个主元
if(abs(mat[i][i])>=eps){
double tmp=mat[i][i];
//把主元系数消成1
for(int j=i;j<=n+1;j++){
mat[i][j]/=tmp;
}
//操作其他行
for(int j=1;j<=n;j++){
if(i!=j){
double rate=mat[j][i]/mat[i][i];
for(int k=i;k<=n+1;k++){//i前面都变成全0了,所以不用操作
mat[j][k]-=mat[i][k]*rate;
}
}
}
}
}
for(int i=1;i<=n;i++){
if(mat[i][i]==0){
cout<<"No Solution"<<endl;
return;
}
}
for(int i=1;i<=n;i++){
cout<<fixed<<setprecision(2)<<mat[i][n+1]<<endl;
}
}

浙公网安备 33010602011771号