Trang 3 trên tổng số 4 Đầu tiênĐầu tiên 1234 Cuối cùngCuối cùng
Từ 21 tới 30 trên tổng số 33 kết quả

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

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

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

    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.
    Đã được chỉnh sửa lần cuối bởi conrongchautien : 27-03-2012 lúc 12:05 AM.
    YH : lobuocphuudu_218
    Phone : 0126 463 5095

    http://forums.congdongcviet.com/signaturepics/sigpic55872_2.gif

  2. #22
    Ngày gia nhập
    07 2009
    Bài viết
    73

    các dajka bài này vẫn có chỗ sai
    ma trận là
    0 2
    1 3
    định thức =-2 chứ ko phải là 2
    còn ma trận nghịch đảo thì chuẩn rồi .mọi ng Xem lại giúp e với
    Live as If tommorrow never comes

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

    Trích dẫn Nguyên bản được gửi bởi hoan_it_cgh Xem bài viết
    các dajka bài này vẫn có chỗ sai
    ma trận là
    0 2
    1 3
    định thức =-2 chứ ko phải là 2
    còn ma trận nghịch đảo thì chuẩn rồi .mọi ng Xem lại giúp e với
    Mình vừa check lại rồi. Đúng là do mình sai sót. mình sửa lại cho chính xác rồi. Bạn click vào đây xem lại nha
    YH : lobuocphuudu_218
    Phone : 0126 463 5095

    http://forums.congdongcviet.com/signaturepics/sigpic55872_2.gif

  4. #24
    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
    Bài hoàn chỉnh đây:
    Cám ơn thầy onminh rất nhiều.
    Em sửa làm giảm đi cái hay. Sao không viết dau = -dau sau mỗi lần đổi hàng mà lại viết if(dau%2!=0) det*=-1;. Củ chuối wá. Hix...
    Ngôn ngữ là nhất thời, giải thuật là vĩnh cửu.

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

    Trích dẫn Nguyên bản được gửi bởi onminh Xem bài viết
    Em sửa làm giảm đi cái hay. Sao không viết dau = -dau sau mỗi lần đổi hàng mà lại viết if(dau%2!=0) det*=-1;. Củ chuối wá. Hix...
    Em sửa lại rồi. Tại nghĩ sao làm vậy thôi, chưa bik tối ưu
    http://forums.congdongcviet.com/show...3&postcount=21
    Cám ơn thầy!
    YH : lobuocphuudu_218
    Phone : 0126 463 5095

    http://forums.congdongcviet.com/signaturepics/sigpic55872_2.gif

  6. #26
    Ngày gia nhập
    07 2009
    Bài viết
    73

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

    PHP Code:
    #include<conio.h>
    #include<stdio.h>
    #include<iostream.h>
    #include<math.h>
    #include<iomanip.h>
    #include <dos.h>
    #include <math.h>
    #include <stdlib.h>
    #include <ctype.h>

    class MT
    { private:
     
    int n;
     
    double a[10][10];
     public:

     
    //---------------TOAN TU CONG-------------
    MT MT::operator+(const MT &right)
    {
    //if ( n!=right.n) exit (0) ;
     
    MT c;
      for (
    int i=1;i<=n;i++)
         for (
    int j=1;j<=n;j++)
           {     
    c.a[i][j] = a[i][j] + right.a[i][j] ;  }
         
    c.n=n;
     return 
    ;
    }

     
    //-----------------TOAN TU TRU---------------
    MT MT::operator-(const MT &b)
     {
      
    MT d;
     if (
    n!=b.ncout<<"Kh«ng tÝnh ®­îc ";
    else
    for(
    int i=1;i<=n;i++)
      for(
    int j=1;j<=n;j++)
      { 
    d.a[i][j]=a[i][j]-b.a[i][j];}
      
    d.n=n;
      return 
    d;
      }
    //-----------------TOAN TU NHAN--------------
    MT MT::operator*(const MT &t)
    MT c;
      for(
    int i=1;i<=n;i++)
        for(
    int j=1;j<=n;j++)
          for(
    int k=1;k<=n;k++)
        {  
    c.a[i][j]+=a[i][k]*t.a[k][j];}
         
    c.n=n;
         return 
    c;
         }


      
    void nhap();
      
    void in();
      
    void dt_nd(MT &a);
      };
      
    //================Dinh thuc nghich dao==========
      
    void MT::dt_nd(MT &u)
    {
    int i,j,k,m,n,na,dau=0//Thay vì dau=1;
    double det,x,tam;
    double 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("a[%d][%d]=",i+1,j+1);
          //  scanf("%lf",&a[i][j]);
          cin>>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;
        }

    //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;//Neu phan tu a bang 0 thi tang i.
        
    if((i>j)&&(a[i][j]!=0))
            {
            
    k=i-1;
            while((
    k>=j)&&(a[k][j]==0)) k--;//Xet cac phan tu a khac 0 tren cung cot j
            
    if(k<j)
            {
            
    //Doi cho dong thu i va j cho ca ma tran mo rong.
            
    for(m=0;m<na;m++)
                {
                
    tam=a[i][m];
                
    a[i][m]=a[j][m];
                
    a[j][m]=tam;
                }
            
    dau++; // thay vì :dau=-dau;
            
    }
            if((
    k>=j)&&(k>=0))
            {
            
    x=-a[i][j]/a[k][j];
            
    //Nhan dong thu k 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 k 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]; // B? :*dau 
            
    if(dau%2!=0det*=-1//N?u s? l?n d?i ch? 2 dòng là l? thì d?i d?u giá tr? d?nh th?c 
    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]; 
                } 

        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!");
    return;
    getch(); 


       
    void MT::nhap()
      { 
    cout<<"\n CÊp ma trËn=: ";
      
    cin>>n;
      for(
    int i=1;i<=n;i++)
      for(
    int j=1;j<=n;j++)
      { 
    cout<<"\n PhÇn tö hµng"<<i<<" cét"<<j<<"= ";
      
    cin>>a[i][j];
      }
      }
    void MT::in()
       { for(
    int i=1;i<=n;i++)
        { 
    cout<<"\n";
          for(
    int j=1;j<=n;j++)
          
    cout<<setw(6)<<a[i][j]<<" ";
         }
        }

      
    void main()
      { 
    MT a,b,h,k,tich;


      
    a.nhap();
      
    clrscr();
      
    cout<<"\nMa trËn A: ";
      
    a.in();
     
    b.nhap();
     
    clrscr();
    cout<<"\nMa trËn B: ";
    a.in();
    b.in();
    h=a+b;
    k=a-b;
    tich=a*b;
    cout<<"\nMa trËn tæng: ";
    h.in();
    cout<<"\nMa trËn hiÖu";
    k.in();
    cout<<"\nMa trËn tÝch";
    tich.in();
    a.dt_nd(a);
      
    getch();
      } 
    mọi ng xem hộ em cái này với
    lỗi cannot convert MT to int la gì nhi? ko hiểu
    Sửa giúp em với ('-")
    Đã được chỉnh sửa lần cuối bởi hoan_it_cgh : 25-04-2010 lúc 09:25 PM.
    Live as If tommorrow never comes

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

    Vấn đề là ở chỗ này: Hàm thành viên void dt_nd(MT &a) được định nghĩa bên ngoài lớp MT, nhưng thiếu MT::. Thứ hai, tham biến MT &a trùng tên với biến trong lớp. Nếu sử dụng nó thì viết a.a[i][j], còn swr dụng b thì viết b.a[i][j].
    Ngôn ngữ là nhất thời, giải thuật là vĩnh cửu.

  8. #28
    Ngày gia nhập
    07 2009
    Bài viết
    73

    em đã sửa rồi đã hết lỗi nhưng nó ko hiện kq ra màn hình
    có phải việc truyền đối số sai sót chỗ nào ko ạ
    onminh sữa giúp em với
    Live as If tommorrow never comes

  9. #29
    Ngày gia nhập
    01 2010
    Bài viết
    79

    Thumbs up hehe

    hoàn xem lại phần nhập ma trận đi
    bài của hoàn vòng "for" đều bắt đầu từ 1
    nhưng ở phần tính định thức và ma trận nghich đảo vòng for lại bắt đầu từ 0
    sửa lại đi rồi xem kết quả nhé

    "lỗi cannot convert MT to int la gì nhi ? ko hiểu" cái nè là ko thể chuyển MT sang kiểu int vì nó đang ở kiểu double
    Đã được chỉnh sửa lần cuối bởi tnglinh : 26-04-2010 lúc 09:51 AM.

  10. #30
    Ngày gia nhập
    11 2012
    Bài viết
    2

    Trích dẫn Nguyên bản được gửi bởi onminh Xem bài viết
    Đâ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. }[/i]


    Em muốn phát triển bài này theo cách viết Modul (chương trình con). Xin các pro giúp cho...

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