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

📄 jiefc.cpp

📁 使用高斯列主元法消去法求解高次线性方程组
💻 CPP
字号:
#include <iostream.h>
#include "math.h"

void welcome();//1.修改未知数个数
void jisuan();//求解方程组
int xiugai();//2.修改方程组系数

void chengk(int i, long double k);
void hualie(int i);
void Uhualie(int i);
void print(); //3.输出方程组系数
void printb(); //输出方程组的解
void chengplus(int i, long double k ,int j);
void exchange(int i, int j);

int hang=3;
int lie=4;

long double a[100][101];
long double b[100][101];


void main()
{
	for(int i=0;i<100;i++)
	{
		for(int j=0;j<101;j++)
		{
			a[i][j]=0;
		}
	}
	
	while(1)
	{////////////////////////
		int choose=0;
		cout <<" 1.修改未知数个数。\n";
		cout <<" 2.修改方程组系数。\n";
		cout <<" 3.输出方程组系数。\n";
		cout <<" 4.计算结果。\n";
		cout <<" 请选择:";
		cin >>choose;
		
		switch(choose)
		{
		case 1:welcome();break;
		case 2:xiugai();break;
		case 3:print();break;
		case 4:print();jisuan();printb();break;
		default:cout <<" 错误\n";
		}
		
	}///////////////
}

//第j行元素加上第i行元素的k倍
void chengplus(int i, long double k, int j)
{
	for(int t=0;t<lie;t++)
	{
		b[j-1][t]+=b[i-1][t]*k;
	}
}

void print()
{
	for(int m=0;m<hang;m++)
	{
		for(int n=0;n<(lie-2);n++)
		{
			cout <<a[m][n] <<" x" <<(n+1) <<"+"<<"\t" ;
		}
		cout <<a[m][lie-2] <<" x" <<(n+1);
		cout <<" =" <<a[m][lie-1];
		cout <<endl;
	}
	cout <<"\n";
}

//输出方程组的解,二维矩阵b的第lie-1(最后一列)存储答案
void printb()
{
	
	cout <<"\n";
	int testa=0;
	int testb=0;
	for(int i=0;i<hang;i++)
	{
		for(int j=0;j<hang;j++)
		{
			if(b[i][j]!=0){testb+=1;} 
		}
		
		if(testb==0&&b[i][lie-1]!=0){testa+=1;}
		testb=0;
	}
	
	if(testa!=0)
	{
		cout <<"     方程组无解!!\n\n";
	}
	else
	{
		cout <<"   ";
		for(int n=0;n<hang;n++)
		{
			cout <<"x" <<n+1 <<"=" <<b[n][lie-1] <<"  ";
		}
		cout <<"\n\n";
	}
}

//交换i,j两行
void exchange(int i, int j)
{
	long double temp=0;
	for(int t=0;t<lie;t++)
	{
		temp=b[i-1][t];
		b[i-1][t]=b[j-1][t];
		b[j-1][t]=temp;
	}
}


//先求第i列的主元,将主元所在行与第i行,将第i列对角线以下元素化为0
void hualie(int i)
{
	int jilu=-1;

	//////////////////////////////////////////////////////////////////////////
	//采用高斯列主元消去法,防止绝对值较小的数作分母
	double temp = fabs( b[i-1][i-1]);
	jilu = i;
	for (int v=i-1; v<hang; v++)//求列主元
	{
		if ( fabs(b[v][i-1]) > temp)
		{
			temp = fabs(b[v][i-1]);
			jilu = v+1;
		}
	
	}
	
	//////////////////////////////////////////////////////////////////////////

	
	
/*	for(int v=0;v<(hang-i+1);v++)
	{
		if(b[i-1+v][i-1]!=0)
		{
			jilu=i+v;//jilu:i,i+1,,,hang
			break;//跳出for循环
		}
	}
*/
	if(jilu==-1)
	{
	}
	else
	{
		long double kkk=1;
		exchange(i,jilu);//交换两行
		chengk(i,(1.0/b[i-1][i-1]));//第i行元素×(1.0/b[i-1][i-1])
		for(int w=0;w<(hang-i);w++)
		{
			if(b[i-1][i-1]!=0)
			{
				kkk=0.0-(b[i+w][i-1]/b[i-1][i-1]);
				chengplus(i,kkk,i+1+w);//第i+1+w行元素加上第i行元素的kkk倍
			}
		}
	}
}


//将第i列对角线以上元素化为0
void Uhualie(int i)
{
	if(b[i-1][i-1]!=0)
	{
		long double kkk=1;
		for(int w=0;w<(i-1);w++)
		{
			if(b[i-1][i-1]!=0)
			{
				kkk=0.0-(b[i-2-w][i-1]/b[i-1][i-1]);
				chengplus(i,kkk,i-1-w);//第i-1-w行元素加上第i行元素的kkk倍
			}
		}
	}
}

//第i行元素×k
void chengk(int i, long double k)
{
	
	for(int c=0;c<lie;c++)
	{
		b[i-1][c]=b[i-1][c]*k;
	}
	
}

//选择未知数的个数
void welcome()
{
	
	do
	{
		cout <<"请输入未知数个数:";
		cin >>hang;
	}while(hang<2||hang>99);
	lie=hang+1;
}

//方程组求解计算
void jisuan()
{
	for(int i=0;i<100;i++)
	{
		for(int j=0;j<101;j++)
		{
			b[i][j]=a[i][j];
		}
	}
	
	int z=0;
	if(hang<lie)
	{
		z=hang;
	}
	else
	{
		z=lie;
	}
	
	for(int zi=0;zi<z;zi++)
	{
		hualie(zi+1);
	}
	for(int zii=0;zii<z;zii++)
	{
		Uhualie(z-zii);
	}
	for(int zck=0;zck<z;zck++)
	{
		if(b[zck][zck]!=0)
		{
			chengk(zck+1,(1.0/b[zck][zck]));//第zck+1行元素×(1.0/b[zck][zck])
		}
	}
}

int xiugai()
{
	cout <<endl;
	int ch;
	do
	{
		cout <<"请选择要修改的行(如果要退出修改,请输入888):";
		cin >>ch;
		if(ch==888)
		{
			return 1;
		}
	}while(ch<1||ch>hang);
	cout <<"请逐个输入系数……\n";
	for(int g=0;g<lie;g++)
	{
		cout <<"第" <<(g+1) <<"个:";
		cin >>a[ch-1][g];
	}
	
	
	cout <<"OK,第" <<ch <<"行修改完毕,请看方程组系数\n";
	print();
	return 1;
}

⌨️ 快捷键说明

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