Computer >> Máy Tính >  >> Lập trình >> C ++

Tìm nghịch đảo của ma trận bằng phương pháp Gauss Jordan trong C ++

Trong bài toán này, chúng ta được đưa ra một ma trận 2D [] []. Nhiệm vụ của chúng tôi là tìm nghịch đảo của ma trận bằng phương pháp Gauss Jordan .

Bây giờ, hãy hiểu những điều cơ bản của vấn đề,

MATRIX là một mảng số hai chiều.

Ví dụ

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

Nghịch đảo của ma trận [A-1] -

Nó là một phép toán được thực hiện trên ma trận vuông. Sau đây là các thuộc tính bắt buộc để ma trận có nghịch đảo -

  • Ma trận ban đầu phải là ma trận vuông.

  • Nó phải là ma trận không phải số ít.

  • Tôi tồn tại một ma trận nhận dạng cho ma trận A sao cho,

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

Công thức của chúng là một công thức có thể được sử dụng để tìm nghịch đảo của ma trận kiến ​​đã cho. Đó là

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

adj (A) là phụ thuộc của ma trận A

det (A) là định thức của ma trận A.

Chúng có nhiều cách sử dụng với chúng ta có thể tìm ra nghịch đảo của ma trận. Trong bài viết này, chúng ta sẽ tìm hiểu về Phương pháp Gauss Jordan còn được gọi là Phép toán hàng chính .

Đây là một phương pháp từng bước để tìm nghịch đảo của ma trận, Dưới đây là các bước liên quan -

  • Tìm ma trận tăng cường bằng ma trận nhận dạng.

  • Tìm dạng cấp bậc của ma trận bằng cách thực hiện thao tác giảm hàng trên ma trận tăng cường được tìm thấy ở bước 1.

  • Một số hoạt động có thể được thực hiện trên ma trận tăng cường trong quá trình này là

    • Thay đổi hàng (bạn có thể hoán đổi hai hàng bất kỳ)

    • Phép nhân (mỗi phần tử của hàng có thể được nhân với một giá trị không đổi khác 0).

    • Trao đổi hàng (thay thế hàng bằng tổng của hàng và bội số không đổi của một hàng khác của ma trận).

Ví dụ

Chương trình minh họa hoạt động của giải pháp của chúng tôi

#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;
}

Đầu ra

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