📄 高斯-若当法矩阵求逆与矩阵行列式.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 + -