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

📄 高斯-若当法矩阵求逆与矩阵行列式.cpp

📁 该源代码用高斯-若当法矩阵求逆与矩阵行列式
💻 CPP
字号:
#include <iostream>
#include <cmath>
#define n 5
int main()
{
    float A[n][n]; 
    float E[n][n];
	float N[n][n];
	float H[n][n];
	int   i,j,a; //变量a用来记录交换行的次数用于计算行列式时的正负
	a = 0;
    float HANGLIESHI(float S[n][n],float N[n][n],int b);
    int QIUNIJUZHEN(float T[n][n],float R[n][n]);
	std::cout<< "********************************************" << std::endl <<std::endl;
	std::cout<< "班级:   ********一      班********" << std::endl;
	std::cout<< "姓名:   ********刘      军********" << std::endl;
	std::cout<< "学号:   ********2008201092********" << std::endl;
	std::cout<< "课题:   ***矩阵求逆和矩阵行列式***" << std::endl << std::endl;
	std::cout<< "********************************************" << std::endl << std::endl;
    std::cout<< "注:奇异矩阵没有逆矩阵只对其求行列式的值和列主元!" << std::endl << std::endl;
    std::cout<< "   非奇异矩阵对其求行列式的值和列主元以及逆矩阵!" << std::endl << std::endl;
    std::cout<< "********************************************" << std::endl << std::endl;
	std::cout<< "初始化矩阵A显示界面有限最好不要超过四阶:" << std::endl << std::endl;//初始化矩阵A
	std::cout << " ";
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			std::cin >> A[i][j];
			N[i][j] = A[i][j];
		}
		   
	}
		   
   	 std::cout<< std::endl << std::endl;	
     std::cout << "矩阵A为:" << std::endl << std::endl;
	 for(i=0;i<n;i++)
	 {
		 for(j=0;j<n;j++)
		 {
			 std::cout << " " << A[i][j] << "    ";
			 if(j>=n-1) 
				 std::cout << std::endl << std::endl;
		 }
	 }
	 std::cout << "初始化单位矩阵E为:" << std::endl << std::endl;

     for(i=0;i<n;i++)
	 {
		 for(j=0;j<n;j++)
		{
			if(i==j)
                E[i][j]=1.0;
			else
				E[i][j]=0.;
		   
		}
	 }
     
	 for(i=0;i<n;i++)
	 {
		 for(j=0;j<n;j++)
		 {
			 std::cout << " " << E[i][j] << "    ";
			 if(j>=n-1) std::cout << std::endl << std::endl;
		 }
	 }
	 
	 std::cout << "对矩阵A选列主元求得列主元矩阵为:" << std::endl << std::endl;
	 for(j=0; j<n; j++)//最外层循环列不变
	 {
		 for(i=j; i<n-1; i++)       //i+1不可以超过n-1
		 {
			 float k;
			 if(fabs(A[j][j]) < fabs(A[i+1][j]))//将第j列的绝对值最大的赋给A[j][j]
			 {
				 a++;             //记录行交换的次数
				 k=A[i+1][j];
				 A[i+1][j]=A[j][j];
				 A[j][j]=k;
				 for(int m=j+1; m<n; m++)
				 {
					 k=A[j][m];
					 A[j][m]=A[i+1][m];
					 A[i+1][m]=k;
					 
				 }
                 if(j>=1)                          //此时应交换J列之前的各个对应元素,该语句不应放在上一个FOR循环中!!!!!!
					 {
						 for(int t=j-1; t>=0; t--)
						 {
							 k=A[j][t];
							 A[j][t]=A[i+1][t];
							 A[i+1][t]=k;
						 }
					 }
				 for(int g=0; g<n; g++)             //单位矩阵对应列主元矩阵的行变换
				 {
					 k=E[j][g];
					 E[j][g]=E[i+1][g];
					 E[i+1][g]=k;
				 }
			 }
		 }
	 }
  
	 for(i=0;i<n;i++)//输出列主元矩阵A
	 {
		 for(j=0;j<n;j++)
		 {
			 H[i][j] = A[i][j];       //矩阵H存放列主元矩阵A的副本用来作为参数传递给求逆矩阵函数
			 std::cout << " " << A[i][j] << "    ";
			 if(j>=n-1) 
				 std::cout << std::endl << std::endl;
		 }
	 }
                                                  
	 std::cout << "输出列主元矩阵A与做相应变换后的单位矩阵E(A | E)为:" << std::endl << std::endl;
     for(i=0;i<n;i++)
	 {
		 for(j=0;j<n;j++)
		 {
			 std::cout << " " << A[i][j] << "    ";
			 if(j>=n-1)
			 {
				 std::cout << '|' << "    ";
				 
					 for(int k=0; k<n; k++)
					 {
			             std::cout << " " << E[i][k] << "    ";
			             if(k>=n-1) std::cout << std::endl << std::endl;
					 }
				 
			 }
				 
		 }
	 }
	float ppp;
    ppp=HANGLIESHI(A,N,a); //调用函数求矩阵的行列式的值
	if(ppp == 0)
	{
		std::cout<< std::endl;
		std::cout << "矩阵A为奇异矩阵没有逆矩阵!!!" << std::endl << std::endl;
		return 0;
	}
	else                                              
	{
		std::cout<< std::endl;
		std::cout << "用高斯-若当方法进行消元之后输出单位矩阵E和矩阵A的逆矩阵为:" << std::endl << std::endl;
        QIUNIJUZHEN(H,E);  
	}
	return 0;
}

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

