Anda di halaman 1dari 11

Problema 1.

- Por lo general, los sistemas de ecuaciones lineales, A*X=B, se resuelven con


mtodos numricos directos basados en la factorizacin LU. Empleando el mtodo de
factorizacin de Crout, resuelva el siguiente sistema de ecuaciones:

|
|
|
|
|
.
|

\
|

=
|
|
|
|
|
.
|

\
|
|
|
|
|
|
.
|

\
|
62
16
20
75
41 41 27 6
29 18 9 2
33 17 15 4
6 24 15 3
4
3
2
1
x
x
x
x


Calcule el determinante de A.

Nota: Se debern de reportar todos los clculos hechos a mano.

[

] [

] [


Para i = 2,3,n ; i j

] [() ()]

] [() ()]

[(

) (

)] [() () () ()]

[(

)] [() ()]

[(

) (

)] [() () () ()]

[(

) (

) (

)] [() () () () () ()]


Para i = 2,3, , n-1 ; i < j

[() ()]

[() ()]

[() () () ()]




[




]

[




]

[




]

Det A = Det L *Det U

Det A = (3)(-5)(5)(6) = -450

Para obtener las xs

Primero tenemos que: L*Z = Y, con sustitucin hacia delante se obtienen las zs

[




] [

] [

()

()

()()()

]
Posterior a esto se sabe que: U*X = Z, con sustitucin hacia atrs se obtienen las xs
[




] [

] [

()

() ()

() () ()

]



Problema 2.- El mtodo de factorizacin de Choleski se utiliza para resolver sistemas de
ecuaciones lineales A*X=B, donde la matriz de coeficientes A es simtrica positiva definida.
Empleando el mtodo de Choleski, resuelva el siguiente sistema de ecuaciones:

[


Factorizacin:

[



Procedimiento:

()

()

()

] ( )

[ ]

[ ]

] ( )

[ ]

] ( )


Sustitucin hacia delante.
U
t
Z=Y

