PDA

View Full Version : #include "matutils.h"


MaPPaZZo
24-06-2003, 21:31
ho trovato un codice sorgente che richiede questa libreria....qlc di voi la conosce oppure ce l'ha? ;)

lalli83
24-06-2003, 21:58
io ce l ho...vuoi ke te passo via mail? ;)

MaPPaZZo
24-06-2003, 22:22
Originally posted by "lalli83"

io ce l ho...vuoi ke te passo via mail? ;)

ma tu sei un mito!!!!!!!!!!!! :sofico: :sofico: :sofico:

[email protected] ;)

maxithron
24-06-2003, 22:24
ma non è un header per mac? che ne devi fare?(sono curioso)

maxithron
24-06-2003, 22:25
e poi...non si chiama macutils?

MaPPaZZo
24-06-2003, 22:28
/*
Iterativi.c
Jacobi + GaussSeidel

Risolve sistemi lineari con i metodi iterativi classici.
Sono possibili ancora ottimizzazioni nei calcoli.

Riga di comando:
- "risolvi nomefile" legge la matrice dal file `nomefile' (prima la
dimensione, poi tutti gli elementi per riga)
Usare nomefile='-' per leggere da stdin

*/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "matutils.h"

/* Prototipi di funzione */
int JacobiSolve(int n,const matrice a,const double *b,double *x);
int GaussSeidelSolve(int n,const matrice a,const double *b,double *x);
/* #################### */

int MAXITER;
double EPS; /* troncamento*/

/*
Metodo iterativo di Jacobi per risolvere Ax=b
Restituisce 0 se non c'e' convergenza, altrimenti
il numero di iterazioni effettuate.
Controllo di convergenza in norma infinito:
|x - xold|<EPS
*/

int JacobiSolve(int n,const matrice a,const double *b,
double *x)
{
int i,j, niter=0;
double sum, *oldx, diff=100.0;

oldx = calloc(n,sizeof *oldx);
for (i=0; i<n; i++)
oldx[i]=x[i];

while (diff>EPS && ++niter<MAXITER)
{
diff = 0.0;
for (i=0; i<n; i++)
{
sum = b[i];
for (j=0; j<n; j++)
if (j!=i) sum -= a[i][j]*x[j];

oldx[i] = sum / a[i][i];
diff += fabs(x[i]-oldx[i]);
}
for (i=0; i<n; i++) x[i] = oldx[i];
}

free(oldx);
if (niter==MAXITER) return 0;
return niter;
}




/*
Metodo iterativo di Gauss Seidel per risolvere Ax=b
Restituisce 0 se non c'e' convergenza, altrimenti
il numero di iterazioni effettuate.
*/

int GaussSeidelSolve(int n, const matrice a, const double *b,
double *x)
{
int i,j, niter=0;
double sum, oldxi, diff=1.;

/* NB: in questo caso la oldxi e' una semplice variabile e non un vettore come nel caso precedente */

while (diff>EPS && ++niter<MAXITER)
{
diff = 0.0;
for (i=0; i<n; i++)
{
sum = b[i];
for (j=0; j<n; j++)
if (j!=i) sum -= a[i][j]*x[j];

oldxi = x[i];
x[i] = sum / a[i][i];
diff += fabs(x[i]-oldxi);
}
}

if (niter==MAXITER) return 0;
return niter;
}



