Ecuación diferencial parabólica usando el método crank nicholson en fortran, ...
COMPARACIÓN DE LOS MÉTODOS ITERATIVOS ADAMAS-BALTHOR-MOULT PREDICTOR CORRECTOR CON RUNGE KUTTA USANDO FORTRAN 90 Y MATLAB
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
“COMPARACIÓN DE LOS MÉTODOS ITERATIVOS
ADAMAS-BALTHOR-MOULT PREDICTOR
CORRECTOR CON RUNGE KUTTA USANDO
FORTRAN 90 Y MATLAB”
MARCO ANTONIO ALPACA CHAMBA
FÍSICO BÁSICO
2. ENUNCIADO DEL PROBLEMA:
Use los métodos de RK4 y Adams-Moulton predictor corrector con h=0.05, para obtener
una aproximación de 𝒚 𝟏.𝟑 para la solución de la siguiente ecuación diferencial:
𝒚′
= 𝒙 𝟐
− 𝟐
𝒚
𝒙
, 𝒚(𝟏) = 𝟏.
SOLUCIÓN:
Usando fortran 90 tenemos:
PROGRAM ADAMS_MOULTON_PREDICTOR_CORRECTOR
PARAMETER (IDM=100)
DIMENSION XR(IDM),YR(IDM),Z(IDM,IDM),CP(4),CC(4)
REAL ,PARAMETER::CP=(/55.0,-59.0,37.0,-9.0/)
REAL ,PARAMETER::CC=(/9.0,19.0,-5.0,1.0/)
REAL X0,X1,Y0,K1,K2,K3,K4,H,XR,YR,M,TOL
INTEGER::K
OPEN(UNIT=11,FILE='KUTA4.TXT',STATUS='UNKNOWN',ACTION='WRITE')
PRINT*,''
PRINT*, '=========================================================='
PRINT*,'METHOD DE ADAMS-MOULTON PARA EDO DE LA FORMA DY/DX=F(X,Y)'
PRINT*,'============================================================'
PRINT*,''
PRINT*,'INGRESAR EL VALOR INICIAL DE X(ES DECIR X0):'
READ(5,*)X0
PRINT*, 'INGRESAR EL VALOR FINAL DE X:'
READ*, X1
PRINT*, 'INGRESAR EL VALOR INICAL DE Y(EN X0):'
READ*, Y0
PRINT*, 'INGRESAR LONGITUD DE PASO,H:'
READ*,H
PRINT*, 'INGRESAR TOLERANCIA'
READ*, TOL
PRINT*,''
PRINT*,('*',I=1,79)
PRINT '(5X,"RESULTADOS COMPUTACIONALES")'
PRINT*,('*',I=1,79)
PRINT*,''
NMAX=(X1-X0)/H
YR(1)=Y0
XR(1)=X0
K=1
!APLICANDO RUNGE KUTTA
PRINT 90
90 FORMAT(3X,'RUNGE KUTA METHOD TO START:'/)
PRINT 50
50 FORMAT(3X,'DATOS',8X,'TIME',13X,'POSITION')
PRINT'(2X,I3,8X,F8.3,6X,F12.4)',1,XR(1),YR(1)
DO I=1,3
K1=F(YR(I),XR(I))
K2=F(YR(I)+H*(K1/2),XR(I)+(H/2))
K3=F(YR(I)+H*(K2/2),XR(I)+(H/2))
K4=F(YR(I)+H*K3,XR(I)+H)
YR(I+1)=YR(I)+(H/6)*(k1+2*k2+2*k3+k4)
XR(I+1)=XR(I)+H
K=K+1
WRITE(11,60)K,XR(I+1),YR(I+1)
PRINT'(2X,I3,8X,F8.3,6X,F12.4)',K,XR(I+1),YR(I+1)
3. END DO
DO I=4,NMAX+1
XR(I+1)=XR(I)+H
ENDDO
60 FORMAT (2X,I3,8X,F8.3,6X,F12.4)
PRINT*,''
PRINT 110
110 FORMAT(/3X,'PROCEDIMIENTO PREDICTOR-CORRECTOR:'/)
DO J=1,4
WRITE (*,111)J,CP(J)
111 FORMAT (2X,'CP(',I2,')=',F12.4)
ENDDO
PRINT*,''
DO I=1,4
WRITE (*,112)I,CC(I)
112 FORMAT (2X,'CC(',I2,')=',F12.4)
ENDDO
PRINT 70
70 FORMAT(/3X,'DATOS',8X,'TIME',13X,'POSITION')
DO J=4,NMAX+1
Z(1,J+1)=YR(J)+H/24*(55*F(YR(J),XR(J))-59*F(YR(J-1),XR(J-1))+37*F(YR(J-2),XR(J-
2))-9*F(YR(J-3),XR(J-3)))
YR(J+1)=Z(1,J+1)
M=1
10 M=M+1
Z(M,J+1)=YR(J)+H/24*(9*F(Z(1,J+1),XR(J+1))+19*F(YR(J),XR(J))-5*F(YR(J-1),XR(J-
1))+F(YR(J-2),XR(J-2)))
YR(J+1)=Z(M,J+1)
!CALCULAMOS LA TOLERANCIA
EE=ABS(Z(M,J+1)-Z(M-1,J+1)) !ERROR ENCONTRADO
IF (EE.GT.TOL) THEN
GOTO 10
END IF
PRINT'(2X,I3,8X,F8.3,6X,F12.4)',J+1,XR(J+1),YR(J+1)
ENDDO
PRINT*,''
PRINT*,' POR LO TANTO,LUEGO DE LAS ITERACIONES OBTENEMOS:'
PRINT*,''
WRITE (*,121) XR(NMAX+2),YR(NMAX+2)
121 FORMAT (10X,'Y(',F7.2,')=',F12.4)
PRINT*,''
STOP
END PROGRAM
FUNCTION F(Y,X)
REAL X,Y,F
F=(X**2)-2*Y/X
RETURN
END FUNCTION
5. clc;
t0=0.05;
tf=1.3;
y0=1;
f=@(t,y)t.^2-(2*y./t);
c=(5*t0.^2*y0)-(t0.^5);
te=(t0:0.02:1.5);
for k =1:length(te)
ye(k)=((te(k)).^3)/5+c/(5*(te(k)).^2);
end
a=t0;
b=tf;
t=(t0:0.05:tf);
n=length(t)-1;
h=(b-a)/n;
tol=1.e-4;
% Resolviendo problemas de valores iniciales y'=f(t,y), y(a)=y0
% usando el método de Adams-Moulton de 4 orden.
fprintf('Runge-kutta method of order 4 givesn')
y(1)=y0;
fprintf('y(%3.2f) =%14.8fn',a,y(1))
% Usando el método de Runge Kutta (rk4) para comenzar
for i=1:3
k1=feval(f,t(i),y(i));
k2=feval(f,t(i)+h/2,y(i)+h*k1/2);
k3=feval(f,t(i)+h/2,y(i)+h*k2/2);
k4=feval(f,t(i)+h,y(i)+h*k3);
y(i+1)=y(i)+h*(k1+2*k2+2*k3+k4)/6;
fprintf('y(%3.2f) =%14.8fn',t(i)+h,y(i+1))
end;
fprintf('n')
disp(' Adams-Moulton method of order 4')
disp('_______________________________________________________________________
____________________________')
disp('datos t fi-2 fi-1 fi fi+1 y
Exact error ')
disp('_______________________________________________________________________
____________________________')
fprintf('n')
for i=4:n
f1=feval(f,t(i),y(i));
f2=feval(f,t(i-1),y(i-1));
f3=feval(f,t(i-2),y(i-2));
f4=feval(f,t(i-3),y(i-3));
% Adams–Bashforth como predict
z(1,i+1)=y(i)+h*(55*f1-59*f2+37*f3-9*f4)/24;
y(i+1)=z(1,i+1);
m=1;
r=1;
while r>tol
m=m+1;
% Adams-Moulton como correct
f5=feval(f,t(i+1),z(1,i+1));
z(m,i+1)=y(i)+h*(9*f5+19*f1-5*f2+f3)/24;
y(i+1)=z(m,i+1);
r=abs(z(m,i+1)-z(m-1,i+1));
end
% escribir la solución exacta g si se conoce como: g=g(x)
x=t(i+1);
g=(x.^3)./5+c./(5*x.^2);
if (g~='n')
err=abs(g-y(i+1));
6. fprintf('% 4.1f %6.2f %12.6f %12.6f %12.6f %12.6f %12.6f %12.6f
%8.2en',i+1,t(i)+h,f3,f2,f1,f5,y(i+1),g,err)
else
fprintf('%6.2f %12.6f %12.6f %12.6f %12.6f
%12.6fn',t(i)+h,f3,f2,f1,f5,y(i+1))
end
end
% 4th order Runge-Kutta simulation
yr(1)=y0;
tr(1)=t(1);
for j=1:length(t)-1
kc1=f(tr(j),yr(j));
kc2=f(tr(j)+.5*h,yr(j)+0.5*h*kc1);
kc3=f(tr(j)+.5*h,yr(j)+0.5*h*kc2);
kc4=f(tr(j)+h,yr(j)+h*kc3);
yr(j+1)=yr(j)+(1/6)*h*(kc1+2*kc2+2*kc3+kc4);
tr(j+1)=tr(j)+h;
end
% Plot
figure1=figure('color',[1 1 1]);
plot(t,y,'--x');
hold on
plot(tr,yr,'^:');
plot(te,ye,'-');
grid on
xlabel('Time(t)');
ylabel('Amplitude');
legend('Adams-Moulton(h=.05)','4th O Runge-Kutta','Exact',1);
fprintf('n');
fprintf('n');