Riduzione Gauss e soluzione sistema lineare(con funzioni)

di il
3 risposte

Riduzione Gauss e soluzione sistema lineare(con funzioni)

Salve a tutti,scusate l'orario. Sto avendo problemi con un codice,premetto che sono alle primissime armi. Dovrei implementare un codice strutturato in funzioni(o metodi,come si chiamano)che esegua l'algoritmo di riduzione di Gauss data una matrice A random di numeri reali compresi in [-1,1] e un vettore b di termini noti costruito in base alla matrice.Il tutto tramite diverse funzioni(riduzionegauss,ricercapivot,modulo,ecc.). Il mio problema sostanzialmente sta nel richiamare le funzioni all'interno di altre funzioni in cui esse servono. Come vedrete nel codice che ho provato almeno ad abbozzare,in "ricercapivot" mi serve la funzione "modulo",per trovare l'indice della riga contenente l'elemento di modulo massimo(sulla colonna).Il problema,almeno il primo che mi si presenta in maniera evidente,sta nel fatto che per evitare rogne,in altri codici in cui si chiedeva di trovare ad esempio la componente di un vettore col max valore assoluto,calcolavo i moduli di ogni singola componente mettendoli all'interno di un altro vettore(il tutto tramite una funzione,void,avente come parametri:vettore di partenza,vettore "assoluto" coi moduli,dimensione):richiamata nel main,questa faceva esattamente il suo dovere. Ora,seguendo la stessa logica,dovrebbe fare altrettanto pure se chiamata dentro un'altra funzione. Ma mi dà problemi,magari sarà una stupidaggine ma mi ci sto bloccando.Non mi fa allegare il testo del codice,né nel file(uso Dev C++)né come file di testo,non so come fare,perdonatemi.Mi scuso di nuovo,per l'orario in primis,e spero che ci sia qualcuno che possa aiutarmi. Vi ringrazio di cuore anticipatamente,a prescindere.

