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? ;)
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:
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:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.