2 ***********************
3 * Análisis Numérico I *
4 ***********************
8 typedef unsigned int Indice;
11 // Cantidad máxima de elementos
12 const Indice N = 5000;
15 typedef Indice VectorPermutaciones[N];
16 typedef Numero Vector[N];
17 typedef Numero Matriz[N][N];
23 // Declaración de funciones
24 void generar_matriz( Matriz& );
25 void generar_vector( Vector& );
26 void generar_vector_permutaciones( VectorPermutaciones& );
27 void imprimir_matriz( Matriz& );
28 void imprimir_vector( Vector& );
29 void imprimir_matriz_permutada( Matriz&, VectorPermutaciones& );
30 void imprimir_vector_permutado( Vector&, VectorPermutaciones& );
31 void imprimir_matriz_L( Matriz&, VectorPermutaciones& );
32 void imprimir_matriz_U( Matriz&, VectorPermutaciones& );
33 void sustitucion_directa( Matriz&, Vector&, VectorPermutaciones& );
34 void sustitucion_inversa( Matriz&, Vector&, VectorPermutaciones& );
38 // Constantes de error
39 const int MATRIZ_SINGULAR = 1;
41 int main( int argc, char *argv[] ) {
45 VectorPermutaciones p;
47 // Reinicio los numeros aleatorios
48 //srand( time( NULL ) );
50 // Genero matriz al azar
52 // Genero vector al azar
54 // Genero vector de permutaciones
55 generar_vector_permutaciones( p );
58 printf( "Matriz A:\n=========\n" );
62 printf( "Vector b:\n=========\n" );
66 // Recorro por columna (o diagonal).
67 for ( Indice j = 0; j < N; j++ ) {
68 // Busco máximo en la columna para usar de pivote
70 Numero max = fabs( A[j][j] );
71 for ( Indice i = j + 1; i < N; i++ )
72 if ( fabs( A[i][j] ) > max ) {
74 max = fabs( A[i][j] );
77 // Nos fijamos si la matriz es singular
79 return MATRIZ_SINGULAR;
81 // Nos fijamos si hay permutación
83 // Intercambio vector de permutaciones
90 for ( Indice i = j + 1; i < N; i++ ) {
91 // Calculo el m, almacenandolo en A
92 A[p[i]][j] /= A[p[j]][j];
93 // Recorro columna por columna, operando
94 for ( Indice k = j + 1; i < N; i++ )
95 A[p[i]][j] -= A[p[i]][j] * A[p[j]][k]; // Aij = Aij - m * Ajk
99 // Imprimo la matriz modificada
100 printf( "Matriz A modificada:\n====================\n" );
101 imprimir_matriz_permutada( A, p );
103 // Imprimo la matriz L
104 printf( "Matriz L:\n========\n" );
105 imprimir_matriz_L( A, p );
107 // Imprimo la matriz U
108 printf( "Matriz U:\n========\n" );
109 imprimir_matriz_U( A, p );
112 // Calcula solucion de Ly=b
113 sustitucion_directa( A, b, p );
115 // Imprimo el vector solucion y
116 printf( "y (Ly=b):\n=========\n" );
117 imprimir_vector_permutado( b, p );
120 // Calcula solucion de Ux=y
121 sustitucion_inversa( A, b, p );
123 // Imprimo el vector solucion x
124 printf( "x (Ux=y):\n=========\n" );
125 imprimir_vector_permutado( b, p );
132 void generar_matriz( Matriz& m ) {
133 for ( Indice i = 0; i < N; i++ )
134 for ( Indice j = 0; j < N; j++ )
135 m[i][j] = Numero( rand() ) * 3.0 / RAND_MAX;
138 void generar_vector( Vector& v ) {
139 for ( Indice i = 0; i < N; i++ )
140 v[i] = Numero( rand() ) * 3.0 / RAND_MAX;
143 void generar_vector_permutaciones( VectorPermutaciones& v ) {
144 for ( Indice i = 0; i < N; i++ )
148 void imprimir_matriz( Matriz& m ) {
149 for ( Indice i = 0; i < N; i++ ) {
150 for ( Indice j = 0; j < N; j++ )
151 printf( "%.02f ", m[i][j] );
156 void imprimir_vector( Vector& v ) {
157 for ( Indice i = 0; i < N; i++ )
158 printf( "%.02f ", v[i] );
162 void imprimir_matriz_permutada( Matriz& m, VectorPermutaciones& p ) {
163 for ( Indice i = 0; i < N; i++ ) {
164 for ( Indice j = 0; j < N; j++ )
165 printf( "%.02f ", m[p[i]][j] );
170 void imprimir_vector_permutado( Vector& v, VectorPermutaciones& p ) {
171 for ( Indice i = 0; i < N; i++ )
172 printf( "%.02f ", v[p[i]] );
176 void imprimir_matriz_L( Matriz& m, VectorPermutaciones& p ) {
177 for ( Indice i = 0; i < N; i++ ) {
178 for ( Indice j = 0; j < N; j++ )
184 printf( "%.02f ", m[p[i]][j] );
189 void imprimir_matriz_U( Matriz& m, VectorPermutaciones& p ) {
190 for ( Indice i = 0; i < N; i++ ) {
191 for ( Indice j = 0; j < N; j++ )
195 printf( "%.02f ", m[p[i]][j] );
200 void sustitucion_directa( Matriz& A, Vector& b, VectorPermutaciones& p ) {
201 for ( Indice i = 1; i < N; i++ ) {
203 for ( Indice j = 0; j < i - 1; j++ )
204 sum += A[p[i]][j] * b[p[i]];
209 void sustitucion_inversa( Matriz& A, Vector& b, VectorPermutaciones& p ) {
210 for ( Indice i = N; i > 0; i-- ) {
212 for ( Indice j = i; j < N; j++ )
213 sum += A[p[i-1]][j] * b[p[j]];
214 b[p[i-1]] = ( b[p[i-1]] - sum ) / A[p[i-1]][i];