3 Risposte

  • Re: Riduzione Gauss e soluzione sistema lineare(con funzioni)

    /*Programma C++ strutturato in funzioni che acquisisce da tastiera un numero intero n tale che 0<n<=50,genera in modo casuale la matrice A appartenente ad R^(nxn)
    con elementi appartenenti all'intervallo dell'asse reale [-1,1],costruisce il vettore b contenente elemento per elemento la somma delle componenti della 
    corrispondente riga di A,risolve il sistema lineare Ax=b con il metodo di eliminazione di Gauss con riordinamento pivotale,e stampa sul video le componenti del 
    vettore soluzione x (che dovrebbe avere tutte componenti uguali a 1)*/
    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>
    #include<time.h> //per inizializzare a zero il generatore di numeri casuali
    #define MAXDIM 50 //massimo ordine della matrice A e del vettore colonna b
    typedef double matrice[MAXDIM][MAXDIM];
    typedef double vettore[MAXDIM]; 
    void letturaecontrollodimensione(int&);
    void costruzionematrice(matrice,int);
    void stampamatrice(matrice,int);
    void costruzionevettore(vettore,matrice,int);
    void stampavettore(vettore,int);
    void riduzionegauss(matrice,vettore,int);
    int ricercapivot(matrice,int,int);
    void modulo(matrice,matrice,int);
    
    int main(){
    printf("Programma C++ che legge un numero 0<n<=50,genera casualmente la matrice A di ordine n con elementi reali casuali compresi in [-1,1],costruisce il vettore b in cui ogni elemento e' somma delle componenti della corrispondente riga di A,risolve il sistema lineare Ax=b col metodo di Gauss con riordinamento pivotale e stampa le componenti del vettore soluzione x\n");
    int n;
    matrice A={0};
    costruzionematrice(A,n);
    printf("La matrice A[%d][%d] con elementi reali casuali appartenenti a [-1,1] e':\n",n,n);
    stampamatrice(A,n);
    vettore b={0};
    costruzionevettore(b,A,n);
    printf("\n\nIl vettore b[%d] i cui elementi sono le somme delle componenti di ogni riga della matrice A[%d][%d] e':\n\n",n,n,n);
    stampavettore(b,n);
    
    
    
    
    
    
    
    
    
    
    return 0;
    }
    //Lettura dimensione della matrice A e del vettore dei termini noti b e controllo che sia compresa tra 0(escluso)e 50(incluso):
    void letturaecontrollodimensione(int &d){
      do {printf("Inserire un numero intero 0<n<=50:\n"); scanf("%d",&d);} while(d<0||d>MAXDIM);
    return;
    }
    //Costruzione della matrice con numeri random reali appartenenti all'intervallo [-1,1]:
    void costruzionematrice(matrice a,int d){
    for(int i=0;i<d;i++){
    	for(int j=0;j<d;j++)
    	{a[i][j]=(rand()%3-1);
    	}
    }
    return;
    }
    
    //Stampa della matrice sopra definita:
    void stampamatrice(matrice a,int d){
    	for(int i=0;i<d;i++){printf("\n");
    	for(int j=0;j<d;j++){
    		printf("%lf\t",a[i][j]);
    	}
    }
    return;
    }
    //Costruzione del vettore in cui ogni elemento è la somma delle componenti della corrispondente riga della matrice A:
    void costruzionevettore(vettore b,matrice a,int d){
    	for(int i=0;i<d;i++) 
    	{
    		for(int j=0;j<d;j++)
    		{
    			b[i]+=a[i][j];
    		}
    	}
    return;
    }
    //Stampa di un vettore:
    void stampavettore(vettore b,int d){
    for(int i=0;i<d;i++)
    {printf("%lf\t",b[i]);}
    return;
    }
    
    //Metodo della riduzione di Gauss(con riordinamento pivotale)applicato al sistema lineare Ax=b,per risolverlo:
    /*void riduzionegauss(matrice a,vettore b,int d)
    {
     double m[MAXDIM][MAXDIM-1];/*matrice in cui si inseriscono i coefficienti moltiplicatori m[i][k]:ha N-1 colonne(si moltiplica per questi coefficienti a partire dalla 
                      seconda riga della matrice originaria e dalla seconda componente del vettore dei termini noti,e poi via via le altre)
     for(int k=0;k<d-1;k++) ordine della riduzione delle righe:in particolare,partendo dalla riga successiva alla prima(che è la riga 0)si eseguono operazioni sulle
                            rimanenti righe,per d-1 volte(e arrivando quindi all'ordine (d-2) compreso)
      {int k_pivot=ricercapivot(a,);
      	
      	
     	for(int i=k+1;i<d;i++) //si parte considerando la "sottomatrice" della matrice di partenza(per far annullare  gli elementi sotto la k-esima colonna)
     	{m[i][k]=a[i][k]/a[k][k]; //calcolo del moltiplicatore di ogni k-esima riga(della matrice di partenza e di ogni sottomatrice che si creerà dopo)
     	 for(int j=k+1;j<d;j++)
     	 { 
     	   a[i][j]=a[i][j]-m[i][k]*a[k][j];/*calcolo dell'elemento a[i][j] della matrice ridotta, al passo k-esimo:gli elementi sotto la prima colonna di ogni
     	                                     sottomatrice dovranno annullarsi*/
    	 // }
    	  //v[i]=v[i]-m[i][k]*v[k]; //calcolo dell'elemento v[i] della colonna dei termini noti ridotta, al passo k-esimo
    	// }
     // }
     //return;
    //}
    
    
    
    
    
    
    //Modulo di ogni elemento della matrice(serve per calcolare i moduli degli elementi ad ogni passo della riduzione,per scambiare eventualmente le righe coi pivot):
    void modulo(matrice a,matrice assoluta,int d)
    { 
     for(int i=0;i<d;i++)
       for(int j=0;j<d;j++)
       {if (a[i][j]<0) assoluta[i][j]=-1*a[i][j];
        else assoluta[i][j]=a[i][j];
       } 
    return;
    }
    
    
    //Ricerca dei pivot:
    int ricercapivot(matrice a,int d,int k) 
    { double assoluta[d][d];
    modulo(a,assoluta,d);
    double mk,max;
    
    int indice_pivot=k;
    for(int i=k+1;i<d;i++){
        max=modulo(a[k][k],d);
    	mk=modulo(a[i][k],d);
    	if(mk>max)
    	{max=mk;
    	indice_pivot=i;
    	}
    }
    return indice_pivot;
    }
    /*
    //Funzione scambio di due righe di una matrice:
    void scambia(int &x,int &y){
    
    }
    */
    
  • Re: Riduzione Gauss e soluzione sistema lineare(con funzioni)

    Vi ho qui postato il pezzo di codice che ho scritto(ps alcune funzioni le ho momentaneamente messe come commenti perché ho problemi già nel richiamare la funzione "modulo" all'interno di "ricercapivot". Buonanotte e di nuovo scusatemi.
  • Re: Riduzione Gauss e soluzione sistema lineare(con funzioni)

    Ciao, per essere alle primissime armi ti sei scelto un problema non proprio semplicissimo. In ogni caso posta il codice utilizzando i tag CODE (tasto </> nell'editor completo) e spiega nel dettaglio i problemi e le difficoltà che stai incontrando.
Devi accedere o registrarti per scrivere nel forum
3 risposte