mesonepigreco
15-01-2012, 19:25
Ciao a tutti,
Non riesco a trovare un algoritmo per calcolare gli invarianti secondari delle matrici quadrate. È chiaramente banale il problema se si conosce in anticipo l'ordine dell'invariante, ma vorrei scrivere una funzione che prende in input l'ordine dell'inveriante, la matrice e la sua dimensione e restituisce l'invariante di quell'ordine, il prototipo dovrebbe essere qualcosa del genere
double OttieniInvariante(double Matrice[][1000], int dimensione, int ordine);
Per chi non lo sapesse un invariante di ordine k è la somma dei determinanti di tutte le possibili sottomatrici di ordine k costruite sulla diagonale della matrice data.
Lo scopo del programma è quello di usare gli invarianti primari (traccia e determinante) e secondari per costruire il polinomio caratteristico di una matrice, e trovare dunque gli autovalori.
So che è complicato, ma ho già scritto alcune funzioni possono essere utili per questo, ecco i prototipi:
int RiduciAScala(double Matrice[][N_MAX], int n);
// Riduce a scala la matrice con l'algoritmo di Gauss-Jordan
double Determinante(double Matrice[][N_MAX], int n);
// Calcola con lo sviluppo di Laplace il determinante della matrice
double ComplementoAlgebrico(double Matrice[][N_MAX], int n, int riga, int colonna);
// Calcola il complemento algebrico della matrice nella riga e nella colonna data
void stampa(double Matrice[][N_MAX], int n);
//Stampa a schermo la matrice
void CalcolaInversa(double Matrice[][N_MAX], int n, double inversa[][N_MAX]);
// Calcola la matrice inversa salvando il risultato in inversa
void Trasposta(double Matrice[][N_MAX], int n, double trasposta[][N_MAX]);
// Transpone la matrice, salvando il risultato in trasposta
void ProdottoRigheXColonne(double m1[][N_MAX], double m2[][N_MAX], int n, double ris[][N_MAX]);
void CalcolaSottomatrice(double Matrice[][N_MAX], int n, int riga, int colonna, double ridotta[][N_MAX]);
// Calcola la sottomatrice ottenuta togliendo dalla matrice la riga e la colonna data e salvando il risultato in ridotta
Grazie mille in anticipo!
Non riesco a trovare un algoritmo per calcolare gli invarianti secondari delle matrici quadrate. È chiaramente banale il problema se si conosce in anticipo l'ordine dell'invariante, ma vorrei scrivere una funzione che prende in input l'ordine dell'inveriante, la matrice e la sua dimensione e restituisce l'invariante di quell'ordine, il prototipo dovrebbe essere qualcosa del genere
double OttieniInvariante(double Matrice[][1000], int dimensione, int ordine);
Per chi non lo sapesse un invariante di ordine k è la somma dei determinanti di tutte le possibili sottomatrici di ordine k costruite sulla diagonale della matrice data.
Lo scopo del programma è quello di usare gli invarianti primari (traccia e determinante) e secondari per costruire il polinomio caratteristico di una matrice, e trovare dunque gli autovalori.
So che è complicato, ma ho già scritto alcune funzioni possono essere utili per questo, ecco i prototipi:
int RiduciAScala(double Matrice[][N_MAX], int n);
// Riduce a scala la matrice con l'algoritmo di Gauss-Jordan
double Determinante(double Matrice[][N_MAX], int n);
// Calcola con lo sviluppo di Laplace il determinante della matrice
double ComplementoAlgebrico(double Matrice[][N_MAX], int n, int riga, int colonna);
// Calcola il complemento algebrico della matrice nella riga e nella colonna data
void stampa(double Matrice[][N_MAX], int n);
//Stampa a schermo la matrice
void CalcolaInversa(double Matrice[][N_MAX], int n, double inversa[][N_MAX]);
// Calcola la matrice inversa salvando il risultato in inversa
void Trasposta(double Matrice[][N_MAX], int n, double trasposta[][N_MAX]);
// Transpone la matrice, salvando il risultato in trasposta
void ProdottoRigheXColonne(double m1[][N_MAX], double m2[][N_MAX], int n, double ris[][N_MAX]);
void CalcolaSottomatrice(double Matrice[][N_MAX], int n, int riga, int colonna, double ridotta[][N_MAX]);
// Calcola la sottomatrice ottenuta togliendo dalla matrice la riga e la colonna data e salvando il risultato in ridotta
Grazie mille in anticipo!