leq.c

来自「单片机程序设计基础 随书光盘」· C语言 代码 · 共 58 行

C
58
字号
//解线性方程组的主元消去法(有回代过程)。
// 5阶线性方程组如下:
//	3x+2y   + w-2t=-3
//	 x- y+2z+3w+5t= 5
//	   3y   +2w+ t=-6
//	-x   + z+ w   =-1
//	4x+ y+2z- w- t= 8

#define N  5   	//线性方程组的阶数
float A[N][N+1]={{3,2,0,1,-2,-3},{1,-1,2,3,5,5},{0,3,0,2,1,-6},
		{-1,0,1,1,0,-1},{4,1,2,-1,-1,8}} ;	//5阶线性方程组的增广系数矩阵
float X[N];	//5阶线性方程组的解:X=1.0,Y=-1.0,z=2.0,w=-2.0,t=1.0

void findmain (int i)////寻找第i列的主元,并将其所在行交换到当前处理行位置上
{
	int j,k;
	float c;
	c=A[i][i];k=i;//初始化主元在第i行
	for (j=i+1;j<N;j++)	//在第i行以下寻找主元所在行
		if (A[j][i]>c) {c=A[j][i];k=j;}
	if (k!=i) for (j=0;j<=N;j++) //将主元所在行交换到当前处理行位置上
		{c=A[k][j];A[k][j]=A[i][j];A[i][j]=c;}
}

void divmain (int i)//将主元所在行的各个系数除以主元,使主元为1
{
	int j;
	float c;
	c=A[i][i];
	A[i][i]=1.0;
	for (j=i+1;j<=N;j++) A[i][j]/=c;
}

void del (int i) //进行第i列的消元处理
{
	int j,k;
	float c;
	for (j=i+1;j<N;j++) if (A[j][i]) {//从i+1行开始进行消元处理
		c=A[j][i];A[j][i]=0;
		for (k=i+1;k<=N;k++) A[j][k] -= c*A[i][k];
		}
}

main ( )
{
	int i,j;
	for (i=0;i<N;i++) { //按行处理
		if (i<N-1) findmain (i);//寻找主元,并将其所在行交换到当前处理行位置上
		divmain (i) ; 	//将当前处理行的各个系数除以主元,使主元为1
		if (i<N-1) del (i); 	//进行消元处理
		}
	for (i=N-2;i>=0;i--)  //回代过程
		for (j=N-1;j>i;j--) A[i][N] -= A[i][j]*A[j][N];
	for (i=0;i<N;i++) X[i]=A[i][N];	//保存n阶线性方程组的解	
	while (1) ; //在这一行设置断点,中止程序运行,以便观察程序运行的结果 
}

⌨️ 快捷键说明

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