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

Chương trình C ++ để thực hiện phân rã LU của bất kỳ ma trận nào


Phép phân rã LU của ma trận tạo ra ma trận là tích của ma trận tam giác dưới và ma trận tam giác trên. LU trong LU Phân rã của ma trận là viết tắt của Lower Upper.

Dưới đây là một ví dụ về LU Phân rã ma trận -

Given matrix is:
1 1 0
2 1 3
3 1 1
The L matrix is:
1 0 0
2 -1 0
3 -2 -5
The U matrix is:
1 1 0
0 1 -3
0 0 1

Một chương trình thực hiện phân rã LU của ma trận được đưa ra dưới đây -

Ví dụ

#include<iostream>
using namespace std;
void LUdecomposition(float a[10][10], float l[10][10], float u[10][10], int n) {
   int i = 0, j = 0, k = 0;
   for (i = 0; i < n; i++) {
      for (j = 0; j < n; j++) {
         if (j < i)
         l[j][i] = 0;
         else {
            l[j][i] = a[j][i];
            for (k = 0; k < i; k++) {
               l[j][i] = l[j][i] - l[j][k] * u[k][i];
            }
         }
      }
      for (j = 0; j < n; j++) {
         if (j < i)
         u[i][j] = 0;
         else if (j == i)
         u[i][j] = 1;
         else {
            u[i][j] = a[i][j] / l[i][i];
            for (k = 0; k < i; k++) {
               u[i][j] = u[i][j] - ((l[i][k] * u[k][j]) / l[i][i]);
            }
         }
      }
   }
}
int main() {
   float a[10][10], l[10][10], u[10][10];
   int n = 0, i = 0, j = 0;

   cout << "Enter size of square matrix : "<<endl;
   cin >> n;

   cout<<"Enter matrix values: "<endl;
   for (i = 0; i < n; i++)
   for (j = 0; j < n; j++)
   cin >> a[i][j];
   LUdecomposition(a, l, u, n);
   cout << "L Decomposition is as follows..."<<endl;
   for (i = 0; i < n; i++) {
      for (j = 0; j < n; j++) {
         cout<<l[i][j]<<" ";
      }
      cout << endl;
   }
   cout << "U Decomposition is as follows..."<<endl;
   for (i = 0; i < n; i++) {
      for (j = 0; j < n; j++) {
         cout<<u[i][j]<<" ";
      }
      cout << endl;
   }
   return 0;
}

Đầu ra

Kết quả của chương trình trên như sau

Enter size of square matrix : 3
Enter matrix values:
1 1 0
2 1 3
3 1 1
L Decomposition is as follows...
1 0 0
2 -1 0
3 -2 -5
U Decomposition is as follows...
1 1 0
0 1 -3
0 0 1

Trong chương trình trên, phân rã hàm LU tìm các phân rã L và U của các ma trận đã cho. Điều này được thực hiện bằng cách sử dụng các vòng lặp for lồng nhau để tính toán phân tách L và U và lưu trữ chúng trong ma trận l [] [] và u [] [] từ ma trận a [] [].

Đoạn mã chứng minh điều này được đưa ra như sau -

for (i = 0; i < n; i++) {
   for (j = 0; j < n; j++) {
      if (j < i)
      l[j][i] = 0;
      else {
         l[j][i] = a[j][i];
         for (k = 0; k < i; k++) {
            l[j][i] = l[j][i] - l[j][k] * u[k][i];
         }
      }
   }
   for (j = 0; j < n; j++) {
      if (j < i)
      u[i][j] = 0;
      else if (j == i)
      u[i][j] = 1;
      else {
         u[i][j] = a[i][j] / l[i][i];
         for (k = 0; k < i; k++) {
            u[i][j] = u[i][j] - ((l[i][k] * u[k][j]) / l[i][i]);
         }  
      }
   }
}

Trong hàm main (), kích thước của ma trận và các phần tử của nó được lấy từ người dùng. Điều này được đưa ra như sau -

cout << "Enter size of square matrix : "<<endl;
cin >> n;
cout<<"Enter matrix values: "<endl;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
cin >> a[i][j];

Sau đó, hàm phân rã LU được gọi và hiển thị phân tách L và U. Điều này được đưa ra bên dưới -

LUdecomposition(a, l, u, n);
cout << "L Decomposition is as follows..."<<endl;
for (i = 0; i < n; i++) {
   for (j = 0; j < n; j++) {
      cout<<l[i][j]<<" ";
   }
   cout << endl;
}
cout << "U Decomposition is as follows..."<<endl;
for (i = 0; i < n; i++) {
   for (j = 0; j < n; j++) {
      cout<u[i][j]<<" ";
   }
   cout << endl;
}