1 /*
  2 Pseudocódigo MultMatVec:
  3    Para cada elemento i del vector resultado
  4       inicializar en cero el elemento
  5       Para cada elemnto j del vector a multiplicar
  6          multiplicarlo por el elemento i,j de 
  7          la matríz y sumarlo al resultado i
  8          
  9 Pseudocódigo Normaliza:
 10    Sumar el cuadrado de todas las componentes del vector
 11    y guardar su raiz cuadrada como la norma.
 12    Dividir cada elemento del vector por la norma
 13    Devolver la norma
 14    
 15 Pseudocódigo AutoVyV:
 16    Inicializar cada componente del Vector V con un número random.
 17    Normalizar el vector V.
 18    
 19    Hacer
 20       Multiplicar la matriz por el vector guardando el resultado en aux
 21       Normalizar aux guardando su norma en res
 22       Calcuar la diferencia entre V y aux
 23       Calculo el error como la norma de esa diferencia / n
 24       Copio aux en V
 25    Mientras error > epsilon pedido
 26    Devolver res como el autovalor correspondiente al autovector en V
 27 */
 28 
 29 #include <stdio.h>
 30 #include <stdlib.h>
 31 #include <time.h>
 32 #include <math.h>
 33 
 34 #define N 3
 35 
 36 void MultMatVec ( double Mat[][N], double V[], double W[], int n );
 37 double Normaliza ( double V[], int n );
 38 double AutoVyV ( double Mat[][N], double V[], int n, double epsilon );
 39 
 40 int main ()
 41 {
 42    int i,j;
 43    double Mat[N][N] = {{0.0159, 0.2176, 0.4909},
 44                        {0.6283, 0.4054, 0.1294},
 45                        {0.8125, 0.5699,0.5909}};
 46    double V[N], av, eps = 0.00001;
 47    
 48    av = AutoVyV(Mat, V, N, eps);
 49    
 50    printf("Autovalor = %lf\n",av);
 51    printf("Autovector:\n");
 52    
 53    for (i=0; i<N; i++)
 54       printf("\tV[%d] = %lf\n", i, V[i]);
 55       
 56    return 0;
 57 }
 58 
 59 double AutoVyV ( double Mat[][N], double V[], int n, double epsilon )
 60 {
 61    double res, aux[N], diff, err;
 62    int i;
 63    
 64    srand(time(NULL));
 65    
 66    for (i=0; i<n; i++)
 67       V[i] = rand();
 68    err = Normaliza(V,n);
 69    
 70    do 
 71    {
 72       MultMatVec( Mat, V, aux, n );
 73       res = Normaliza( aux, n ); 
 74 
 75       for (i=0; i<n; i++)
 76          V[i] = V[i]-aux[i];
 77 
 78       err = Normaliza( V, n )/n;
 79 
 80       for (i=0; i<n; i++)
 81          V[i] = aux[i];
 82 
 83    } while (err > epsilon);
 84    
 85    return res;
 86 }
 87 
 88 double Normaliza ( double V[], int n )
 89 {
 90    double res=0.;
 91    int i;
 92    
 93    for (i=0; i<n; i++)
 94       res += V[i]*V[i];
 95       
 96    res = sqrt(res);
 97    for (i=0; i<n; i++)
 98       V[i]/=res;
 99       
100    return res;
101 }
102 
103 void MultMatVec ( double Mat[][N], double V[], double W[], int n )
104 {
105    int i,j;
106    
107    for ( i=0; i<n; i++)
108    {
109       W[i] = 0.;
110       for ( j=0; j<n; j++ )
111          W[i] += Mat[i][j] * V[j];
112    }
113    return;
114 }


syntax highlighted by Code2HTML, v. 0.9.1