1 /* lineal_iterativo.cpp
5 * Para direccionar la salida a un archivo, ejecutelo con:
7 * lineal_iterativo > [archivo]
9 * Para compilar en *nix:
11 * gcc -lm -Wall -O3 -o lineal_iterativo lineal_iterativo.cpp
14 * gcc -lm -Wall -g3 -o lineal_iterativo lineal_iterativo.cpp
21 // Constantes de error
22 const int MATRIZ_SINGULAR = 1;
23 const int MAXIMO_ITERACIONES = 2;
25 // Declaración de funciones
26 Numero* cargar_matriz( const char* );
31 VectorPermutaciones p;
33 int main( int argc, char *argv[] ) {
35 // Reinicio los numeros aleatorios
36 //srand( time( NULL ) );
38 // Genero matriz al azar
40 // Genero vector al azar
42 // Genero vector de permutaciones
43 generar_vector_permutaciones( p );
46 printf( "Matriz A:\n=========\n" );
50 printf( "Vector b:\n=========\n" );
54 // Recorro por columna (o diagonal).
55 for ( Indice j = 0; j < N; j++ ) {
56 // Busco máximo en la columna para usar de pivote
58 Numero max = fabs( A[j][j] );
59 for ( Indice i = j + 1; i < N; i++ )
60 if ( fabs( A[i][j] ) > max ) {
62 max = fabs( A[i][j] );
65 // Nos fijamos si la matriz es singular
67 return MATRIZ_SINGULAR;
69 // Nos fijamos si hay permutación
71 // Intercambio vector de permutaciones
78 for ( Indice i = j + 1; i < N; i++ ) {
79 // Calculo el m, almacenandolo en A
80 A[p[i]][j] /= A[p[j]][j];
81 // Recorro columna por columna, operando
82 for ( Indice k = j + 1; i < N; i++ )
83 A[p[i]][k] -= A[p[i]][j] * A[p[j]][k]; // Aij = Aij - m * Ajk
87 // Imprimo la matriz modificada
88 printf( "Matriz A modificada:\n====================\n" );
89 imprimir_matriz_permutada( A, p );
91 // Imprimo la matriz L
92 printf( "Matriz L:\n========\n" );
93 imprimir_matriz_L( A, p );
95 // Imprimo la matriz U
96 printf( "Matriz U:\n========\n" );
97 imprimir_matriz_U( A, p );
100 // Calcula solucion de Ly=b
101 sustitucion_directa( A, b, p );
103 // Imprimo el vector solucion y
104 printf( "y (Ly=b):\n=========\n" );
105 imprimir_vector_permutado( b, p );
108 // Calcula solucion de Ux=y
109 sustitucion_inversa( A, b, p );
111 // Imprimo el vector solucion x
112 printf( "x (Ux=y):\n=========\n" );
113 imprimir_vector_permutado( b, p );
120 Numero* cargar_matriz( const char* archivo ) {
125 f = fopen( archivo, "r" );
128 n = Indice( atol( fgets( s, 4095, f ) ) );
129 for ( Indice i = 0; !feof( f ) || ( i > n ); i++ ) {