# Đề tài: Tìm Định thức và ma trận nghịch đảo

1. Thành viên mới
Ngày gia nhập
11 2012
Bài viết
2

## Tìm Định thức và ma trận nghịch đảo

// De 33 Tao,Xuat ma tran, Ma tran:Chuyen vi,Nghich dao!
#include<iostream.h>
#include<iomanip.h>
#include<conio.h>
//using namespace std;
int M[50][50], N[50][50];
void Tao(int A[50][50],int n)
{

for (int i=0;i<n;i++)
for (int j=0;j<n;j++)
{
cout<<"\n A["<<i<<","<<j<<"]=";
cin>>A[i][j];
}
}

void Xuat(int B[50][50],int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
cout<<"\t"<<B[i][j];
cout<<"\n";
}
}
//Tim dinh thuc
void Dinhthuc(int C[50][50],int n)
{
double det=1;
double temp;
int i,j,k,sign=1;
for (i=0;i<n-1;i++)
{
if(C[i][i]==0) //Duong cheo chinh bang 0
{
k=i+1;
while(k<n&&C[k][i]==0)
k++;
if(k==n)
{
cout<<"\nDet(A) = 0";
break;
}
for (j=i;j<n;j++)
{
temp=C[i][j];
C[i][j]=C[k][j];
C[k][j]=temp;
}
sign=-sign;//Dinh thuc doi dau
}
for (j=i+1;j<n;j++)
{
temp = -C[j][i]/C[i][i];
for (k=i+1;k<n;k++)
C[j][k]+=temp*C[i][k];
}
det*=C[i][i];
cout<<" ";
}
det*=C[n-1][n-1];
cout<<"\nDet(A) ="<<det;
cout<<"\n";
}
//Tinh ma tran nguoc
void Nghichdao(int D[50][50],int E[50][50],int n)
{
int k;
double temp,det;
if (det!= 0)
{
for (int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(i==j)
E[i][j] = 1;
else
E[i][j] = 0;

for (i=0;i<n;i++)
{
if (D[i][i]==0)
{
k=i+1;
while (k<n&&D[k][i]==0)
k++;
for (j= 0;j<n;j++)
{
temp=D[i][j];
D[i][j]=D[k][j];
D[k][j]=temp;
temp=E[i][j];
E[i][j]=E[k][j];
E[k][j]=temp;
}
}

temp=D[i][i];
for (j=i;j<n;j++)
D[i][j]/=temp;
for (j=0;j<n;j++)
E[i][j]/=temp;

for (j=i+1;j<n;j++)
{
temp=-D[j][i];
for (k=i;k<n;k++)
D[j][k]+=temp*D[i][k];
for (k=0;k<n;k++)
E[j][k]+=temp*E[i][k];
}
}
//Kt qt guess
for (i=n-1;i>0;i--) // Qt Jordan
for (j=i-1;j>=0;j--)
{
temp=-D[j][i];
for(k=n-1;k>=i;k--)
D[j][k]+=temp*D[i][k];
for (k=0;k<n;k++)
E[j][k]+=temp*E[i][k];
}

for (i=0;i<n;i++)
{
for(j=0;j<n;j++)
cout<<""<<"\t"<<E[i][j];
cout<<"\n";
}
}
else cout<<"\nKhong co ma tran nghich dao\n";
}
void Chuyenvi(int T[50][50],int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)

cout<<"\t"<<T[j][i];
cout<<"\n";
}
}

void main()
{
clrscr();
int n;
cout<<"De 33:Tim ma tran chuyen vi, nghich dao!";
cout<<"\nCap cua ma tran vuong:=";cin>>n;
Tao(M,n);
cout<<"\nMa tran vua tao la: \n";
Xuat(M,n);
cout<<"Ma tran chuyen vi cua A[] la:\n";
Chuyenvi(M,n);
cout<<"Dinh thuc ma tran A[] la:";
Dinhthuc(M,n);
cout<<"Ma tran nghich dao cua A[] la :\n";
Nghichdao(M,N,n);
getch();
}
Đây là chương trình của e xin mọi ngừơi giúp cho

2. Thành viên mới
Ngày gia nhập
12 2013
Bài viết
1

## code có vấn đề

