2 ***********************
3 * Análisis Numérico I *
4 ***********************
8 typedef unsigned int Indice;
11 // Cantidad máxima de elementos
12 const Indice N = 1000;
15 typedef Indice VectorPermutaciones[N];
16 typedef Numero Vector[N];
17 typedef Numero Matriz[N][N];
24 inline void generar_vector( Vector& v ) {
25 for ( Indice i = 0; i < N; i++ )
26 v[i] = Numero( rand() ) * 3.0 / RAND_MAX;
29 inline void generar_vector_permutaciones( VectorPermutaciones& v ) {
30 for ( Indice i = 0; i < N; i++ )
34 inline void imprimir_matriz( Matriz& m ) {
35 for ( Indice i = 0; i < N; i++ ) {
36 for ( Indice j = 0; j < N; j++ )
37 printf( "%.02f ", m[i][j] );
42 inline void imprimir_vector( Vector& v ) {
43 for ( Indice i = 0; i < N; i++ )
44 printf( "%.02f ", v[i] );
48 inline void imprimir_matriz_permutada( Matriz& m, VectorPermutaciones& p ) {
49 for ( Indice i = 0; i < N; i++ ) {
50 for ( Indice j = 0; j < N; j++ )
51 printf( "%.02f ", m[p[i]][j] );
56 inline void imprimir_vector_permutado( Vector& v, VectorPermutaciones& p ) {
57 for ( Indice i = 0; i < N; i++ )
58 printf( "%.02f ", v[p[i]] );
62 inline void imprimir_matriz_L( Matriz& m, VectorPermutaciones& p ) {
63 for ( Indice i = 0; i < N; i++ ) {
64 for ( Indice j = 0; j < N; j++ )
70 printf( "%.02f ", m[p[i]][j] );
75 inline void imprimir_matriz_U( Matriz& m, VectorPermutaciones& p ) {
76 for ( Indice i = 0; i < N; i++ ) {
77 for ( Indice j = 0; j < N; j++ )
81 printf( "%.02f ", m[p[i]][j] );
86 inline void sustitucion_directa( Matriz& A, Vector& b, VectorPermutaciones& p ) {
87 for ( Indice i = 1; i < N; i++ ) {
89 for ( Indice j = 0; j < i - 1; j++ )
90 sum += A[p[i]][j] * b[p[i]];
95 inline void sustitucion_inversa( Matriz& A, Vector& b, VectorPermutaciones& p ) {
96 for ( Indice i = N; i > 0; i-- ) {
98 for ( Indice j = i; j < N; j++ )
99 sum += A[p[i-1]][j] * b[p[j]];
100 b[p[i-1]] = ( b[p[i-1]] - sum ) / A[p[i-1]][i];
103 // Constantes de error
104 const int MATRIZ_SINGULAR = 1;
106 int main( int argc, char *argv[] ) {
110 VectorPermutaciones p;
112 // Reinicio los numeros aleatorios
113 //srand( time( NULL ) );
115 // Genero matriz al azar
117 // Genero vector al azar
119 // Genero vector de permutaciones
120 generar_vector_permutaciones( p );
123 printf( "Matriz A:\n=========\n" );
124 imprimir_matriz( A );
127 printf( "Vector b:\n=========\n" );
128 imprimir_vector( b );
131 // Recorro por columna (o diagonal).
132 for ( Indice j = 0; j < N; j++ ) {
133 // Busco máximo en la columna para usar de pivote
135 Numero max = fabs( A[j][j] );
136 for ( Indice i = j + 1; i < N; i++ )
137 if ( fabs( A[i][j] ) > max ) {
139 max = fabs( A[i][j] );
142 // Nos fijamos si la matriz es singular
144 return MATRIZ_SINGULAR;
146 // Nos fijamos si hay permutación
148 // Intercambio vector de permutaciones
149 Indice aux = p[maxi];
155 for ( Indice i = j + 1; i < N; i++ ) {
156 // Calculo el m, almacenandolo en A
157 A[p[i]][j] /= A[p[j]][j];
158 // Recorro columna por columna, operando
159 for ( Indice k = j + 1; i < N; i++ )
160 A[p[i]][j] -= A[p[i]][j] * A[p[j]][k]; // Aij = Aij - m * Ajk
164 // Imprimo la matriz modificada
165 printf( "Matriz A modificada:\n====================\n" );
166 imprimir_matriz_permutada( A, p );
168 // Imprimo la matriz L
169 printf( "Matriz L:\n========\n" );
170 imprimir_matriz_L( A, p );
172 // Imprimo la matriz U
173 printf( "Matriz U:\n========\n" );
174 imprimir_matriz_U( A, p );
177 // Calcula solucion de Ly=b
178 sustitucion_directa( A, b, p );
180 // Imprimo el vector solucion y
181 printf( "y (Ly=b):\n=========\n" );
182 imprimir_vector_permutado( b, p );
185 // Calcula solucion de Ux=y
186 sustitucion_inversa( A, b, p );
188 // Imprimo el vector solucion x
189 printf( "x (Ux=y):\n=========\n" );
190 imprimir_vector_permutado( b, p );
197 inline void generar_matriz( Matriz& m ) {
198 for ( Indice i = 0; i < N; i++ )
199 for ( Indice j = 0; j < N; j++ )
200 m[i][j] = Numero( rand() ) * 3.0 / RAND_MAX;