⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gauss.cpp

📁 实现功能:顺序高斯消去法、列主元素消去法、全主元素消去法
💻 CPP
字号:
//该程序由goldsen编写,仅供学习交流之用.goldsen2003@yahoo.com.cn
//参考课本第二章例一,实现功能:顺序高斯消去法、列主元素消去法、全主元素消去法
//水平有限,不妥之处请批评指正,转载请注明出处:)
//////////////////////////////////////////////////////////////////////////
#include "stdio.h"
#include "math.h"
////定义外部变量///////////////////
	double A[10][10];
	double B[10];
	double X[10];
    double b1=0.6781,b2=12.1,b3=981;
	signed int n=3;//选择矩阵的阶次
	
///////////////////////////////////
void input_matrix()
{

    
	signed int c;//选择矩阵输入方式
	static signed int i=1;//输出行
	signed int j=1;//输出列
	double a11=0.167,a12=0.01,a13=0.012,a21=5.91,a22=0.8334,a23=1,a31=4.2,a32=1200,a33=3200;//默认三阶矩阵
	
	double a=0;
	///////////////初始化矩阵空间,矩阵初始大小取决于外部变量定义,预设最大矩阵10,遇到不同情况可作更改
	for (i=1;i<=10;i++)
	{
		for (j=1;j<=10;j++)
		{
			A[i-1][j-1]=0;
		}
		B[i-1]=0;
		X[i-1]=0;
	}
	printf("Please insert your matrix.(0=default,1=insert)\n");
	scanf("%d",&c);
	if (0==c)
	{
		printf("you have chosen the default marix.\n");
		printf("The matrix is:\n");

		A[0][0]=a11;
		A[0][1]=a12;
		A[0][2]=a13;
		A[1][0]=a21;
		A[1][1]=a22;
		A[1][2]=a23;
		A[2][0]=a31;
		A[2][1]=a32;
		A[2][2]=a33;
		B[0]=b1;
		B[1]=b2;
		B[2]=b3;
		
		for (i=1;i<=3;i++)
		{
			for (j=1;j<=3;j++)
			{
				printf("%f \t",A[i-1][j-1]);
			}
			printf("\n");
		}
		printf("vector b is:\n%f\n%f\n%f\n\n",b1,b2,b3);
	} 
	else if (1==c)
	{
		printf("Please insert rank(阶次) n.\n");
		scanf("%d",&n);
		printf("Please insert %d elements in your matrix.\n",n*n);
		for (i=1;i<=n;i++)
		{
			for (j=1;j<=n;j++)
			{
				scanf("%lf",&a);
				A[i-1][j-1]=a;
			}
		}
		printf("The matrix is:\n");
		for (i=1;i<=n;i++)
		{
			for (j=1;j<=n;j++)
			{
				printf("%f \t",A[i-1][j-1]);
			}
			printf("\n");
		}
		printf("Please insert %d elements in vector b.\n",n);
		for (i=1;i<=n;i++)
		{
		    scanf("%lf",&a);
			B[i-1]=a;
			
		}
		printf("vector b is:\n");
		for (i=1;i<=n;i++)
		{
			printf("%f\n",B[i-1]);
		}
		printf("\n");
	}
	else
	{
		printf("you insert a wrong number.\n");
	}

}

double abs_double(double abs_in)/////////////double型取绝对值
{
	double abs_out;
	if (abs_in<=0)
	{
		abs_out=-abs_in;///////////////////////////////////取绝对值////////////
	} 
	else
	{
		abs_out=abs_in;
	}
	return abs_out;
	
}

