Những bài kiểu này thuộc môn chuyên ngành, mình đã nói rồi nếu bạn muốn học, muốn biết thì bạn phải đọc sách, tìm hiểu các giáo trình... có rất nhiều thuật toán tính ma trận nghịch đảo như Gauss, Cholesky... nó thuộc về bộ môn giải tích số. Vậy để hiểu về thuật toán tìm cuốn "Giáo trình giải tích số" (của tác giả nào cũng được - có thể dùng quyển của Phạm Kỳ Anh - ĐHQGHN), chứ trình bày cả cái thuật toán lên đây thì loằng ngoằng với lại ai có thời gian viết như vậy cho bạn.
Mình code lại hoàn chỉnh thuật toán tìm ma trận nghịch đảo trên bằng stand C, chạy ổn rồi đấy, bạn cứ xem kỹ nó đi :
PHP Code:
#include <stdio.h>
#include <conio.h>
#include <malloc.h>
#include <stdlib.h>
#define N 4
void main()
{
int i,j,k;
double Sum,m;
double **A, **B, **X;
//
A = (double**) malloc( (N+1)*sizeof(double*));
B = (double**) malloc( (N+1)*sizeof(double*));
X = (double**) malloc( (N+1)*sizeof(double*));
for (i=1;i<=N;i++)
{
A***91;i***93; = (double*) malloc( (N+1)*sizeof(double));
B***91;i***93; = (double*) malloc( (N+1)*sizeof(double));
X***91;i***93; = (double*) malloc( (N+1)*sizeof(double));
}
// Input value for matrix A and B where B is unit matrix
for (i = 1;i <= N; i++)
for (j = 1;j <= N; j++)
{
printf("A***91;%d***93;***91;%d***93; = ",i,j);
scanf("%f",&A***91;i***93;***91;j***93;);
if (i == j)
B***91;i***93;***91;j***93; = 1;
else
B***91;i***93;***91;j***93; = 0;
}
// row operations
// Start algorithm
for (k = 1;k <= N-1; k++)
for (i = k+1;i <= N; i++)
{
m = A***91;i***93;***91;k***93; / A***91;k***93;***91;k***93;;
for (j = 1;j <= N; j++)
{
A***91;i***93;***91;j***93; -= m*A***91;k***93;***91;j***93;;
B***91;i***93;***91;j***93; -= m*B***91;k***93;***91;j***93;;
}
}
// backward substitutions
for (i = N;i >= 1; i--)
for (j = 1;j <= N; j++)
{
Sum = 0;
X***91;i***93;***91;j***93; = 0;
for (k = i+1;k <= N; k++) Sum += A***91;i***93;***91;k***93;*X***91;k***93;***91;j***93;;
X***91;i***93;***91;j***93; = (B***91;i***93;***91;j***93; - Sum) / A***91;i***93;***91;i***93;;
}
// End of the algorithm !!!!
// Print out the resul, you can do anything you want here !
for (i = 1;i <= N; i++)
{
for (j = 1;j <= N; j++) printf("%f\t",X***91;i***93;***91;j***93;);
printf("\n");
}
// free memory
for (i=1;i<=N;i++)
{
free(A***91;i***93;);
free(B***91;i***93;);
free(X***91;i***93;);
}
free(A);
free(B);
free(X);
getch();
}
Bookmarks