MÉTODO ITERATIVO DE GAUSS_SEIDEL USANDO FORTRAN 90, MATLAB Y SCILAB
1. Año de la Diversificación Productiva y del Fortalecimiento de la
Educación
UNIVERSIDAD NACIONAL
DEL CALLAO
FACULTAD DE CIENCIAS
NATURALES Y MATEMÁTICA
FÍSICA TEÓRICA COMPUTACIONAL
“MÉTODO DE ITERACIÓN GAUSS SEIDEL USANDO
FORTRAN 90, MATLAB Y SCILAB 5.5
PARA UNA SISTEMA LINEAL AX=b”
MARCO ANTONIO ALPACA CHAMBA
ESCUELA PROFESIONAL: FÍSICA
PROGRAM
IMPLICIT NONE
REAL, INTEGER, DISPLAY
BREAK, FUNCTION,
LINSPACE…
2. ENUNCIADO DEL PROBLEMA:
Una esfera maciza de radio r = 20 cm y masa m = 3kg, está en reposo sobre un plano
inclinado de ángulo θ=30°, sostenida por una cuerda horizontal tal y como muestra la
figura. Hallar la reacción normal y la tensión de la cuerda.
SOLUCIÓN:
De las condiciones de equilibrio:
Aplicamos la primera condición para el equilibrio mecánico
𝑵𝒔𝒆𝒏𝛉 = 𝑻 + 𝒇 𝒓 𝒄𝒐𝒔𝜽… (𝟏)
𝑵𝒄𝒐𝒔𝜽 + 𝒇 𝒓 𝒔𝒆𝒏𝜽 = 𝐦𝐠 … (𝟐)
Luego aplicamos la segunda condición para el equilibrio mecánico:
𝑻. 𝑹 − 𝒇 𝒓. 𝒓 = 𝟎
→ 𝑻 = 𝒇 𝒓 …(𝟑)
Así de (3) en (2) y (1) tenemos un sistema matricial como:
𝑵𝒄𝒐𝒔𝜽 + 𝐓𝒔𝒆𝒏𝜽 = 𝐦𝐠
𝑵𝒔𝒆𝒏𝜽 − 𝑻( 𝟏 + 𝒄𝒐𝒔𝜽) = 𝟎
Es decir:
√ 𝟑
𝟐
𝑵 +
𝟏
𝟐
𝑻 = 𝟑𝟎
𝟏
𝟐
𝑵 −
𝟐 + √ 𝟑
𝟐
𝑻 = 𝟎
Si resolvemos el sistema de forma analítica obtendremos:
𝒙 𝟏 = 𝑵 = 𝟑𝟎, 𝒙 𝟐 = 𝑻 = 𝟖. 𝟎𝟑𝟖𝟒 .
Ahora resolveremos este sistema de ecuaciones utilizando el método de Gauss-
Seidel, cuya fórmula numérica es:
𝒂𝒊𝒊 𝒙𝒊
𝒌+𝟏
+ ∑ 𝒂𝒊𝒋 𝒙𝒋
𝒌+𝟏
𝑵
𝑱<𝒊
= 𝒃𝒊 − ∑ 𝒂𝒊𝒋 𝒙𝒋
𝒌
𝑵
𝑱>𝒊
De nuestro sistema de ecuaciones identificamos las matrices:
𝔸 = (
𝟎. 𝟖𝟔𝟔𝟎 𝟎. 𝟓
𝟎. 𝟓 −𝟏. 𝟖𝟔𝟔
); 𝔹 = (
𝟑𝟎
𝟎
); 𝕏 𝟎
= (
𝟎
𝟎
)
Trabajaremos con una tolerancia de 0.001.
Desarrollando la Fórmula tenemos:
3. USANDO FORTRAN TENEMOS:
! MÉTODO DE GAUSS-SEIDEL (GSR)
PROGRAM METHOD_GSR
PARAMETER (IDM=100)
DIMENSION X(IDM,IDM),A(IDM,IDM),B(IDM)
INTEGER:: H,J,I,K,N
REAL:: E,SUMA1,SUMA2,TOL
PRINT*,''
PRINT*,
'====================================================================='
PRINT*,'METHOD ITERATIVO DE GAUSS SEIDEL PARA SISTEMAS LINEALES'
PRINT*,'==================================================================
===='
PRINT*,''
PRINT*,'INGRERSAR ORDENDEL SISTEMA'
READ*,N
PRINT*,('',H=1,70)
PRINT*,'INGRESAR TOLERANCIA'
READ*, TOL
PRINT*,('',H=1,70)
PRINT*,'INGRESAR ELEMENTOS DE A'
4. DO I=1,N
READ (*,*)( A(I,J),J=1,N)
ENDDO
PRINT*,('',H=1,70)
PRINT*,'INGRESAR ELEMENTOS DE B'
DO I=1,N
READ(*,*) B(I)
ENDDO
PRINT*,('',I=1,70)
PRINT*,'INGRESAR VECTOR APROXIMADO X'
K=1
DO I=1,N
READ(*,*) X(K,I)
ENDDO
! CÁLCULO NUMERICO
10 DO I=1,N
SUMA1=0
DO J=1,N
IF (J.GT.I) THEN
SUMA1=SUMA1+A(I,J)*X(K,J)
END IF
END DO
SUMA2=0
DO J=1,N
IF(J.LT.I)THEN
SUMA2=SUMA2+A(I,J)*X(K+1,J)
END IF
END DO
X(K+1,I)=(B(I)-SUMA1-SUMA2)/A(I,I)
END DO
! CONVERGENCIA
DO I=1,N
E=ABS(X(K+1,I)-X(K,I))
IF(E.LE.TOL)THEN
ELSE
K=K+1
GOTO 10
ENDIF
ENDDO
PRINT*,('',H=1,70)
PRINT*,''
PRINT*,('*',I=1,79)
PRINT '(5X,"RESULTADOS COMPUTACIONALES")'
PRINT*,('*',I=1,79)
PRINT*,''
! PRESENTACIÓN DE RESULTADOS
WRITE(*,*) 'RESULTADO DE TODAS LAS ITERACIONES'
PRINT*,''
PRINT 100
100 FORMAT(4X,'ITERATION',5X ,'X',16X,'Y')
DO I=1,K+1
WRITE(*,*) I-1,(X(I,J),J=1,N)
END DO
PRINT*,('',H=1,70)
PRINT*,'LA SOLUTION DEL SISTEMA ES:'
5. DO I=1,N
PRINT*,X(K+1,I)
ENDDO
PRINT*,('',H=1,70)
PRINT*,'CON UNA APPROACH DE:',E
PRINT*,('',H=1,70)
PRINT*,'EL NUMBER DE ITERACIONES ES:',K
PRINT*,('',H=1,70)
END
USANDO MATLAB TENEMOS:
teta=30*pi/180;
m=3;
a11=cos(teta); a12=sin(teta);
a21=a12; a22=-1*(1+cos(teta));
b11=10*m; b21=0;
Ab=[a11 a12 b11;a21 a22 b21];
x=[0 0];
acc=1e-3;
6. [n,t]=size(Ab);
b=Ab(1:n,t);
R=1;
k=1;
d(1,1:n+1)=[0 x];
k=k+1;
disp(' iteration x1 x2')
while R>acc
for i=1:n;
sum=0;
for j=1:n
if j<=i-1
sum = sum+Ab(i,j)*d(k,j+1);
elseif j>=i+1
sum = sum + Ab(i,j)*d(k-1,j+1);
end
end
x(1,i)=(1/Ab(i,i))*(b(i,1)-sum);
d(k,1)=k-1;d(k,i+1)=x(1,i);
end
R=max(abs((d(k,2:n+1)-d(k-1,2:n+1))));
k=k+1;
if R>100 && K>10; ('Gauss-seidel method is Diverges');break
end
end
x=d;
disp(x);
resp=x(k-1,2:t);
disp('el vector solution es:[N T]t')
disp(resp');
USANDO SCILAB TENEMOS:
teta=30*%pi/180;
m=3;
a11=cos(teta); a12=sin(teta);
a21=a12; a22=-1*(1+cos(teta));
b11=10.0*m; b21=0;
Ab=[a11 a12 b11;a21 a22 b21];
x=[0 0];
acc=1e-3;
[n,t]=size(Ab);
b=Ab(1:n,t);
R=1;
k=1;
7. d(1,1:n+1)=[0 x];
k=k+1;
disp('iteration x1 x2')
while R>acc
for i=1:n;
sum1=0;
for j=1:n
if j<=i-1
sum1 = sum1+Ab(i,j)*d(k,j+1);
elseif j>=i+1
sum1 = sum1 + Ab(i,j)*d(k-1,j+1);
end
end
x(1,i)=(1/Ab(i,i))*(b(i,1)-sum1);
d(k,1)=k-1;d(k,i+1)=x(1,i);
end
R=max(abs((d(k,2:n+1)-d(k-1,2:n+1))));
k=k+1;
if R>100 & K>10; ('Gauss-seidel method is Diverges');break
end
end
x=d;
disp(x);
resp=x(k-1,2:t);
disp('el vector solution es:[N T]t')
disp(resp');