码迷,mamicode.com
首页 > 其他好文 > 详细

高斯消元

时间:2017-08-01 23:10:42      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:can   log   space   cin   cpp   div   稳定性   ret   main   

就是给定你若干个方程组,然后求解。

这里有一份正确性保证的板子,网上的好多都有bug,找了好久。。

#include<bits/stdc++.h>
using namespace std;
int n;
double g[200][200];
bool gauss() {
	int r;
	for(int i=1;i<=n;i++) {
		r=i;
		for(int j=i+1;j<=n;j++)
			if(fabs(g[j][i])>fabs(g[r][i])) r=j;
		if(r!=i) for(int j=1;j<=n+1;j++) swap(g[i][j],g[r][j]);//交换提高数值稳定性,保证gii!=0 
		if(g[i][i]==0) return 0;//判断无解的情况,g[i][i]是绝对值最大,如果最大等于0,一定无解 
		for(int k=i+1;k<=n;k++) {
			double f=g[k][i]/g[i][i];//用一个临时变量储存乘以的倍数 
			for(int j=i;j<=n+1;j++) g[k][j]-=f*g[i][j];
		}
	}//回代,最后g[1~n][n+1]就是解 
	for(int i=n;i>=0;i--) {
		for(int j=i+1;j<=n;j++)
			g[i][n+1]-=g[j][n+1]*g[i][j];
		g[i][n+1]/=g[i][i];
	}
	
	return 1;
}
void output() {
	for(int i=1;i<=n;i++)
		printf("%.2f\n",g[i][n+1]);
}

int main() {
	cin>>n;
	for(int i=1;i<=n;i++)	
		for(int j=1;j<=n+1;j++)
			scanf("%lf",&g[i][j]);
	if(gauss()) output();
	else puts("No Solution");
	return 0;
}

 

高斯消元

标签:can   log   space   cin   cpp   div   稳定性   ret   main   

原文地址:http://www.cnblogs.com/foreverpiano/p/gauss.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!