float HANGLIESHI(float S[n][n],float N[n][n],int b)
{
	int i, j; 
    float	x;
	x = 1;
	for(i=0; i<b; i++)
	{
		x = (-1)*x;
	}
	std::cout << "原矩阵A为:" << std::endl << std::endl;
    for(i=0; i<n; i++)
		for(j=0; j<n; j++)
		{
			std::cout << " " << N[i][j] << "   ";
			if(j==n-1)
				std::cout<< std::endl;
		}
     
	for(i=0; i<n; i++)
		for(int t=i+1; t<n; t++)
			if(S[t][i]!=0)
			{
				if(S[i][i]!=0)
				{
					float y = S[t][i]/S[i][i];
			    	for(j=i; j<n; j++)
					{
				    	S[t][j] = S[t][j] - S[i][j]*y;
					}

				}
		    	else
				{
				    if(S[i][i]==0)
					{
						std::cout<< std::endl;
						std::cout << "矩阵A的行列式的值为:"  << std::endl << std::endl;
					    std::cout << " " << S[i][i] << std::endl;
					    return S[i][i];
					}
				}
			}
		std::cout<< std::endl;
        std::cout << "矩阵A的行列式的值为:" << std::endl << std::endl;
        float m=1;
		for(i=0; i<n; i++)
		{
			m = m*S[i][i];
		}
		if((-0.01 < m && m < 0) || (m >0 && m < 0.01) )
		{
			m = 0;
		}
		else
		{
			m = x*m;
		}	
		std::cout << " " << m << std::endl;
		return m;    
}

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

int QIUNIJUZHEN(float T[n][n],float R[n][n])
{
	int i, j;
    for(i=0; i<n;i++)            //主对角线上的元素做分母为外层循环
	 {
		 float q = T[i][i];     //备份A[i][i]
         for(j=i; j<n; j++)
		 {
			 T[i][j] = T[i][j]/q;//将矩阵A第i行的各个元素提出1/A[i][i]后A[i][i]元素化为1
		 }
		 for(j=0; j<n; j++)
		 {
			 R[i][j] = R[i][j]/q;//将矩阵E第i行的各个元素相应的提出1/A[i][i]做相应的变换
		 }
		 if(i < n-1)             //将矩阵A化为单位矩阵矩阵E相应的变换为矩阵A的逆矩阵
		 {
			 for(int t=i+1; t<n; t++)
			 {
				 if(T[t][i]!=0)
				 {
					 float b = T[t][i];
					 
					 for(j=i; j<n; j++)
					 {
						 T[t][j] = T[t][j]-b*T[i][j];
					 }
				     for(int m=0; m<n;m++)            
					 {
						 R[t][m] = R[t][m]-R[i][m]*b;
						      
					 }
				 }
					 
			 }
		 }
		 if(i >= 1)
		 {
			 for(int t=i-1; t>=0; t--)
			 {
				 
				 if(T[t][i]!=0)
				 {
					 float b = T[t][i];
					 
					 for(j=i; j<n; j++)
					 { 
					    T[t][j] = T[t][j]-T[i][j]*b;
					 }
					 for(int m=0; m<n;m++)
					 {
						 R[t][m] = R[t][m]-R[i][m]*b;
					 }
				}
						                
			 }
		 }
	  }
     for(i=0;i<n;i++)
	 {
		 for(j=0;j<n;j++)
		 {
			std::cout << " " << T[i][j] <<  "     ";
		    if(j>=n-1)
			 {
				 std::cout << '|' << "     ";
				 
					 for(int k=0; k<n; k++)
					 {
						 if(0 < R[i][k] && R[i][k] < 0.001 || 0 > R[i][k] && R[i][k] > -0.001)  //误差范围在0---0.001之间
						 {
							 R[i][k] = 0;
							 std::cout << " " << R[i][k] << "      ";
						 }
						 else
			                 std::cout << " " << R[i][k] << "      ";
			             if(k>=n-1) std::cout << std::endl << std::endl;
					 }
			}
		}
	 }
     std::cout << "输出矩阵A的逆矩阵为:" << std::endl << std::endl;
     for(i=0;i<n;i++)
	 {
		 for(j=0;j<n;j++)
		 {
			 std::cout << " " << R[i][j] << "        ";
			 if(j>=n-1) std::cout << std::endl << std::endl;
		 }
	 }
	 return 0;
}

⌨️ 快捷键说明

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