[

()

() ()

() () ()

() () () ()


Sustitucion hacia atrs:
UX=Z
[

( )

( () ())

( () () ())

( () () () ())




Problema 3.- Repita el problema anterior reemplazando el elemento a
55
= 115 por a
55
= 90.
Repita el problema anterior reemplazando el elemento a55 = 115 por a55 = 74.

Para este problema, todo queda igual, menos el elemento de la columna 5 y rengln 5 (u
55
), por lo que este
elemento al cambiar a
55
a 90, queda de la siguiente manera:

] ( )


[



Ya que en la diagonal existe un cero, el determinante de la matriz A es igual a cero, con esto se puede
concluir el sistema no tiene solucin.

Al cambiar el elemento a
55
a 74, el elemento u
55
queda de la siguiente manera:

] ( )

Al ser u
55
un nmero imaginario, este sistema de ecuaciones no puede ser resuelto por este mtodo, debido
a que este mtodo solo funciona para matrices simtricas positivas definidas y de acuerdo al teorema 6.25 del libro
Numerical Analysis de Burden y Faires:

Teorema 6.25
Una matriz simtrica A es definida positiva si y slo si sus primeras sub matrices principales tienen
determinante positivo.

En este caso tenemos A =
[



Det A
1
= det [9] = 9 >0

Det A
2
= det [


] = 324 >0

Det A
3
= det[



] =8100 > 0

Det A
4
= det [




]=129600 > 0

Det A = det
[

= -2073599 < 0 por lo tanto la matriz simtrica A no es definida positiva.






























Problema 4.- El mtodo de factorizacin de Crout se puede utilizar para obtener la matriz
inversa de A. Para esto, se factoriza la matriz A una vez, y se realizan las operaciones de
sustitucin hacia delante y hacia atrs para obtener cada columna de la matriz inversa. Modifique
el programa soecliga.f90 para que llame a las subrutinas ludcmp.for y lubksb.for de la coleccin
Numerical Recipes y obtenga la matriz inversa de:

(
(
(
(



=
4.0 6.0 5.0 9.0
5.0 3.0 7.0 4.0
3.0 8.0 3.0 2.0
5.0 2.0 6.0 5.0
A

En el programa se debe de incluir el clculo del determinante de A.


Nota: Se adjunta el programa soecliga.f90 y las subrutinas ludcmp.for y lubksb.for. La
documentacin de las subrutinas ludcmp.for y lubksb.for se encuentra en las pginas 38, 39 y 40
del libro Numerical Recipes in Fortran, The Art of Scientific Computing. La manera como se
calcula el determinante viene en la pgina 41. La versin electrnica del libro de consulta se
encuentra en el portal http://www.nr.com.

Respuesta:
El problema 4 pide utilizar el mtodo de factorizacin de Crout y calcular la matriz inversa de A.
En primera instancia, se obtiene las subrutina LUDCMP.for y la subrutina LUBKSB.for, que
hacen los siguiente, respectivamente:

LUDCMP.for: Dada una matriz A, de NxN, esta subrutina la descompone utilizando el mtodo
de factorizacin LU (en el mtodo de Crout, los unos quedan en la diagonal de la U). El vector
indx es un vector de longitud N (tamao de la matriz), que guarda la rutina de permutacin,
afectada por el mtodo de pivoteo parcial, en el cual se calculan multiplicadores para realizar las
operaciones elementales. Esta rutina es utilizada de forma combinada con LUBKSB para
resolver ecuaciones lineales o invertir matrices.
La subrutina se presenta a continuacin:

SUBROUTINE ludcmp(a,n,np,indx,d)
integer n,np,indx(n),nmax
real d,a(np,np),TINY
parameter (nmax=640,Tiny=1.0e-20)
integer i,imax,j,k
real aamax,dum,sum,vv(NMAX)
d=1.
do i=1,n
aamax=0.
do j=1,n
if(abs(a(i,j)).gt.aamax) aamax=abs(a(i,j))
enddo
if(aamax.eq.0) pause 'singular matrix in ludcmp'
vv(i)=1./aamax
enddo


do j=1,n
do i=1,j-1
sum=a(i,j)
do k=1,i-1
sum=sum-a(i,k)*a(k,j)
enddo
a(i,j)=sum
enddo
aamax=0.
do i=j,n
sum=a(i,j)
do k=1,j-1
sum=sum-a(i,k)*a(k,j)
enddo
a(i,j)=sum
dum=vv(i)*abs(sum)
if(dum.ge.aamax)then
imax=i
aamax=dum
endif
enddo
if(j.ne.imax)then
do k=1,n
dum=a(imax,k)
a(imax,k)=a(j,k)
a(j,k)=dum
enddo
d=-d
vv(imax)=vv(j)
endif
indx(j)=imax
if(a(j,j).eq.0.)a(j,j)=tiny
if(j.ne.n)then
dum=1./a(j,j)
do i=j+1,n
a(i,j)=a(i,j)*dum
enddo
endif
enddo
return
end













LUBKSB.for. Esta subrutina calcula las ecuaciones lineales A*X=B. Aqu la matriz a de N*N, la
matriz descompuesta con el mtodo de factorizacin LU en la subrutina LUDCMP es la entrada
al algoritmo, no la matriz original A. El vector indx es el vector de permutacin de longitud N
que genera LUDCMP. b es entrada y se refiere al vector del lado derecho B, tambin de longitud
N. La subrutina lo regresa como el vector de solucin X.

SUBROUTINE lubksb(a,n,np,indx,b)


integer n,np,indx(n)
real a(np,np),b(n)
integer i,ii,j,ll
real sum

ii=0
do i=1,n
ll=indx(i)
sum=b(ll)
b(ll)=b(i)

if(ii.ne.0)then
do j=ii,i-1
sum=sum-a(i,j)*b(j)
enddo
else if(sum.ne.0.)then
ii=i
endif
b(i)=sum
enddo
do i=n,1,-1
sum=b(i)
do j=i+1,n
sum=sum-a(i,j)*b(j)
enddo
b(i)=sum/a(i,i)
enddo
Return

end















Se pide utilizar el programa soecliga.f90 y las subrutinas mencionadas previamente para obtener la
inversa y el determinante de una matriz, con el mtodo de factorizacin LU. Para esto, se
modifica la soecliga.f90. Las modificaciones se presentan a continuacin:

PROGRAM SOECLIGA
IMPLICIT NONE
INTEGER :: I, II
INTEGER :: J, M, N
INTEGER, PARAMETER :: DI=100
REAL :: A(DI,DI), Y(DI,DI), INV(DI,DI)
REAL :: DET, CTE
CHARACTER (LEN=12) :: ARCHDT, ARCHRS
INTEGER indx(DI)
REAL d
WRITE (*,10)
10 FORMAT ( 'TECLEE EL NOMBRE DEL ARCHIVO DE DATOS > ')
READ (*,20) ARCHDT
20 FORMAT (A12)
WRITE (*,30)
30 FORMAT ( 'TECLEE EL NOMBRE DEL ARCHIVO DE RESULTADOS > ')
READ (*,20) ARCHRS
OPEN (5, FILE=ARCHDT)
OPEN (6, FILE=ARCHRS, STATUS='UNKNOWN')
!
! LECTURA Y ESCRITURA DE DATOS
!
READ (5,*) N
READ (5,*) ((A(I,J), J=1,N), I=1,N)

WRITE (*,40) N
WRITE (6,40) N
40 FORMAT (3X, 'RANGO DE LA MATRIZ A = ', I3, ///)
WRITE (*,50)
WRITE (6,50)
50 FORMAT (3X, 'MATRIZ DE COEFICIENTES', //)
DO I=1,N
WRITE (*,60) (A(I,J), J=1,N)
WRITE (6,60) (A(I,J), J=1,N)
60 FORMAT (10(2X, E12.6))
END DO

!CALCULO DE LA MATRIZ IDENTIDAD

DO I =1, N
DO J=1, N
Y(I,J) = 0
ENDDO
Y(I,I) = 1
END DO

!FACTORIZACION LU POR EL METODO DE CROUT
CALL ludcmp(A,N,DI,indx,d)

!DETERMINANTE
DO J=1,N
d = d*A(J,J)
END DO

WRITE (*,57) d
WRITE (6,57) d
57 FORMAT (3X, 'DETERMINANTE DE LA MATRIZ A = ', E12.6, ///
Se establecen nuevas variables
integer y real que necesitar el
programa para poder llamar
correctamente las subrutinas.

En la lectura de los datos, no es
necesario leer el vector de
parmetros, por la forma de la matriz
por tanto, se elimina del programa la
parte de lectura y escritura del
vector.

Se utiliza el algoritmo original del
programa para generar la matriz
identidad.

Se llama la subrutina LUDCMP,
para realizar la factorizacin LU.



Se utiliza el algoritmo original del
programa para calcular el
determinante de la matriz, y se
escriben los datos.

!CALCULO DE LA INVERSA
DO J=1,N
CALL lubksb(A,N,DI,indx,Y(1,J))
DO I= 1,N
INV(I,J) = Y(I,J)
END DO
END DO

WRITE (*,55)
WRITE (6,55)
55 FORMAT (3X, 'MATRIZ INVERSA', /)
DO I=1,N
WRITE (*,60) (INV(I,J), J=1,N)
WRITE (6,60) (INV(I,J), J=1,N)
END DO

END PROGRAM SOECLIGA

RESULTADOS:
Una vez que ya se tenan las subrutinas, se siguieron los siguientes pasos:

Paso 1. Se genero un archivo de datos con la informacin de la matriz.
Paso 2. Se modific el programa original SOECLIGA.f90. para llamar a las subrutinas mencionadas.
Paso 3. Se prob el programa.
Paso 4. Obtencin de resultados.









Se calcula la inversa, llamando la
subrutina LUBKSB y guardando los
datos en INV(I,J).

Se escriben los datos y se termina el
programa.

Anda mungkin juga menyukai