Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    5

    C calcolo matrice inversa

    devo fare un programma che inseriti gli elementi di una matrice 2x2 mi dia l'inversa....facile
    il problema sorge quando vado a fare la controprova moltiplicando la matrice originaria per l'inversa....

    il programma mi scrive questo nel terminal


    questo e' il testo


    #include <iostream>
    using namespace std;


    main (){
    double a,b,c,d;
    double det=a*d-b*c;
    double M1 [2][2]= { {a,b}, {c,d}};
    double M2 [2][2]= { {d/det,-b/det}, {-c/det,a/det}};
    double MI [2][2]= { {1,0}, {0,1}};
    double MII[2][2];
    int j,k,l;


    do{

    cout<<" Inserisci il termine della matrice"<<endl<<" a11=";
    cin>>a;
    cout<<" Inserisci il termine della matrice"<<endl<<" a12=";
    cin>>b;
    cout<<" Inserisci il termine della matrice"<<endl<<" a21=";
    cin>>c;
    cout<<" Inserisci il termine della matrice"<<endl<<" a22=";
    cin>>d;


    det=a*d-b*c;


    if (det==0){
    cout<<" il determinante di questa matrice non deve essere nullo, inserisci i valori corretti"<<endl;
    }
    }
    while(det==0);
    cout<<" l'inversa vale "<<endl<<(d/det)<<" "<<(-b/det)<<endl<<(-c/det)<<" "<<(a/det)<<endl;







    for(j=0; j<2; j++) { /* riga 1 */
    for (k=0;k<2;k++){ /* colo2 */
    MII[j][k]=0;
    for(l=0; l<2; l++){ /* colo 1*/
    MII[j][k]+= M1[j][l]*M2[l][k];
    }
    }
    }
    for(j=0;j<2;j++){
    for(k=0; k<2; k++){
    cout<<" "<<MII[j][k];
    }
    cout<<endl;
    }

    cout<<"vale "<<(MI==MII)<<endl;











    }



    credo che il problema nasca quando tenta di fare il prodotto delle matrici, quando va a leggere i valori dell-inversa.

    in effetti il risultato e' quasi esatto, dovrebbe venire infatti una matrice identita'
    1 0
    0 1

    invece viene
    1 ..............
    ........... 1

    aiutoooooooooooo!!!!!!!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non puoi inizializzare la variabile det e l'array M1 in

    codice:
    double det=a*d-b*c;
    double M1 [2][2]= { {a,b}, {c,d}};
    se ancora non hai fatto l'input delle variabili a, b, c, d !
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    5
    cioe'?
    non ho capito scusa

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Cioe' non puoi scrivere

    codice:
    double det=a*d-b*c;
    PRIMA di fare l'input delle variabili con

    codice:
    cout<<" Inserisci il termine della matrice"<<endl<<" a11=";
    cin>>a;
    cout<<" Inserisci il termine della matrice"<<endl<<" a12=";
    cin>>b;
    cout<<" Inserisci il termine della matrice"<<endl<<" a21=";
    cin>>c;
    cout<<" Inserisci il termine della matrice"<<endl<<" a22=";
    cin>>d;
    Semmai devi PRIMA dichiarare le variabili con

    codice:
    double a,b,c,d;
    double det;
    POI fare l'input dei valori con

    codice:
    cout<<" Inserisci il termine della matrice"<<endl<<" a11=";
    cin>>a;
    cout<<" Inserisci il termine della matrice"<<endl<<" a12=";
    cin>>b;
    cout<<" Inserisci il termine della matrice"<<endl<<" a21=";
    cin>>c;
    cout<<" Inserisci il termine della matrice"<<endl<<" a22=";
    cin>>d;
    e SOLO DOPO scrivere

    codice:
    det=a*d-b*c;
    Capito?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    5
    grazie ora funziona

    codice:
    #include <iostream>
    using namespace std;
    
    main (){
      double a,b,c,d;
      double det;
    
      int j,k,l;
    
      do{
      
      cout<<" Inserisci il termine della matrice"<<endl<<" a11=";
      cin>>a;
      cout<<" Inserisci il termine della matrice"<<endl<<" a12=";
      cin>>b;
    cout<<" Inserisci il termine della matrice"<<endl<<" a21=";
      cin>>c;
    cout<<" Inserisci il termine della matrice"<<endl<<" a22=";
      cin>>d;
    
      det=a*d-b*c;
    
      if (det==0){
        cout<<" il determinante di questa matrice non deve essere nullo, inserisci i valori corretti"<<endl;
      }
      }
      while(det==0);
      cout<<" l'inversa vale "<<endl<<(d/det)<<" "<<(-b/det)<<endl<<(-c/det)<<" "<<(a/det)<<endl;
    
    
      double M1 [2][2]= { {a,b}, {c,d}};
      double M2 [2][2]= { {d/det,-b/det}, {-c/det,a/det}};
      double MI [2][2]= { {1,0}, {0,1}};
      double MII[2][2];
    
     
    
    
      for(j=0; j<2; j++) {            /* riga 1 */
        for (k=0;k<2;k++){            /* colo2 */
          MII[j][k]=0;
          for(l=0; l<2; l++){         /* colo 1*/
    	MII[j][k]+= M1[j][l]*M2[l][k];
          }
        }
      }
      for(j=0;j<2;j++){
        for(k=0; k<2; k++){
          cout<<"    "<<MII[j][k];
        }
        cout<<endl;
      }
      
        cout<<"vale "<<(MI==MII)<<endl;
      
    
    
    
    
    #include <iostream>
    using namespace std;
    
    main (){
      double a,b,c,d;
      double det;
    
      int j,k,l;
    
      do{
      
      cout<<" Inserisci il termine della matrice"<<endl<<" a11=";
      cin>>a;
      cout<<" Inserisci il termine della matrice"<<endl<<" a12=";
      cin>>b;
    cout<<" Inserisci il termine della matrice"<<endl<<" a21=";
      cin>>c;
    cout<<" Inserisci il termine della matrice"<<endl<<" a22=";
      cin>>d;
    
      det=a*d-b*c;
    
      if (det==0){
        cout<<" il determinante di questa matrice non deve essere nullo, inserisci i valori corretti"<<endl;
      }
      }
      while(det==0);
      cout<<" l'inversa vale "<<endl<<(d/det)<<" "<<(-b/det)<<endl<<(-c/det)<<" "<<(a/det)<<endl;
    
    
      double M1 [2][2]= { {a,b}, {c,d}};
      double M2 [2][2]= { {d/det,-b/det}, {-c/det,a/det}};
      double MI [2][2]= { {1,0}, {0,1}};
      double MII[2][2];
    
     
    
    
      for(j=0; j<2; j++) {            /* riga 1 */
        for (k=0;k<2;k++){            /* colo2 */
          MII[j][k]=0;
          for(l=0; l<2; l++){         /* colo 1*/
    	MII[j][k]+= M1[j][l]*M2[l][k];
          }
        }
      }
      for(j=0;j<2;j++){
        for(k=0; k<2; k++){
          cout<<"    "<<MII[j][k];
        }
        cout<<endl;
      }
      
        cout<<"vale "<<(MI==MII)<<endl;
      
    
    
    
    
    
    }

    funziona, ma non sempre


    per esempio

    con la matrice
    5 2
    6 3


    quando mi dovrebbe dare l'identita'

    scrive

    1 4.44089e-16
    0 1

    mentre con la matrice
    3 6
    2 8 viene

    l-inversa vale
    1 0
    01

    ????

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    4.44089e-16

    e' un numero molto vicino a zero e puoi considerarlo zero in quanto e' solamente frutto di problemi di arrotondamento e rappresentazione dei valori in virgola mobile ... vedi

    http://en.wikipedia.org/wiki/Floating_point

    Puoi visualizzare solamente due decimali ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    5
    grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.