Metodo di Gauss
/* Algoritmo di Gauss */
#include
#include
#include
void Genera(int m, int n, int a[m][n]);
void Stampa(int m, int n, int a[m][n]);
void Scambio(int m, int n, int i, int j, int a[m][n]);
void Gauss(int m, int n, int a[m][n]);
int main(void) {
int r, c;
printf("Inserisci l'ordine della matrice nr:nc: ");
scanf("%d:%d", &r, &c);
int a[r][c]; /* Alloca la matrice */
Genera(r, c, a);
Stampa(r, c, a);
Gauss(r, c, a);
Stampa(r, c, a);
return 0;
}
void Genera(int m, int n, int a[m][n]) {
int i, j, cod;
srand((unsigned) time(NULL));
printf("Generare una matrice casuale 1) - Inserire le entrate 2): ");
scanf("%d", &cod);
if(cod == 1) {
for(i = 0; i < m; i++) {
for(j = 0; j < n; j++) {
a[j] = rand() % 100;
}
}
}
else if(cod == 2) {
printf("Inserisci le entrate: ");
for(i = 0; i < m; i++) {
for(j = 0; j < n; j++) {
scanf("%d", &a[j]);
}
}
}
}
void Stampa(int m, int n, int a[m][n]) {
int i, j;
for(i = 0; i < m; i++) {
for(j = 0; j < n; j++) {
printf("%d ", a[j]);
}
printf("\n");
}
printf("\n \n");
}
void Scambio(int m, int n, int i, int j, int a[m][n]) {
int p, q;
for(p = 0; p < n; p++) {
q = a
; = a[j] ; = q;
a
a[j]
}
}
void Gauss(int m, int n, int a[m][n]) {
int col, riga, i, j;
double cost;
for(col = 0; col < m-1; col++) {
riga = col;
while(a[riga][col] == 0)
riga++;
if(riga != col)
Scambio(m, n, riga, col, a);
for(i = col+1; i < m; i++) { /* Parto dalla riga (col+1) */
cost = a[col]/a[riga][col];
for(j = col; j < n; j++) { /* Seleziono la colonna */
a[j] = a[j] - cost * a[riga][j];
}
}
}
}
Il problema secondo me si trova nell' ultimo for della funzione Gauss perchè a[j] = a[j] - cost * a[riga][j] non cambia il valore come dovrebbe. In pratica la variabile cost risulta uguale ad un intero e non a un double come dichiarato e quindi non mi annulla per esempio gli elementi della colonna ma a questi sottrae il multiplo piu grande del pivot che sia minore dell'elemento stesso. Per esempio, 55 - (55/10) *10 non fa 0 ma fa 5.
Come dovrei secondo voi risolvere questo dettaglio? Grazie per la pazienza.
Se ti può essere utile ti posto il codice di come avrei impostato io il problema:
#include <iostream> void genera(const unsigned int& rig, const unsigned int& col, double a[50][50]) { for(unsigned int i = 0; i < rig; i++) { for(unsigned int j = 0; j < col; j++) { std::cin >> a[i][j]; } } } void stampa(const unsigned int& rig, const unsigned int& col, double a[50][50]) { std::cout << std::endl; for(unsigned int i = 0; i < rig; i++) { for(unsigned int j = 0; j < col; j++) { std::cout << a[i][j] << "\t"; } std::cout << std::endl; } } void scambia_righe(const unsigned int& i_1, const unsigned int& i_2, const unsigned int& col, double a[50][50]) { double temp; for(unsigned int j = 0; j < col; j++) { temp = a[i_1][j]; a[i_1][j] = a[i_2][j]; a[i_2][j] = temp; } } void gauss(const unsigned int& rig, const unsigned int& col, double a[50][50]) { unsigned int pivot = 0; unsigned int i; double cost; bool dispari = false; for(unsigned int j = 0; j < col; j++) { for(i = pivot; i < rig; i++) { if(a[i][j] != 0) { if(i != pivot) { scambia_righe(i, pivot, col, a); dispari = !dispari; } for(unsigned int i_2 = pivot + 1; i_2 < rig; i_2++) { if(a[i_2][j] != 0) { cost = - (a[i_2][j] / a[pivot][j]); for(unsigned int j_2 = j; j_2 < col; j_2++) { a[i_2][j_2] += cost * a[pivot][j_2]; if((a[i_2][j_2] > 0 && a[i_2][j_2] < 0.1e-013) || (a[i_2][j_2] < 0 && a[i_2][j_2] > -0.1e-013)) { a[i_2][j_2] = 0; } } } } ++pivot; break; } } } std::cout << std::endl << "rango = " << pivot; if(rig == col) { cost = 1; for(i = 0; i < rig; i++) { cost *= a[i][i]; } if(dispari) { cost = -cost; } std::cout << std::endl << "determinante = " << cost; } } int main() { unsigned int rig, col; double a[50][50]; std::cout << "righe(max50): "; std::cin >> rig; std::cout << "colonne(max50): "; std::cin >> col; genera(rig, col, a); stampa(rig, col, a); gauss(rig, col, a); stampa(rig, col, a); }