jueves, 24 de enero de 2008

Método de Richardson en lenguaje C

// Practica Final de Analisis Numerico
// Fecha: 27/01/01
// Implementar el metodo de Richardson
// que calcula los terminos independientes de multiplicar
// un vector por una matriz dada.



#include
#include
#include

void Richardson(double **matriz,int dimension,double *v, double *b)
{ // procedimiento tal cual esta en los apuntes
int i, j, k, l;
double *r, aux=0.0;
r=(double*)malloc(dimension*sizeof(double));

for (k=0; k<100; k++)
// aqui metemos un numero de iteraciones aleatorio
{
for (i=0; i {
aux = 0.0;
for (j=0; j {
aux = aux + (matriz[i][j] * v[j]);
// sumatorio del producto de la matriz
}
r[i]=b[i] - aux;
}
for (i=0; i v[i]=v[i]+r[i];
}
}
void MostrarVector(double *Vector, int Nelem)
{
int f;
for(f=0;f printf("%lf\t",Vector[f]);
}
double** LeerDatos(char *nombrefichero,int *dimension) {
double **matriz;
int i,j, veamos;
FILE *f;

if(f=fopen(nombrefichero,"r"),!f){
printf("Problema con la lectura del fichero\n");
return 0;
}
fscanf(f,"%d\n",&(*dimension));
/* Asignacion de memoria dinamica*/
matriz=(double**)malloc(*dimension*sizeof(double*));
for(i=0;i<*dimension;i++)
matriz[i]=(double*)malloc((*dimension+1)*sizeof(double));

for(i=0;i<*dimension;i++)
for(j=0;j<*dimension;j++)
fscanf(f,"%lf\n",&(matriz[i][j]));

for(i=0;i<*dimension;i++)
fscanf(f,"%lf\n",&(matriz[i][*dimension]));

fclose(f);
return matriz;
}


int main()
{
double **matriz, *v, *b;
int dimension, i, n=10;
matriz = (double**)malloc(n*sizeof(double*));
printf("******************************************************\n");
printf("************ METODO DE RICHARDSON ********************\n");
printf("******************************************************\n");
for (i=0;i matriz[i] = (double*)malloc(n*sizeof(double));
// matriz[0][0]= 1.; matriz[0][1]= .5; matriz[0][2]= .333;
// matriz[1][0]= .333; matriz[1][1]= 1.; matriz[1][2]= .5; // //matriz de ejemplo que converge
//matriz[2][0]= .5; matriz[2][1]= .333; matriz[2][2]= 1.; // resta esta //matriz y de la identidad <1
matriz=LeerDatos("matriz10.dat",&dimension);
v = (double*)malloc(n*sizeof(double));
if (v == NULL)
printf("Problemas en la asignacion de memoria");
b=(double*)malloc(n*sizeof(double));
if (b == NULL)
printf("Problemas en la asignacion de memoria");
for(i=0; i b[i]=matriz[i][dimension];
//for(i=0;i// b[i] = 0.91;
for (i=0;i v[i] = 0.0;
Richardson(matriz, n, v, b);
printf("\nEl vector solucion es:\n\n");
for(i=0;i printf("v[%d]= %lf\n\n",i,v[i]);
free(v);
free(b);
for(i=0; i free(matriz[i]);
free(matriz);
system ("PAUSE");
return;
}