Code C/C++: Thuật toán phân rã ma trận A = LU

Người đăng: culaoxanh88 on Thứ Hai, 16 tháng 6, 2014

Quá trình chuyển hoá ma trận  A ban đầu thành tích hai ma trận tam giác L.U dựa vào phép khử Gauss được thực hiện bằng các phép nhân ma trận. Thuật toán này được gọi là thuật toán Crout. Quá trình Crout bao gồm nhiều bước hồi quy. Nếu ma trận  A có cấp  n x n, ta cần n-1 bước. Thuật toán được thể hiện cụ thể như sau:
Thông qua  n-1 bước hồi quy ta được  A=L.U. Với L là ma trận tam giác dưới và U là ma trận tam giác trên.
Cài đặt chương trình:
#include <conio.h>
#include <iostream>
#define max 100
using namespace std;
void Nhap(float A[max][max],int n) {
for(int i = 0; i<n; i++)
for(int j = 0; j<n; j++) {
cout<<"a["<<i<<"]["<<j<<"] = ";
cin>>A[i][j]; 
}
}
void XuatMaTran(float A[max][max], int n) {
cout<<"\n";
for(int i=0 ; i<n; i++){
cout<<endl;
for(int j=0 ; j<n; j++)
cout<<A[i][j]<<"\t";
}
}
/* Phan ra A = LU */
void PhanRaLU(float A[max][max], float L[max][max], float U[max][max], int n) {
for(int k =0; k<n; k++) {
U[k][k] = A[k][k];
L[k][k] = 1;
for(int i=k+1; i<n; i++) {
L[i][k] = A[i][k]/U[k][k];
U[k][i] = A[k][i];
U[i][k] = 0;
L[k][i] = 0;
}
for(int i = k+1; i<n; i++)
for(int j = k+1; j<n; j++)
A[i][j] = A[i][j]-L[i][k]*U[k][j];
}
}
int main(){
int n;
float A[max][max],L[max][max],U[max][max];
cout<<"Nhap n = ";  cin>>n;
cout<<"Nhap ma tran A\n";
Nhap(A,n);
cout<<"Ma tran A vua nhap";
XuatMaTran(A,n);
PhanRaLU(A,L,U,n);
cout<<"\nMa tran L";
XuatMaTran(L,n);
cout<<"\nMa tran U";
XuatMaTran(U,n);
getch();
return 0;

Kết quả chạy chương trình:
Tag: C, C++, ma trận, A=LU, A=L*U, phân rã ma trận

{ 0 nhận xét... read them below or add one }

Đăng nhận xét