Mostrando entradas con la etiqueta Sistemas de Ecuaciones. Mostrar todas las entradas
Mostrando entradas con la etiqueta Sistemas de Ecuaciones. Mostrar todas las entradas

jueves, 8 de octubre de 2009

El dueño de la pintura


Un sistema de ecuaciones se resuelve por eliminación gaussiana cuando se obtienen sus soluciones mediante la reducción del sistema dado a otro equivalente en el que cada ecuación tiene una incógnita menos que la anterior. Para la reducir los sistemas es habitual acudir a estrategias de pivoteo.

Varias son las formas de pivoteo, el propósito de las mismas es usar como pivote el elemento de mayor magnitud (en valor absoluto) y, una vez colocado en la diagonal principal del sistema, usarlo para eliminar los restantes elementos de la columan que están por debajo de él.

Al trabajar con precisión finita, cada vez que se produce una operación aritmética se comete un error, en este caso de representación (redondeo). Es por eso que la elección del pivote en cada paso resulta importante para tratar que dicho sea el menor posible.

La estrategia más sencilla consiste en escoger el elemento en la misma columna que está debajo de la diagonal y que tiene el máximo valor absoluto. A esta técnica se le denomina Pivoteo Parcial o Pivoteo de Columna Máxima.

El Pivoteo Total o Máximo, consiste en la busqueda en el k-esimo paso de eliminación gaussiana todos los elementoa aij para i = k, k+1, ..., n; j = k, k+1, ..., n a fin de localizar el de mayor magnitud. Los intercambios de filas y columnas se realizan para situar ese elemento en la posición del pivote.

Para los Hijos de Kutta, nadie ha pivoteado mejor que el gran Arvydas Romas Sabonis en aquellos tiempos del Zalguiris Kaunas y la selección soviética. Doscientos veinte centímetros, talento supremo y una biblioteca entera de libros de la Editorial Mir hacían que ningún sistema pudiera con él.

lunes, 13 de abril de 2009

Norma mía

Siempre existe una NORMA que a uno lo representa mejor.


(se recomienda acompañar esta lectura dejándose invadir por las hermosas canciones bitonales que vienen siendo ejecutadas por NORMA desde La Plata)

lunes, 30 de marzo de 2009

Eliminado

Dicen que este método ya existía cuando Carl Friedrich Gauss, allá por 1800 presentó este algoritmo. Más precisamente en un histórico libro chino (Jiuzhang suanshu). Oriente versus Occidente. Los laureles se los llevó el mismísimo Carl Friedrich, aún a pesar de Wilhelm Jordan su compañero de fórmula.

Un sistema de ecuaciones se resuelve por eliminación gaussiana cuando se obtienen sus soluciones mediante la reducción del sistema dado a otro equivalente en el que cada ecuación tiene una incógnita menos que la anterior. Pivoteos y sustituciones inversas o directas deambulan por este método. Aqui, un ejemplo de código escrito en noble fortran.

! --------- PROGRAMA ELIMINACIÓN GAUSSIANA -------------------
! gauss.f90
! Resuelve sistemas de ecuaciones lineales de hasta 20x20

program gaussian

! datos.dat
! NÚMERO DE ECUACIONES
! N
! COEFICIENTES DE LA MATRIZ A(I,J)
! a11, a12, ..., a1N
! a21, a22, ..., a2N
! ...........................
! aN1, aN2, ..., aNN
! VECTOR INDEPENDIENTE
! b1, b2, ..., BN

PARAMETER (IN=20)
REAL :: A(IN,IN), B(IN)

OPEN(1,FILE='datos.dat',STATUS='OLD')
READ (1,*)
READ (1,*) N
READ (1,*)
READ (1,*) ((A(I,J),J=1,N),I=1,N)
READ (1,*)
READ (*,*) (B(I),I=1,N)
CLOSE(1)

OPEN(2,FILE='resultados.dat',STATUS='UNKNOWN')
WRITE (2,*) ('**** ELIMINACIÓN GAUSSIANA ****')
WRITE (2,*)
WRITE (2,*) ('COEFICIENTES DE LA MATRIZ ingresados:')
CALL PRINTA(A,IN,N,N,2)
WRITE(2,*)
WRITE(2,*) ('VECTOR INDEPENDIENTE ingresado:')
CALL PRINTV(B,N,2)
WRITE(2,*)

! CONVERTIR A LA FORMA TRIANGULO SUPERIOR
DO K = 1,N-1
IF (ABS(A(K,K)).GT.1.E-6) THEN
DO I = K+1, N
X = A(I,K)/A(K,K)
DO J = K+1, N
A(I,J) = A(I,J) -A(K,J)*X
ENDDO
B(I) = B(I) - B(K)*X
ENDDO
ELSE
WRITE (2,*) 'PIVOT CERO en la línea:'
WRITE (2,*) K
STOP
END IF
ENDDO
WRITE(2,*) 'MATRIZ MODIFICADA'
CALL PRINTA(A,IN,N,N,2)
WRITE(2,*)
WRITE(2,*) 'VECTOR INDEPENDIENTE MODIFICADO'
CALL PRINTV (B,N,2)
WRITE(2,*)

! SUSTITUCION INVERSA
DO I = N,1,-1
SUM = B(I)
IF (I.LT.N) THEN
DO J= I+1,N
SUM = SUM - A(I,J)*B(J)
ENDDO
END IF
B(I) = SUM/A(I,I)
ENDDO

! IMPRIMIR LOS RESULTADOS
write(2,*) ('VECTOR SOLUCIÓN')
CALL PRINTV(B,N,2)

END PROGRAM GAUSSIAN
!------------------------------------------

SUBROUTINE PRINTA(A,IA,M,N,ICH)
! ESCRIBE LA MATRIZ A
REAL A(IA,*)
DO I =1,M
WRITE(ICH,2) (A(I,J),J=1,N)
ENDDO
2 FORMAT(1X,6E12.4)
END SUBROUTINE PRINTA
!-----------------------------------------

SUBROUTINE PRINTV(VEC,N,ICH)
! ESCRIBE EL VECTOR INDEPENDIENTE
REAL VEC(*)
WRITE(ICH,1) (VEC(I),I=1,N)
1 FORMAT(1X,6E12.4)
END SUBROUTINE PRINTV
!-----------------------------------------