高斯消元法模板--一般法+列主元素+完全主元素

1.一般高斯消元法:可能会出现较大的舍入误差

#include<cstdio>
#include<cmath>
using namespace std;
const int N=20;

void Guess(int n,double a[N][N]){
	for(int i=0;i<n;i++) //判断
		if(a[i][i]==0){
			printf("can't use Guess!\n");
			return ;
		} 
	
	//消元	
	double l[N][N];  //存储系数,行相减 
	for(int k=0;k<n-1;k++){   
		for(int i=k+1;i<n;i++){
			l[i][k]=a[i][k]/a[k][k];
			for(int j=k;j<=n;j++)
				a[i][j]=a[i][j]-l[i][k]*a[k][j];
		}  
			
	}
	
	//回代 
	double x[N];  //解空间 
	x[n-1]=a[n-1][n]/a[n-1][n-1];  
	for(int i=n-1;i>=0;i--){
		double sum=0;
		for(int j=i+1;j<n;j++)
			sum+=a[i][j]*x[j];
		x[i]=(a[i][n]-sum)/a[i][i];
	} 
	
	printf("\n");
	for(int i=0;i<n;i++)
		printf("X%d:%lf%c",i+1,x[i],i==n-1?'\n':' '); 
}

int main(){
	int n=1;
	while(true){
		printf("n=");
		scanf("%d",&n);
	
		if(n==0) break;
		
		double a[N][N];
		for(int i=0;i<n;i++)
			for(int j=0;j<=n;j++)
				scanf("%lf",&a[i][j]);
		
		Guess(n,a);
		printf("\n");
	}
	return 0;
}

2.列主元素消元法:行之间进行交换

#include<cstdio>
#include<cmath>
#include<algorithm> 
using namespace std;
const int N=20;
double a[N][N];

void Select(int i,int n){  //列主元素 
	int p=i+1,q=i;
	while(p<n){
		if(fabs(a[i][i])<fabs(a[p][i])){
			while(q<n+1){
				double tmp=a[p][q];
				a[p][q]=a[i][q];
				a[i][q]=tmp;
				q++;
			}
			q=0;
		}
		p++;
	}
}

void Guess(int n,double a[N][N]){
	for(int i=0;i<n;i++) //判断
		if(a[i][i]==0){
			printf("can't use Guess!\n");
			return ;
		} 
		
	//消元	
	double l[N][N];  //存储系数,行相减 
	for(int k=0;k<n;k++){  
		Select(k,n); 

		for(int i=k+1;i<n;i++){	
			l[i][k]=a[i][k]/a[k][k];
			for(int j=k;j<=n;j++)
				a[i][j]=a[i][j]-l[i][k]*a[k][j];
		}  		
	}
	
	
	//回代 
	double x[N];  //解空间 
	x[n-1]=a[n-1][n]/a[n-1][n-1];  
	for(int i=n-1;i>=0;i--){
		double sum=0;
		for(int j=i+1;j<n;j++)
			sum+=a[i][j]*x[j];
		x[i]=(a[i][n]-sum)/a[i][i];
	} 
	
	printf("\n");
	for(int i=0;i<n;i++)
		printf("X%d:%lf%c",i+1,x[i],i==n-1?'\n':' '); 
}

int main(){
	int n=1;
	while(true){
		printf("n=");
		scanf("%d",&n);
	
		if(n==0) break;
		
		for(int i=0;i<n;i++)
			for(int j=0;j<=n;j++)
				scanf("%lf",&a[i][j]);
		
		Guess(n,a);
		printf("\n");
	}
	return 0;
}

3.完全主元素消元法:行列都进行交换,行多增加一行标记要求的系数下标

#include<cstdio>
#include<cmath>
#include<algorithm> 
using namespace std;
const int N=100;
double a[N][N];

void Select(int x,int n){  //完全主元素 
	int p=x,q=x;
	for(int i=x;i<n;i++){  //记录绝对值最大的位置 
		for(int j=x;j<n;j++){	
			if(fabs(a[x][x])<fabs(a[i][j])){
				p=i;
				q=j;
			}
		}
	}
	int tmp=x;
	while(tmp<n+1){
		swap(a[p][tmp],a[x][tmp]);
		tmp++;
	}
	
	tmp=0;
	while(tmp<n+1){
		swap(a[tmp][q],a[tmp][x]);
		tmp++;
	} 
}

void Guess(int n,double a[N][N]){
	for(int i=0;i<n;i++) //判断
		if(a[i][i]==0){
			printf("can't use Guess!\n");
			return ;
		} 
		
	//消元	
	double l[N][N];  //存储系数,行相减 
	for(int k=0;k<n;k++){  
		Select(k,n); 

		for(int i=k+1;i<n;i++){	
			l[i][k]=a[i][k]/a[k][k];
			for(int j=k;j<=n;j++)
				a[i][j]=a[i][j]-l[i][k]*a[k][j];
		}
				
	}
	
	//回代 
	double x[N];  //解空间 
	x[n-1]=a[n-1][n]/a[n-1][n-1];  
	for(int i=n-1;i>=0;i--){
		double sum=0;
		for(int j=i+1;j<n;j++)
			sum+=a[i][j]*x[j];
		x[i]=(a[i][n]-sum)/a[i][i];
	} 
	
	printf("\n");
	for(int i=0;i<n;i++)
		printf("Y%d:%lf%c",i+1,x[i],i==n-1?'\n':' '); 
	
	printf("\n");
	for(int i=0;i<n;i++)
		printf("X%d:%lf%c",(int)a[n][i],x[i],i==n-1?'\n':' '); 
}

int main(){
	int n=1;
	while(true){
		printf("n=");
		scanf("%d",&n);
	
		if(n==0) break;
		
		for(int i=0;i<n;i++)
			for(int j=0;j<=n;j++)
				scanf("%lf",&a[i][j]);
				
		for(int j=0;j<n;j++)
			a[n][j]=(j+1);
		a[n][n]=0;
		
		Guess(n,a);
		printf("\n");
	}
	return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值