PDA

Visualizza la versione completa : [C] Calcolo della matrice inversa


paolo89
15-11-2008, 20:12
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
http://img89.imageshack.us/img89/113/snapshot1oh3.th.png (http://img89.imageshack.us/my.php?image=snapshot1oh3.png)http://img89.imageshack.us/images/thpix.gif (http://g.imageshack.us/thpix.php)

#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!!!!!!!

oregon
15-11-2008, 21:27
Non puoi inizializzare la variabile det e l'array M1 in



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 !

paolo89
17-11-2008, 18:23
cioe'?
non ho capito scusa

oregon
17-11-2008, 20:08
Cioe' non puoi scrivere


double det=a*d-b*c;

PRIMA di fare l'input delle variabili con


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



double a,b,c,d;
double det;


POI fare l'input dei valori con


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


det=a*d-b*c;

Capito?

paolo89
19-11-2008, 19:34
grazie ora funziona


#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

????

oregon
19-11-2008, 20:08
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 ...

paolo89
20-11-2008, 16:51
grazie

Loading