]> git.llucax.com Git - z.facultad/75.12/ejercicios.git/blob - lib_lineal.h
Import inicial después del "/var incident". :(
[z.facultad/75.12/ejercicios.git] / lib_lineal.h
1 /* lib_lineal.h
2  ***********************
3  * Análisis Numérico I *
4  ***********************
5  */
6
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <math.h>
10 #include "tipos.h"
11
12 // Declaración de funciones
13 inline void generar_matriz( Matriz& );
14 inline void generar_vector( Vector& );
15 inline void generar_vector_permutaciones( VectorPermutaciones& );
16 inline void imprimir_matriz( Matriz& );
17 inline void imprimir_vector( Vector& );
18 inline void imprimir_matriz_permutada( Matriz&, VectorPermutaciones& );
19 inline void imprimir_vector_permutado( Vector&, VectorPermutaciones& );
20 inline void imprimir_matriz_L( Matriz&, VectorPermutaciones& );
21 inline void imprimir_matriz_U( Matriz&, VectorPermutaciones& );
22 inline void sustitucion_directa( Matriz&, Vector&, VectorPermutaciones& );
23 inline void sustitucion_inversa( Matriz&, Vector&, VectorPermutaciones& );
24
25 inline void generar_matriz( Matriz& m ) {
26     for ( Indice i = 0; i < N; i++ )
27         for ( Indice j = 0; j < N; j++ )
28             m[i][j] = Numero( rand() ) * 3.0 / RAND_MAX;
29 }
30
31 inline void generar_vector( Vector& v ) {
32     for ( Indice i = 0; i < N; i++ )
33         v[i] = Numero( rand() ) * 3.0 / RAND_MAX;
34 }
35
36 inline void generar_vector_permutaciones( VectorPermutaciones& v ) {
37     for ( Indice i = 0; i < N; i++ )
38         v[i] = i;
39 }
40
41 inline void imprimir_matriz( Matriz& m ) {
42     for ( Indice i = 0; i < N; i++ ) {
43         for ( Indice j = 0; j < N; j++ )
44             printf( "%.02f ", m[i][j] );
45         printf( "\n" );
46     }
47 }
48
49 inline void imprimir_vector( Vector& v ) {
50     for ( Indice i = 0; i < N; i++ )
51         printf( "%.02f ", v[i] );
52     printf( "\n" );
53 }
54
55 inline void imprimir_matriz_permutada( Matriz& m, VectorPermutaciones& p ) {
56     for ( Indice i = 0; i < N; i++ ) {
57         for ( Indice j = 0; j < N; j++ )
58             printf( "%.02f ", m[p[i]][j] );
59         printf( "\n" );
60     }
61 }
62
63 inline void imprimir_vector_permutado( Vector& v, VectorPermutaciones& p ) {
64     for ( Indice i = 0; i < N; i++ )
65         printf( "%.02f ", v[p[i]] );
66     printf( "\n" );
67 }
68
69 inline void imprimir_matriz_L( Matriz& m, VectorPermutaciones& p ) {
70     for ( Indice i = 0; i < N; i++ ) {
71         for ( Indice j = 0; j < N; j++ )
72             if ( i < j )
73                 printf( "0.00 " );
74             else if ( i == j )
75                 printf( "1.00 " );
76             else
77                 printf( "%.02f ", m[p[i]][j] );
78         printf( "\n" );
79     }
80 }
81
82 inline void imprimir_matriz_U( Matriz& m, VectorPermutaciones& p ) {
83     for ( Indice i = 0; i < N; i++ ) {
84         for ( Indice j = 0; j < N; j++ )
85             if ( i > j )
86                 printf( "0.00 " );
87             else
88                 printf( "%.02f ", m[p[i]][j] );
89         printf( "\n" );
90     }
91 }
92
93 inline void sustitucion_directa( Matriz& A, Vector& b, VectorPermutaciones& p ) {
94     for ( Indice i = 1; i < N; i++ ) {
95         Numero sum = 0;
96         for ( Indice j = 0; j < i - 1; j++ )
97             sum += A[p[i]][j] * b[p[i]];
98         b[p[i]] -= sum;
99     }
100 }
101
102 inline void sustitucion_inversa( Matriz& A, Vector& b, VectorPermutaciones& p ) {
103     for ( Indice i = N; i > 0; i-- ) {
104         Numero sum = 0;
105         for ( Indice j = i; j < N; j++ )
106             sum += A[p[i-1]][j] * b[p[j]];
107         b[p[i-1]] = ( b[p[i-1]] - sum ) / A[p[i-1]][i];
108     }
109 }