void Gauss_shunxu()///////////////////////////////////////////////////////顺序高斯消元法
{
	signed int k;//消元次数
	signed int i;//行控制
	signed int j;//列控制
	double flag;
	double e=0.0001;//控制精度
	double m=0;//消元因子
	double Sum=0;//回代求和
	
/////////消元过程
	for (k=0;k<n-1;k++)
	{

		flag=abs_double(A[k][k]);/////////////////////////////////////////////////判断Akk的值,使之非零。
		
		if (flag<=e)
		{
			printf("A[%d][%d] is zero,wrong!",k+1,k+1);
			return;	
		}
		////////////////////////////////////////////////////////////
		for (i=k;i<=n-1;i++)
		{

			m=-A[i+1][k]/A[k][k];
			for (j=k;j<=n-1;j++)
			{
				A[i+1][j]=A[i+1][j]+m*A[k][j];
			}
			B[i+1]=B[i+1]+m*B[k];
		}
		printf("step%d:\n",k+1);
		for (i=1;i<=n;i++)
		{
			for (j=1;j<=n;j++)
			{
				printf("%f \t",A[i-1][j-1]);
			}
			printf("\n");
		}
		printf("vector b is:\n");
		for (i=1;i<=n;i++)
		{
			printf("%f\n",B[i-1]);
		}
		printf("\n");
	}

///////////////////////////////////////////////回代过程
	flag=abs_double(A[n-1][n-1]);

	if (flag<=e)//////////////////////////////////////////////////////////////////////////判断Ann的值,使之非零。
	{
		printf("A[%d][%d] is zero,wrong!\n",n-1,n-1);
		return;	
	}

	//////////////////////////////////////////////////////////////////////////
	X[n-1]=B[n-1]/A[n-1][n-1];
	for (k=n-1;k>=1;k--)
	{
		for (j=n-1;j>=k;j--)
		{
			Sum+=A[k-1][j]*X[j];
		}
		X[k-1]=(B[k-1]-Sum)/A[k-1][k-1];
		Sum=0;
	}
	printf("The %d roots is:\n",n);
	for (i=1;i<=n;i++)
	{
		printf("%f\n",X[i-1]);
	}


}

