Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 가우스 조던 방법을 사용하여 역행렬 찾기

<시간/>

이 문제에서는 2D 행렬 mat[][]가 주어집니다. 우리의 임무는 가우스 조던 방법을 사용하여 역행렬을 찾는 것입니다. .

이제 문제의 기본 사항을 이해하겠습니다.

매트릭스 숫자의 2차원 배열입니다.

$\begin{bmatrix}2&5&4 \\1&6&7 \\9&3&8\end{bmatrix}$

행렬의 역행렬 [A-1] -

정방행렬에서 수행되는 연산입니다. 다음은 역행렬을 갖는 행렬에 필요한 속성입니다 -

  • 초기 행렬은 정방 행렬이어야 합니다.

  • 비특이 행렬이어야 합니다.

  • 행렬 A에 대해 I가 존재하는 단위 행렬은 다음과 같습니다.

$$AA^{-1} =A^{-1}.A =I$$

그것들은 주어진 행렬의 역수를 찾는 데 사용할 수 있는 공식입니다. 입니다

$A^{-1}\:=\:\left(\frac{adj(A)}{\det(A)}\right)$

adj(A)는 행렬 A의 인접입니다.

det(A)는 행렬 A의 행렬식입니다.

그것들은 우리가 행렬의 역행렬을 찾을 수 있는 여러 가지 방법입니다. 이 기사에서는 Gauss Jordan Method에 대해 알아볼 것입니다. 이는 기본 행 연산이라고도 합니다. .

역행렬을 찾는 단계별 방법입니다. 다음은 관련된 단계입니다. -

  • 단위 행렬을 사용하여 증강 행렬 찾기.

  • 1단계에서 찾은 증분행렬에 대해 행 축소 연산을 수행하여 행렬의 사다리꼴 형태를 찾습니다.

  • 이 과정에서 증강 행렬에 대해 수행할 수 있는 몇 가지 작업은 다음과 같습니다.

    • 행 교환 (두 행을 교환할 수 있음)

    • 곱하기 (행의 각 요소에는 0이 아닌 상수 값을 곱할 수 있습니다.)

    • 행 교환(행의 합과 행렬의 다른 행의 상수 배수로 행 바꾸기).

예시

솔루션 작동을 설명하는 프로그램

#include <iostream>
#include <vector>
using namespace std;
void printMatrixValues(float** arr, int n, int m){
   for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
         cout<<arr[i][j]<<"\t";
      }
      cout<<endl;
   }
   return;
}
void printInverseMatrix(float** arr, int n, int m){
   for (int i = 0; i < n; i++) {
      for (int j = n; j < m; j++) {
         printf("%.3f\t", arr[i][j]);
      }
      cout<<endl;
   }
   return;
}
void findInvMatGaussJordan(float** mat, int order){
   float temp;
   printf("The inverse of matrix : A = \n");
   printMatrixValues(mat, order, order);
   for (int i = 0; i < order; i++) {
      for (int j = 0; j < 2 * order; j++) {
         if (j == (i + order))
            mat[i][j] = 1;
      }
   }
   for (int i = order - 1; i > 0; i--) {
      if (mat[i - 1][0] < mat[i][0]) {
         float* temp = mat[i];
         mat[i] = mat[i - 1];
         mat[i - 1] = temp;
      }
   }
   for (int i = 0; i < order; i++) {
      for (int j = 0; j < order; j++) {
         if (j != i) {
            temp = mat[j][i] / mat[i][i];
            for (int k = 0; k < 2 * order; k++) {
               mat[j][k] -= mat[i][k] * temp;
            }
         }
      }
   }
   for (int i = 0; i < order; i++) {
      temp = mat[i][i];
      for (int j = 0; j < 2 * order; j++) {
         mat[i][j] = mat[i][j] / temp;
      }
   }
   cout<<"A' =\n";
   printInverseMatrix(mat, order, 2 * order);
   return;
}
int main(){
   int order = 3;
   float** mat = new float*[20];
   for (int i = 0; i < 20; i++)
   mat[i] = new float[20];
   mat[0][0] = 6; mat[0][1] = 9; mat[0][2] = 5;
   mat[1][0] = 8; mat[1][1] = 3; mat[1][2] = 2;
   mat[2][0] = 1; mat[2][1] = 4; mat[2][2] = 7;
   findInvMatGaussJordan(mat, order);
   return 0;
}

출력

The inverse of matrix : A =
6 9 5
8 3 2
1 4 7
A' =
-0.049  0.163  -0.011
0.205  -0.141  -0.106
-0.110  0.057  0.205