?? 高斯-若當法矩陣求逆與矩陣行列式.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 + -