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