Trang 1 trên tổng số 4 123... Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 33 kết quả

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

  1. #1
    Ngày gia nhập
    04 2010
    Nơi ở
    Recycle Bin
    Bài viết
    358

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

    Mai nộp bài rồi. Ai bik chỉ em với....

    Ý tưởng của bài này:

    Bằng phép biến đổi sơ cấp:
    *Đổi chỗ 2 dòng.
    *Nhân x vào dòng i rồi cộng vào dòng (i+1).

    1.Tính định thức: biến đổi định thức về dạng tam giác rồi tính det. Khi đó detA=A11*A22*...*Ann (tích các phần tử trên đường chéo chính).

    2.Ma trận nghịch đảo:đưa ma trận chuyển tiếp (A/I) về dạng (I/B) thì B là ma trận nghịch đảo của A!!!

    Code nè anh em:


    PHP Code:
    /* DINH THUC VA MA TRAN NGHICH DAO */

    #include<stdio.h>
    #include<conio.h>

    void main()
    {
    int i,j,k,m,n,na;
    double det,x,tam;
    double a[10][10],b[10][10];
    clrscr();
    printf("\n CHAO MUNG DEN VOI CHUONG TRINH TINH DINH THUC VA MA TRAN NGHICH DAO");
    printf("\n");
    printf("\n NHAP CAP MA TRAN:"); scanf("%d",&n);
    na=2*n;//so cot ma tran chuyen tiep.
    //Nhap ma tran A.-----------------------------------------------------------
    for(i=0;i<n;i++)
        for(
    j=0;j<n;j++)
            {
            
    printf("\n a[%d][%d]=",i+1,j+1);
            
    scanf("%lf",&a[i][j]);
            }

    //Tao ma tran lien ket.-----------------------------------------------------
    for(i=0;i<n;i++)
        for(
    j=n;j<na;j++)
            {
            if(
    i==(j-n)) a[i][j]=1;
            else 
    a[i][j]=0;
            }

    //In ma tran chuyen tiep.----------------------------------------------------
    printf("\n MA TRAN MO RONG (A/I)\n");
    for(
    i=0;i<n;i++)
        {
        for(
    j=0;j<na;j++) printf("%5.1lf ",a[i][j]);
        
    printf("\n");
        }

    //Ham giai phuong trinh.------------------------------------------------------
    //Dung phep BDSC dua Aij ve ma tran cheo.
    for(j=0;j<n;j++)
        {
        for(
    i=n-1;i>=j;i--)
            {
            if(
    a[i][j]==0) continue;
            if((
    i>j)&&(a[i][j]!=0))
                {
                
    k=i-1;
                while((
    k>=j)&&(a[k][j]==0)) k--;
                if(
    k<j)
                    {
                    
    //Doi cho hang thu i va j.------------------------
                    
    for(m=0;m<na;m++)
                        {
                        
    tam=a[i][m];
                        
    a[i][m]=a[j][m];
                        
    a[j][m]=tam;
                        }
                    }
                if((
    k>=j)&&(k>=0))
                    {
                    
    x=-a[i][j]/a[k][j];
                    
    //Nhan dong thu (i-1) cho x roi cong vao dong thu i.
                    
    for(m=0;m<na;m++)
                        
    a[i][m]+=a[k][m]*x;
                    }
                }
            }
        }
    for(
    j=n-1;j>=0;j--)
        {
        for(
    i=0;i<=j;i++)
        if(
    a[i][j]==0) continue;
        if((
    i<j)&&(a[i][j]!=0))
            {
            
    k=i+1;
            while((
    k<=j)&&(a[k][j]==0)) k++;
            if((
    k<=j)&&(k<na))
                {
                
    x=-a[i][j]/a[k][j];
                
    //Nhan dong thu (i+1) voi x roi cong vao dong thu i.-------
                
    for(m=0;m<na;m++)
                    
    a[i][m]+=a[k][m]*x;
                }
            }
        }
    //Tinh dinh thuc.--------------------------------------------------------------------
    det=1;
    for(
    i=0;i<n;i++)
        for(
    j=0;j<n;j++)
            if(
    i==jdet*=a[i][j];
    printf("\n Det=%5.2lf",det);
    //Tinh ma tran nghich dao.-----------------------------------------------------------
    if(det!=0)
        {
        for(
    i=0;i<n;i++)
            for(
    j=n;j<na;j++)
                {
                
    a[i][j]=a[i][j]/a[i][i];
                }

        
    //In ma tran chuyen tiep.----------------------------------------------------
        
    printf("\n MA TRAN NGHICH DAO MO RONG\n");
        for(
    i=0;i<n;i++)
            {
            for(
    j=0;j<na;j++) printf("%5.1lf ",a[i][j]);
                
    printf("\n");
            }
        for(
    i=0;i<n;i++)
            for(
    j=n;j<na;j++)
                {
                
    b[i][j-n]=a[i][j];
                }
        
    //In ra ma tran nghich dao.---------------------------------------------------
        
    printf("\n MA TRAN NGHICH DAO CUA A:\n");
        for(
    i=0;i<n;i++)
            {
            for(
    j=0;j<n;j++)
                
    printf("%5.1lf",b[i][j]);
            
    printf("\n");
            }
        }
    else 
    printf("\n KHONG CO MA TRAN NGHICH DAO.");
    printf("\n GOOBYE.CHUC MOI NGUOI VUI VE!");
    getch();
    }
    //6:43 PM 4/18/2010 
    Tính định thức thì good rồi...
    Nhưng tính ma trận nghịch đảo lại sai!!! pro nào chỉnh lỗi dùm cái. Thuật toán hoàn toàn chính xác nhưng không hiểu sao kết quả lại sai nữa .
    Cám ơn mọi ý kiến giúp đỡ và đóng góp.
    Đã được chỉnh sửa lần cuối bởi conrongchautien : 20-04-2010 lúc 12:05 AM.

  2. #2
    Ngày gia nhập
    09 2009
    Nơi ở
    205Bee
    Bài viết
    231

    C++ Code:
    1. #include<iostream>
    2.  
    3. const int MAX = 100;
    4. using namespace std;
    5.  
    6. void readMatrix(int a[][MAX], int n);
    7. void displayMatrix(int a[][MAX], int n);
    8. int detMatrix(int a[][MAX], int n);
    9. void newMatrix(int a[][MAX], int b[][MAX], int x, int y, int n);
    10.  
    11. int main()
    12. {
    13.     int a[MAX][MAX], b[MAX][MAX];
    14.     int n, det;
    15.     cin >> n;
    16.     readMatrix(a, n);
    17.     cout << detMatrix(a, n);
    18.     system("pause");
    19. }
    20.  
    21. // đọc ma trận
    22. void readMatrix(int a[][MAX], int n)
    23. {
    24.     for (int i = 1; i <= n; i++)
    25.         for (int j = 1; j <= n; j++)
    26.         {
    27.             cout << "a[" << i << "][" << j << "] = ";
    28.             cin >> a[i][j];
    29.         }
    30. }
    31.  
    32. // xuất ma trận
    33. void displayMatrix(int a[][MAX], int n)
    34. {
    35.     for (int i = 1; i <= n; i++)
    36.     {
    37.         for (int j = 1; j <= n; j++)
    38.             cout << a[i][j] << ' ';
    39.         cout << endl;
    40.     }
    41. }
    42.  
    43. // tính (-1)^n
    44. int pow(int n)
    45. {
    46.     if (n%2==0)
    47.         return 1;
    48.     return -1;    
    49. }
    50.  
    51. // tính định thức
    52. int detMatrix(int a[][MAX], int n)
    53. {
    54.     int i, j, det = 0, b[MAX][MAX];
    55.     if (n == 1)
    56.         return a[1][1];
    57.     else
    58.         for (j = 1; j <= n; j++)
    59.         {
    60.             newMatrix(a, b, 1, j, n);
    61.             det+=a[1][j]*pow(1+j)*detMatrix(b, n - 1);
    62.         }
    63.     return det;
    64. }
    65.  
    66. // Ma trận con
    67. void newMatrix(int a[][MAX], int b[][MAX], int x, int y, int n)
    68. {  
    69.     int i, j;
    70.     for (i = 1; i <= n; i++)
    71.         for (j = 1; j <= n; j++)
    72.             b[i][j] = a[i][j];
    73.     for (i = x; i < n; i++)
    74.         for (j = 1; j <= n; j++)
    75.             b[i][j] = b[i+1][j];
    76.     for (j = y; j < n; j++)
    77.         for (i = 1; i <n; i++)
    78.             b[i][j] = b[i][j+1];        
    79. }
    đây là code đệ quy đầu tay của em. Còn ma trận nghịch đảo thì vẫn chưa làm. Chắc là sẽ dài đây.

  3. #3
    Ngày gia nhập
    04 2010
    Nơi ở
    Recycle Bin
    Bài viết
    358

    đây là code đệ quy đầu tay của em. Còn ma trận nghịch đảo thì vẫn chưa làm. Chắc là sẽ dài đây.
    Làm ơn đi. Chỉ mình sửa lại bài trên kia thôi. Mình mới học C mà. Chưa học hàm và con trỏ!
    Dù sao cũng cám ơn pạn!

  4. #4
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,007

    thảo nào mà ko thích đệ quy, langman giúp các bạn khác xong sẽ check cho bạn
    ^_,^

    Facebook : https://www.facebook.com/langmaninternet

    Bùi Tấn Quang

  5. #5
    Ngày gia nhập
    09 2009
    Bài viết
    240

    Trích dẫn Nguyên bản được gửi bởi conrongchautien Xem bài viết
    Làm ơn đi. Chỉ mình sửa lại bài trên kia thôi. Mình mới học C mà. Chưa học hàm và con trỏ!
    Dù sao cũng cám ơn pạn!
    Đâ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 đó.
    C++ Code:
    1. #include<stdio.h>
    2. #include<conio.h>
    3.  
    4. void main()
    5. {
    6.     int i,j,k,n, sign = 1;
    7.     double det = 1; double temp;
    8.     double a[10][10],b[10][10];
    9. // Nhap cap cua ma tran:
    10.     printf("\nCap cua ma tran vuon, n = "); scanf("%d",&n);
    11.  
    12. // Nhap ma tran a:
    13.     for (i = 0; i < n; i++)
    14.         for (j = 0; j < n; j++)
    15.             {
    16.                 printf("a[%d][%d] = ", i, j);
    17.                 scanf("%lf",&a[i][j]);
    18.             }
    19.  
    20. // Tinh dinh thuc cua a
    21.     for (i = 0; i < n-1; i++)
    22.         {
    23.             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
    24.                 {
    25.                     k = i+1;
    26.                     while (k < n && a[k][i] == 0) k++;
    27.                     if (k==n) { printf("\ndet(a) = 0"); break;} // Không timg thấy, tức det(a) = 0
    28.                     for (j = i; j < n; j++)// Đổi hàng i với hàng k
    29.                         {
    30.                             temp = a[i][j];
    31.                             a[i][j] = a[k][j];
    32.                             a[k][j] = temp;
    33.                         }
    34.                     sign = -sign; // Định thức đổi dấu đó
    35.                 }
    36.             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 đó
    37.                 {
    38.                     temp = -a[j][i]/a[i][i];
    39.                     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
    40.                 }
    41.             det *= a[i][i]; // Tính dần det(a)
    42.         }
    43.  
    44.     det *= a[n-1][n-1]; // Nhân với phần tử cuối chéo chính nữa là xong
    45.     printf("\ndet(a) = %lf\n",det);
    46.  
    47. //Tinh ma tran nguoc
    48. if (det != 0)
    49. {
    50.     for (i = 0; i < n; i++) // Tạo ra b là ma trận đơn vị đó
    51.         for (j = 0; j < n; j++)
    52.         if (i==j) b[i][j] = 1; else b[i][j] = 0;
    53.  
    54.     for (i = 0; i < n; i++) // Xử lý từ hàng đầu đến hàng cuối
    55.         {
    56.             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
    57.                 {
    58.                     k = i+1;
    59.                     while (k < n && a[k][i] == 0) k++;
    60.                     for (j = 0; j < n; j++) // Đổi hàng đó của a đó, cả với ma trận b nữa
    61.                         {
    62.                             temp = a[i][j];
    63.                             a[i][j] = a[k][j];
    64.                             a[k][j] = temp;
    65.                             temp = b[i][j];
    66.                             b[i][j] = b[k][j];
    67.                             b[k][j] = temp;
    68.                         }
    69.                 }
    70.  
    71.             temp = a[i][i];
    72.             for (j = i; j < n; j++) a[i][j] /= temp;
    73.             for (j = 0; j < n; j++) b[i][j] /= temp;
    74.  
    75.             for (j = i+1; j < n; j++)
    76.                 {
    77.                     temp = -a[j][i];
    78.                     for (k = i; k < n; k++) a[j][k] += temp*a[i][k];
    79.                     for (k = 0; k < n; k++) b[j][k] += temp*b[i][k];
    80.                 }
    81.         }// Kết thúc quá trình Gauss
    82.  
    83.     for (i = n-1; i > 0; i--) // Bắt đầu quá trình Jordan
    84.         for (j = i-1; j >=0; j--)
    85.             {
    86.                 temp = -a[j][i];
    87.                 for (k = n-1; k >= i; k--)  a[j][k] += temp*a[i][k];
    88.                 for (k = 0; k < n; k++) b[j][k] += temp*b[i][k];
    89.             }
    90.  
    91.     for (i = 0; i < n; i++)// In ra ma trận b, bây giờ là ma trận nghich đảo của a
    92.         {
    93.             for (j = 0; j < n; j++) printf("%8.3lf\t", b[i][j]);
    94.             printf("\n");
    95.         }
    96. }
    97. else printf("\nKhong co ma tran nghich dao\n");
    98.     getch();
    99. }

  6. #6
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,007

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

    Trích dẫn Nguyên bản được gửi bởi onminh Xem bài viết
    ....
    cám ơn thầy, bạn ấy pm em mà e thì thấy toán cao cấp nản quá, e ko còn nhớ được nhiều toán nữa....
    ^_,^

    Facebook : https://www.facebook.com/langmaninternet

    Bùi Tấn Quang

  7. #7
    Ngày gia nhập
    09 2009
    Bài viết
    240

    Trích dẫn Nguyên bản được gửi bởi langman Xem bài viết
    thảo nào mà ko thích đệ quy, langman giúp các bạn khác xong sẽ check cho bạn
    Langman này, tính det(a) bằng đệ quy (tức là theo định nghĩa của det) thì nhiều phép tính lắm. Để tính một định thức cấp n, cần n! – 1 phép cộng và n!(n – 1) phép nhân.

  8. #8
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,007

    Trích dẫn Nguyên bản được gửi bởi onminh Xem bài viết
    Langman này, tính det(a) bằng đệ quy (tức là theo định nghĩa của det) thì nhiều phép tính lắm. Để tính một định thức cấp n, cần n! – 1 phép cộng và n!(n – 1) phép nhân.
    dạ vâng ạ,
    bây giờ reply các bạn em thiên theo cả 2 chiều hướng là đơn giản và đệ quy
    ^_,^

    Facebook : https://www.facebook.com/langmaninternet

    Bùi Tấn Quang

  9. #9
    Ngày gia nhập
    09 2009
    Bài viết
    240

    Trích dẫn Nguyên bản được gửi bởi langman Xem bài viết
    cám ơn thầy, bạn ấy pm em mà e thì thấy toán cao cấp nản quá, e ko còn nhớ được nhiều toán nữa....
    Em đã xem onminh vẽ ellipse và arc chưa?

  10. #10
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,007

    Trích dẫn Nguyên bản được gửi bởi onminh Xem bài viết
    Em đã xem onminh vẽ ellipse và arc chưa?
    chưa thầy à,

    thấy thức khuya thế,

    thấy cho em lịnk với
    ^_,^

    Facebook : https://www.facebook.com/langmaninternet

    Bùi Tấn Quang

Các đề tài tương tự

  1. Lập trình C++ định nghĩa toán tử = cho ma trận ?
    Gửi bởi ngonchanloi89 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 11
    Bài viết cuối: 12-10-2013, 06:24 PM
  2. Chương trình ưu đãi “công nghệ trao tay, học ngay nghề hot”
    Gửi bởi April91 trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 25-04-2013, 10:45 PM
  3. Tổ chức sự kiện nghề HOT của giới trẻ
    Gửi bởi lehoang2003 trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 04-06-2012, 10:09 AM
  4. Bán nhà mặt phố Trần Đại NGhĩa chính chủ cần bán - 30/11/11
    Gửi bởi taikhoan005 trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 23-12-2011, 10:53 PM
  5. Bán nhà mặt phố Trần Đại NGhĩa chính chủ cần bán
    Gửi bởi taikhoan005 trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 5
    Bài viết cuối: 03-12-2011, 01:20 PM

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