int main(int argc, char *argv[])
{
int i, n;
matrice a, l;
double *x1, *x2, *x3;
FILE *in = stdin;

/* Inizializzazione della matrice */

if (argc!=2)
{
fprintf(stderr,"Uso:\n"
"\t%s <nomefile> Legge matrice dal file (usare '-' per stdin)\n"
,argv[0]);
return 1;
}

/* Carico la matrice */

a = LeggiFile(argv[1],&n);
if (!n) {printf("\n\nAttenzione nome di file errato: %s\n",argv[1]); return 0;}
l=alloca_matrice(n);

printf("\n########################################################\n");
printf("\nMatrice iniziale caricata:\n");
printf("Di dimensione N= %d\n",n);
Stampa(n,a);

printf("\n\nInserisci il vettore dei termini noti (b) \n");
printf("\nElementi separati da spazio\n");
x1 = calloc(n, sizeof *x1);
for (i=0; i<n; i++) fscanf(in,"%lf",&x1[i]);


printf("\n\nInserisci il vettore con la soluzione iniziale");
printf("\nElementi separati da spazio\n");
x2 = calloc(n, sizeof *x2);
for (i=0; i<n; i++) fscanf(in,"%lf",&x2[i]);
x3 = calloc(n, sizeof *x3);
for (i=0; i<n; i++) x3[i]=x2[i];

printf("\n\nInserisci il numero massimo di iterate\n"); fscanf(in,"%d",&MAXITER);
printf("\n\nInserisci il criterio di troncamento \n"); fscanf(in,"%lf",&EPS);


printf("\n########################################################\n");
printf("\nMatrice iniziale:\n");
printf("Di dimensione N= %d\n",n);
Stampa(n,a);
printf("\n--------------------------------------------------------\n");
printf("\nVettore dei termini noti trasposto. A.x = "); StampaVet(n,x1);
printf("\n--------------------------------------------------------\n");
printf("\nVettare Soluzione di partenza trasposto. A.x = "); StampaVet(n,x2);
printf("\n--------------------------------------------------------\n");
printf("Numero massimo di iterate consentite= %d\n",MAXITER);
printf("Epsilon di troncamento= %6.10f\n",EPS);
printf("\n########################################################\n");

/* Sistema lineare risolto con Jacobi */

printf("\n Soluzione del sistema con il metodo di Jacobi \n");
printf("\nVettore suluzioni di PARTENZA "); StampaVet(n,x2);
i = JacobiSolve(n,a,x1,x2);
if ( !i ) printf("\nJacobi non converge. Numero di Iterate superiore a quello consentito\n");
else
{
printf("\nSoluzione trovata: ");
StampaVet(n,x2);
printf("Numero di iterate eseguite: %d",i);
}

printf("\n########################################################\n");
printf("\n--------------------------------------------------------\n");
printf("\n########################################################\n");

/* Sistema lineare risolto con GaussSeidel */


printf("\n Soluzione del sistema con il metodo di Gauss-Seidel \n");
printf("\nVettore suluzioni di PARTENZA "); StampaVet(n,x3);
i = GaussSeidelSolve(n,a,x1,x3);
if ( !i ) printf("\nGauss-Seidel non converge. Numero di Iterate superiore a quello consentito\n");
else
{
printf("\nSoluzione trovata: ");
StampaVet(n,x3);
printf("Numero di iterate eseguite: %d",i);
}
printf("\n########################################################\n");

/* Libera memoria utilizzata */

free(x2); free(x1);
libera_matrice(n,a);
libera_matrice(n,l);
return 0;
}

questo è il listato del prog che dovrei compilare...mi serve per fare una tesina di calcolo numerico all'uni...quando compilo mi da vari errori che penso derivano dal primo (infatti nn trova la libreria....) :muro:

se nn riesco a far andare questo devo mettermi di santa pazienza e rifarmene uno per conto mio, ma sinceramente nn mi va visto che ho da preparare altri 2 esami oltre a questo :muro:

lalli83
24-06-2003, 22:35
Una tesina simile l ho dovuta fare anke io al primo periodo didattico...però o non con C, ma con Matlab :rolleyes:

maxithron
24-06-2003, 22:39
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <matutils.h>

int JacobiSolve(int n, const matrice a, const double *b, double *x);
int GaussSeidelSolve(int n, const matrice a, const double *b, double *x);
/* #################### */

int MAXITER;
double EPS;

int JacobiSolve(int n, const matrice a, const double *b,
double *x)
{
int i,j, niter=0;
double sum, *oldx, diff=100.0;

oldx = calloc(n,sizeof *oldx);
for (i=0; i<n; i++)
oldx[i]=x[i];

while (diff>EPS && ++niter<MAXITER)
{
diff = 0.0;
for (i=0; i<n; i++)
{
sum = b[i];
for (j=0; j<n; j++)
if (j!=i) sum -= a[i][j]*x[j];

oldx[i] = sum / a[i][i];
diff += fabs(x[i]-oldx[i]);
}
printf("\n------------------------------");
printf("\nITERATA N= %d\n",niter);
printf("\nVettore suluzioni di PARTENZA "); StampaVet(n,x);
printf("\nVettore suluzioni al passo %d ",niter); StampaVet(n,oldx);
printf("DIFFERENZA N= %3.10f\n",diff);
for (i=0; i<n; i++) x[i] = oldx[i];
}

free(oldx);
if (niter==MAXITER) return 0;
return niter;
}


int GaussSeidelSolve(int n, const matrice a, const double *b,
double *x)
{
int i,j, niter=0;
double sum, oldxi, diff=1.;

while (diff>EPS && ++niter<MAXITER)
{
diff = 0.0;
for (i=0; i<n; i++)
{
sum = b[i];
for (j=0; j<n; j++)
if (j!=i) sum -= a[i][j]*x[j];

oldxi = x[i];
x[i] = sum / a[i][i];
diff += fabs(x[i]-oldxi);
printf("\nSuluzione di x%d al passo %d= %3.10f",i,niter,x[i]);
}
printf("\n------------------------------");
printf("\nITERATA N= %d\n",niter);
printf("\nVettore suluzioni: "); StampaVet(n,x);
printf("DIFFERENZA N= %3.10f\n",diff);
}

if (niter==MAXITER) return 0;
return niter;
}