Nguyên bản được gửi bởi conrongchautien
Bài hoàn chỉnh đây:
C Code:
1. /* DINH THUC VA MA TRAN NGHICH DAO */
2.
3. #include<stdio.h>
4. #include<conio.h>
5.
6. void main()
7. {
8. int i,j,k,m,n,na,dau=1;
9. double det,x,tam;
10. double a[50][50],b[50][50];
11. clrscr();
12. printf("\n CHAO MUNG DEN VOI CHUONG TRINH TINH DINH THUC VA MA TRAN NGHICH DAO");
13. printf("\n");
14. printf("\n NHAP CAP MA TRAN:"); scanf("%d",&n);
15. na=2*n;//so cot ma tran chuyen tiep.
16. //Nhap ma tran A.-------------------------------
17. for(i=0;i<n;i++)
18.     for(j=0;j<n;j++)
19.         {
20.         printf("a[%d][%d]=",i+1,j+1);
21.         scanf("%lf",&a[i][j]);
22.         }
23.
24. //Tao ma tran lien ket.---------------------------
25. for(i=0;i<n;i++)
26.     for(j=n;j<na;j++)
27.         {
28.         if(i==(j-n)) a[i][j]=1;
29.         else a[i][j]=0;
30.         }
31.
32. //Ham giai phuong trinh.--------------------
33. //Dung phep BDSC dua Aij ve ma tran cheo.
34. for(j=0;j<n;j++)
35.     {
36.     for(i=n-1;i>=j;i--)
37.         {
38.         if(a[i][j]==0) continue;//Neu phan tu a bang 0 thi tang i.
39.         if((i>j)&&(a[i][j]!=0))
40.             {
41.             k=i-1;
42.             while((k>=j)&&(a[k][j]==0)) k--;//Xet cac phan tu a khac 0 tren cung cot j
43.             if(k<j)
44.                 {
45.                 //Doi cho dong thu i va j cho ca ma tran mo rong.
46.                 for(m=0;m<na;m++)
47.                     {
48.                     tam=a[i][m];
49.                     a[i][m]=a[j][m];
50.                     a[j][m]=tam;
51.                     }
52.                 dau=-dau;
53.                 }
54.             if((k>=j)&&(k>=0))
55.                 {
56.                 x=-a[i][j]/a[k][j];
57.                 //Nhan dong thu k cho x roi cong vao dong thu i.
58.                 for(m=0;m<na;m++)
59.                     a[i][m]+=a[k][m]*x;
60.                 }
61.             }
62.         }
63.     }
64. for(j=n-1;j>=0;j--)
65.     {
66.     for(i=0;i<=j;i++)
67.         {
68.         if(a[i][j]==0) continue;
69.         if((i<j)&&(a[i][j]!=0))
70.             {
71.             k=i+1;
72.             while((k<=j)&&(a[k][j]==0)) k++;
73.             if((k<=j)&&(k<na))
74.                 {
75.                 x=-a[i][j]/a[k][j];
76.                 //Nhan dong thu k voi x roi cong vao dong thu i.
77.                 for(m=0;m<na;m++)
78.                     a[i][m]+=a[k][m]*x;
79.                 }
80.             }
81.         }
82.     }
83. //Tinh dinh thuc.------------------------------------
84. det=1;
85. for(i=0;i<n;i++)
86.     for(j=0;j<n;j++)
87.         if(i==j) det*=a[i][j];
88. printf("\n Det=%5.2lf",det*dau);
89. //Tinh ma tran nghich dao.-----------------------
90. if(det!=0)
91.     {
92.     for(i=0;i<n;i++)
93.         for(j=n;j<na;j++)
94.             {
95.             a[i][j]=a[i][j]/a[i][i];
96.             }
97.
98.     for(i=0;i<n;i++)
99.         for(j=n;j<na;j++)
100.             {
101.             b[i][j-n]=a[i][j];
102.             }
103.     //In ra ma tran nghich dao.-----------------
104.     printf("\n MA TRAN NGHICH DAO CUA A:\n");
105.     for(i=0;i<n;i++)
106.         {
107.         for(j=0;j<n;j++)
108.             printf("%5.1lf",b[i][j]);
109.         printf("\n");
110.         }
111.     }
112. else printf("\n KHONG CO MA TRAN NGHICH DAO.");
113. printf("\n GOOBYE.CHUC MOI NGUOI VUI VE!");
114. getch();
115. }
116. //6:01 PM 4/22/2010
Cám ơn thầy onminh rất nhiều.
Mình nhập vào ma trận
3 4 6
-5 2 16
2 1 -1
nó xuất ra det=0 mà lại xuất ra ma trận nghịch đảo với các dạng mặc định của kiểu

3. Thành viên mới
Ngày gia nhập
08 2022
Bài viết
1

## cái này chỉ áp dụng cho ma trận vuôg thôi chứ còn ma trận có độ dài cột hàng khác nhau thì làm sao bn

[QUOTE=onminh;129098]Đây, nếu code trực tiếp thì dài dòng và khó hiểu hơn đó, chịu khó đọc nhé. Tính det theo Gauss, còn ma trận nghịch đảo theo Gauss-Jordan đó.
[code= c++]
#include<stdio.h>
#include<conio.h>

void main()
{
int i,j,k,n, sign = 1;
double det = 1; double temp;
double a[10][10],b[10][10];
// Nhap cap cua ma tran:
printf("\nCap cua ma tran vuon, n = "); scanf("%d",&n);

// Nhap ma tran a:
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
{
printf("a[%d][%d] = ", i, j);
scanf("%lf",&a[i][j]);
}

// Tinh dinh thuc cua a
for (i = 0; i < n-1; i++)
{
if (a[i][i] == 0) // Nếu gặp phần tử trên đường chéo chính bằng 0 thì tìm hàng khác để đổi
{
k = i+1;
while (k < n && a[k][i] == 0) k++;
if (k==n) { printf("\ndet(a) = 0"); break;} // Không timg thấy, tức det(a) = 0
for (j = i; j < n; j++)// Đổi hàng i với hàng k
{
temp = a[i][j];
a[i][j] = a[k][j];
a[k][j] = temp;
}
sign = -sign; // Định thức đổi dấu đó
}
for (j = i+1; j < n; j++)// Biển đổi để các phần tử cùng cột ở hàng dưới bằng 0 đó
{
temp = -a[j][i]/a[i][i];
for (k = i+1; k < n; k++) a[j][k] += temp*a[i][k]; // Nhân hàng i với (-a[j][i]/a[i][i]) rồi cộng vào hàng j
}
det *= a[i][i]; // Tính dần det(a)
}

det *= a[n-1][n-1]; // Nhân với phần tử cuối chéo chính nữa là xong
printf("\ndet(a) = %lf\n",det);

//Tinh ma tran nguoc
if (det != 0)
{
for (i = 0; i < n; i++) // Tạo ra b là ma trận đơn vị đó
for (j = 0; j < n; j++)
if (i==j) b[i][j] = 1; else b[i][j] = 0;

for (i = 0; i < n; i++) // Xử lý từ hàng đầu đến hàng cuối
{
if (a[i][i] == 0) // Nếu gặp phần tử trên đường chéo chính bằng 0 thì đổi hàng
{
k = i+1;
while (k < n && a[k][i] == 0) k++;
for (j = 0; j < n; j++) // Đổi hàng đó của a đó, cả với ma trận b nữa
{
temp = a[i][j];
a[i][j] = a[k][j];
a[k][j] = temp;
temp = b[i][j];
b[i][j] = b[k][j];
b[k][j] = temp;
}
}

temp = a[i][i];
for (j = i; j < n; j++) a[i][j] /= temp;
for (j = 0; j < n; j++) b[i][j] /= temp;

for (j = i+1; j < n; j++)
{
temp = -a[j][i];
for (k = i; k < n; k++) a[j][k] += temp*a[i][k];
for (k = 0; k < n; k++) b[j][k] += temp*b[i][k];
}
}// Kết thúc quá trình Gauss

for (i = n-1; i > 0; i--) // Bắt đầu quá trình Jordan
for (j = i-1; j >=0; j--)
{
temp = -a[j][i];
for (k = n-1; k >= i; k--) a[j][k] += temp*a[i][k];
for (k = 0; k < n; k++) b[j][k] += temp*b[i][k];
}

for (i = 0; i < n; i++)// In ra ma trận b, bây giờ là ma trận nghich đảo của a
{
for (j = 0; j < n; j++) printf("%8.3lf\t", b[i][j]);
printf("\n");
}
}
else printf("\nKhong co ma tran nghich dao\n");
getch();

Trang 4 trên tổng số 4 Đầu tiên ... 234

#### Quyền hạn của bạn

• Bạn không thể gửi đề tài mới
• Bạn không thể gửi bài trả lời
• Bạn không thể gửi các đính kèm
• Bạn không thể chỉnh sửa bài viết của bạn