void Gauss_liezhu()//////////////////////////////////////////////////////列主元素消去法
{
	signed int k;//消元次数
	signed int i;//行控制
	signed int j;//列控制
	double flag;
	double e=0.00001;//控制精度
	double m=0;//消元因子
	double Sum=0;//回代求和
	double max_A;
	double t_A;
	signed int ik;
	
/////////消元过程
	for (k=0;k<n-1;k++)
	{
		//////////////////////////////////////////////////////////////////////////交换k行和ik行
		
		for (i=k,max_A=A[k][k],ik=k;i<=n-1;i++)
		{
			if (abs_double(max_A)<abs_double(A[i][k]))
			{
				max_A=A[i][k];
				ik=i;
			}

		}
		for (j=0;j<=n-1;j++)
		{
			t_A=A[k][j];
			A[k][j]=A[ik][j];
			A[ik][j]=t_A;
		}

		t_A=B[k];
		B[k]=B[ik];
		B[ik]=t_A;

		

        //////////////////////////////////////////////////////////////////////////

		flag=abs_double(A[k][k]);/////////////////////////////////////////////////判断Akk的值,使之非零。
		
		if (flag<=e)
		{
			printf("A[%d][%d] is zero,wrong!",k+1,k+1);
			return;	
		}
		////////////////////////////////////////////////////////////
		for (i=k;i<=n-1;i++)
		{

			m=-A[i+1][k]/A[k][k];
			for (j=k;j<=n-1;j++)
			{
				A[i+1][j]=A[i+1][j]+m*A[k][j];
			}
			B[i+1]=B[i+1]+m*B[k];
		}
		printf("step%d:\n",k+1);
		for (i=1;i<=n;i++)
		{
			for (j=1;j<=n;j++)
			{
				printf("%f \t",A[i-1][j-1]);
			}
			printf("\n");
		}
		printf("vector b is:\n");
		for (i=1;i<=n;i++)
		{
			printf("%f\n",B[i-1]);
		}
		printf("\n");
	}

///////////////////////////////////////////////回代过程
	flag=abs_double(A[n-1][n-1]);

	if (flag<=e)//////////////////////////////////////////////////////////////////////////判断Ann的值,使之非零。
	{
		printf("A[%d][%d] is zero,wrong!\n",n-1,n-1);
		return;	
	}

	//////////////////////////////////////////////////////////////////////////
	X[n-1]=B[n-1]/A[n-1][n-1];
	for (k=n-1;k>=1;k--)
	{
		for (j=n-1;j>=k;j--)
		{
			Sum+=A[k-1][j]*X[j];
		}
		X[k-1]=(B[k-1]-Sum)/A[k-1][k-1];
		Sum=0;
	}
	printf("The %d roots is:\n",n);
	for (i=1;i<=n;i++)
	{
		printf("%f\n",X[i-1]);
	}


}
void Gauss_quanzhu()//////////////////////////////////////////////////////全主元素消去法
{
	signed int k;//消元次数
	signed int i;//行控制
	signed int j;//列控制
	double flag;
	double e=0.00001;//控制精度
	double m=0;//消元因子
	double Sum=0;//回代求和
	double max_A;
	double t_A;
	signed int ik,jk;
	signed int order[10];//初始化矩阵空间,记录全主元的变量顺序,预设最大矩阵10,遇到不同情况可作更改
	for (i=0;i<=n-1;i++)
	{
		order[i]=i;
	}
	
/////////消元过程
	for (k=0;k<n-1;k++)
	{
		
//////////////////////////////////////////////////////////////////////////查找k行k列之后元素绝对值最大数
		for (i=k,max_A=A[k][k],jk=k,ik=k;i<=n-1;i++)
		{
			for (j=k;j<=n-1;j++)
			{
				if (abs_double(max_A)<abs_double(A[i][j]))
				{
					ik=i;
					jk=j;
				}
			}
		}
		for (j=0;j<=n-1;j++)////交换行
		{
			t_A=A[k][j];
			A[k][j]=A[ik][j];
			A[ik][j]=t_A;
		}
		
		t_A=B[k];////交换b
		B[k]=B[ik];
		B[ik]=t_A;
		
		for (i=0;i<=n-1;i++)//交换列
		{
			t_A=A[i][k];
			A[i][k]=A[i][jk];
			A[i][jk]=t_A;
		}

		i=order[jk];//记录列变序号
		order[jk]=order[k];
		order[k]=i;

        //////////////////////////////////////////////////////////////////////////

		flag=abs_double(A[k][k]);/////////////////////////////////////////////////判断Akk的值,使之非零。
		
		if (flag<=e)
		{
			printf("A[%d][%d] is zero,wrong!",k+1,k+1);
			return;	
		}
		////////////////////////////////////////////////////////////
		for (i=k;i<=n-1;i++)
		{

			m=-A[i+1][k]/A[k][k];
			for (j=k;j<=n-1;j++)
			{
				A[i+1][j]=A[i+1][j]+m*A[k][j];
			}
			B[i+1]=B[i+1]+m*B[k];
		}
		printf("step%d:\n",k+1);
		for (i=1;i<=n;i++)
		{
			for (j=1;j<=n;j++)
			{
				printf("%f \t",A[i-1][j-1]);
			}
			printf("\n");
		}
		printf("vector b is:\n");
		for (i=1;i<=n;i++)
		{
			printf("%f\n",B[i-1]);
		}
		printf("\n");
	}

///////////////////////////////////////////////回代过程
	flag=abs_double(A[n-1][n-1]);

	if (flag<=e)//////////////////////////////////////////////////////////////////////////判断Ann的值,使之非零。
	{
		printf("A[%d][%d] is zero,wrong!\n",n-1,n-1);
		return;	
	}

	//////////////////////////////////////////////////////////////////////////
	X[n-1]=B[n-1]/A[n-1][n-1];
	for (k=n-1;k>=1;k--)
	{
		for (j=n-1;j>=k;j--)
		{
			Sum+=A[k-1][j]*X[j];
		}
		X[k-1]=(B[k-1]-Sum)/A[k-1][k-1];
		Sum=0;
	}
	printf("The %d roots is:\n",n);
	for (i=1;i<=n;i++)
	{
		printf("X[%d]=%f\n",order[i-1]+1,X[i-1]);
	}


}
void main()
{
	signed int c;
	input_matrix();
	printf("plsease choose the method for guass elimination.(0=顺序Guass,1=列主元素Guass,2=全主元Guass)\n");
	scanf("%d",&c);
	if (0==c)
	{
		Gauss_shunxu();
		return;
	}
	else if (1==c)
	{
		Gauss_liezhu();
		return;
	}
	else if (2==c)
	{
		Gauss_quanzhu();
		return;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -