|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#21 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Quando devi calcolare c, utilizzi un elemento sulla diagonale per fare la divisione, confidente del fatto che la tua matrice di test ha la diagonale non nulla: Codice:
c = -(a[i+1][z] / a[z][z]); Per prova, fai girare il tuo algoritmo con qualche scritta di debug: Codice:
void printMat (float a[4][4])
{
printf ("Input matrix\n");
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
printf ("%f ", a[i][j]);
}
printf ("\n");
}
}
void inversa(float a[4][4])
{
printMat (a);
int i;
int j;
int z;
float b[4][4] = {{ 1, 0, 0, 0},{ 0, 1, 0, 0},{ 0, 0, 1, 0},{ 0, 0, 0, 1}};
float c;
float d;
for (z=0;z<3;z++)
{
for (i=z;i<3;i++)
{
printf ("PIVOT (%d,%d): calculated from -((%f)/(%f) {a[%d][%d] / a[%d][%d]) = ", z, i, a[i+1][z], a[z][z], i+1, z, z, z);
c = -(a[i+1][z] / a[z][z]);
printf ("%f\n", c);
for (j=z;j<4;j++)
{
printf (" a[i][j] = c * a[i][j]; {i=%d j=%d c=%f a[i][j]=%f} RESULT: ", i, j, c, a[i][j]);
a[i][j]= c * a[i][j];
printf ("%f\n", a[i][j]);
printf (" a[i + 1][j] = a[i][j] + a[i + 1][j] {a[i][j]=%f a[i + 1][j]=%f} RESULT: ", a[i][j], a[i+1][j]);
a[i + 1][j] = a[i][j] + a[i + 1][j];
printf ("%f\n", a[i+1][j]);
printf (" b[i][j]= c * b[i][j] {c=%f b[i][j]=%f} RESULT: ", c, b[i][j]);
b[i][j]= c * b[i][j];
printf ("%f\n", b[i][j]);
printf (" b[i + 1][j] =b[i][j]+ b[i + 1][j]; {b[i][j]=%f b[i + 1][j]=%f} RESULT:", b[i][j], b[i+1][j]);
b[i + 1][j] =b[i][j]+ b[i + 1][j];
printf ("%f\n", b[i+1][j]);
}
printf ("After cycle, a[z=%d+1][z=%d+1] = %f\n", z, z, a[z+1][z+1]);
}
}
for (z=0;z<3;z++) {
for (i=(3-z);i>0;i--){
d = -(a[i-1][(3-z)]) / a[3-z][3-z];
for (j=(3-z);j> -1;j--)
{ a[i][j]= d*a[i][j];
a[i-1][j]=a[i][j]+a[i-1][j];
b[i][j]= d*b[i][j];
b[i-1][j]=b[i][j]+b[i-1][j];
}}}
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
b[i][j] = b[i][j] / a[i][i];
a[i][j] = a[i][j] / a[i][i];
}
}
for (i = 0; i <4; i++) {
printf("\n");
for (j = 0; j <4; j++) {
printf("%f" , a[i][j]);
}
}
for (i = 0; i < 4; i++) {
printf("\n");
for (j = 0; j < 4; j++) {
printf("%f", b[i][j]);
}
}
}
Vedrai che l'elemento e' andato a zero e, se non ricordo male, l'algoritmo e' stato fatto per funzionare cosi'. Penso che sia necessario scegliere il pivot fra gli elementi non nulli, scandendoli sulla riga prescelta (come d'altronde hai riportato da Wikipedia)
__________________
In God we trust; all others bring data |
|
|
|
|
|
|
#22 | |
|
Senior Member
Iscritto dal: Jan 2003
Città: Frosinone
Messaggi: 2607
|
Quote:
che ne dici di questa soluzione? Codice:
for (z=0;z<3;z++) {
for (i=z;i<3;i++) {
if (a[i+1][j]=0){ break;}
else {c = -(a[i+1][z] / a[z][z]);}
for (j=z;j<4;j++) {
a[i][j]=c*a[i][j];
a[i + 1][j] =a[i][j] + a[i + 1][j];
b[i][j]=c*b[i][j];
b[i + 1][j] =b[i][j] + b[i + 1][j];
}
}
}
__________________
Phenom II 920 Asus m4a79 deluxe, Sapphire hd4850 1 GB,4 GB G.SKILL PI 1200 Mhz ,HD Maxtor 250gb Sata II
|
|
|
|
|
|
|
#23 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
purtroppo non sono un esperto di questo algoritmo. Quello che posso dirti e' che c'e' una svista: hai scritto Codice:
if (a[i+1][j]=0){ break;}
Immagino volessi scrivere: Codice:
if (a[i+1][j]==0){ break;}
Codice:
c = -(a[i+1][z] / a[z][z]); Comunque, leggendo wikipedia, sembra che non debba saltare il ciclo nel caso l'elemento sia zero, ma che si debba semplicemente scegliere un altro elemento come pivot (ovviamente se esiste). Nel caso un elemento diverso da zero non esista, allora la riga in oggetto deve essere eliminata (in tal caso otterrai un rango inferiore). Se comunque parti da una matrice per la quale hai gia' verificato che esiste l'inversa, questo non dovrebbe capitarti. Scusa la risposta stringata ma sono ancora al lavoro.
__________________
In God we trust; all others bring data Ultima modifica di sottovento : 10-12-2008 alle 09:43. Motivo: la frase non era proprio in italiano comprensibile |
|
|
|
|
|
|
#24 | |
|
Senior Member
Iscritto dal: Jan 2003
Città: Frosinone
Messaggi: 2607
|
Quote:
Un saluto dall'italia
__________________
Phenom II 920 Asus m4a79 deluxe, Sapphire hd4850 1 GB,4 GB G.SKILL PI 1200 Mhz ,HD Maxtor 250gb Sata II
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:22.




