int main(int argc, char *argv[])
{
int i, n;
matrice a, l;
double *x1, *x2, *x3;
FILE *in = stdin;

if (argc!=2)
{
fprintf(stderr,"Uso:\n"
"\t%s <nomefile> Legge matrice dal file (usare '-' per stdin)\n"
,argv[0]);
return 1;
}


a = ReadFile(argv[1],&n);
if (!n) {printf("\n\nAttenzione nome di file errato: %s\n",argv[1]); return 0;}
l=alloca_matrice(n);

printf("\n########################################################\n");
printf("\nMatrice iniziale caricata:\n");
printf("Di dimensione N= %d\n",n);
Stampa(n,a);

printf("\n\nInserisci il vettore dei termini noti (b) \n");
printf("\nElementi separati da spazio\n");
x1 = calloc(n, sizeof *x1);
for (i=0; i<n; i++) fscanf(in,"%lf",&x1[i]);


printf("\n\nInserisci il vettore con la soluzione iniziale");
printf("\nElementi separati da spazio\n");
x2 = calloc(n, sizeof *x2);
for (i=0; i<n; i++) fscanf(in,"%lf",&x2[i]);
x3 = calloc(n, sizeof *x3);
for (i=0; i<n; i++) x3[i]=x2[i];

printf("\n\nInserisci il numero massimo di iterate\n"); fscanf(in,"%d",&MAXITER);
printf("\n\nInserisci il criterio di troncamento \n"); fscanf(in,"%lf",&EPS);


printf("\n########################################################\n");
printf("\nMatrice iniziale:\n");
printf("Di dimensione N= %d\n",n);
Stampa(n,a);
printf("\n--------------------------------------------------------\n");
printf("\nVettore dei termini noti trasposto. A.x = "); StampaVet(n,x1);
printf("\n--------------------------------------------------------\n");
printf("\nVettare Soluzione di partenza trasposto. A.x = "); StampaVet(n,x2);
printf("\n--------------------------------------------------------\n");
printf("Numero massimo di iterate consentite= %d\n",MAXITER);
printf("Epsilon di troncamento= %6.10f\n",EPS);
printf("\n########################################################\n");



printf("\n Soluzione del sistema con il metodo di Jacobi \n");
printf("\nVettore suluzioni di PARTENZA "); StampaVet(n,x2);
i = JacobiSolve(n,a,x1,x2);
if ( !i ) printf("\nJacobi non converge. Numero di Iterate superiore a quello consentito\n");
else
{
printf("\nSoluzione trovata: ");
StampaVet(n,x2);
printf("Numero di iterate eseguite: %d",i);
}

printf("\n########################################################\n");
printf("\n--------------------------------------------------------\n");
printf("\n########################################################\n");

printf("\n Soluzione del sistema con il metodo di Gauss-Seidel \n");
printf("\nVettore suluzioni di PARTENZA "); StampaVet(n,x3);
i = GaussSeidelSolve(n,a,x1,x3);
if ( !i ) printf("\nGauss-Seidel non converge. Numero di Iterate superiore a quello consentito\n");
else
{
printf("\nSoluzione trovata: ");
StampaVet(n,x3);
printf("Numero di iterate eseguite: %d",i);
}
printf("\n########################################################\n");

/* freemem */

free(x2); free(x1);
libera_matrice(n,a);
libera_matrice(n,l);
return 0;
}


E' verooo , ma vaaa, ma LOL :D , anch'io mi guardai sta cosa, appena ho visto il codice che avevi postato mi si è accesa la lampadina!!!

MaPPaZZo
24-06-2003, 22:41
Originally posted by "lalli83"

Una tesina simile l ho dovuta fare anke io al primo periodo didattico...però o non con C, ma con Matlab :rolleyes:

tutto è ben accetto!!!!!!!!!!!!! matlab nn lo so usare pero.... :cry:

adesso che ho messo la libreria che mancava mi da anche gli altri errori in fase di compilazione...io c nn lo tocco da un anno!!! e l'ho stuudiato 3 giorni!!!!!! :sofico:
nn so che fare!!!!!!!!! :muro: :muro: :muro: :muro: :muro: :muro:

MaPPaZZo
24-06-2003, 22:43
ma allora na tesina del genere l'avete fatta tutti!!!!!!!!!!

a me servirebbe una tipo questa...basta fare al computer un programma che utilizzi un metodo iterativo...magari qlc anima pia mi manda il file word... :D :D :D :D :D :D

maxithron
24-06-2003, 22:48
Originally posted by "MaPPaZZo"

ma allora na tesina del genere l'avete fatta tutti!!!!!!!!!!



mai fatto una tesina io.....Mi sono iscritto l'anno scorso (a 30 anni!!)

maxithron
24-06-2003, 22:54
scusa ma che errore ti dà in compilazione? e con che compilatore ed SO?

MaPPaZZo
24-06-2003, 23:07
Originally posted by "maxithron"

scusa ma che errore ti dà in compilazione? e con che compilatore ed SO?

win xp pro, compilatore Dev c++...

ad esempio nella dichiarazione della funzione JacobiSolve mi da l'errore "parse error before a"...gli altri errori sono tipo questo :muro: