Clasificaciones, modalidades y tendencias de investigación educativa.
Ecuación diferencial parabólica usando el método crank nicholson en fortran, 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 II
“ELABORACIÓN DE UN ALGORITMO PARA UNA
ECUACIÓN DIFERENCIAL PARABÓLICA USANDO
EL MÉTODO CRANK NICHOLSON MEDIANTE
FORTRAN 90, SCILAB 5.5 Y MATLAB”
MARCO ANTONIO ALPACA CHAMBA
ESCUELA PROFESIONAL DE: FÍSICA
𝝏𝒖
𝝏𝒕
= 𝒂 𝟐
𝝏 𝟐 𝒖
𝝏𝒙 𝟐
− 𝑫
𝝏𝒖
𝝏𝒙
PROGRAM
IMPLICIT NONE
REAL, INTEGER…
05 -07-2015
2. Elaborar un algoritmo mediante diferencias finitas para la siguiente ecuación diferencial
parcial (usar el Método de CRANK NICHOLSON):
𝝏𝒖
𝝏𝒕
= 𝒂 𝟐
𝝏 𝟐
𝒖
𝝏𝒙 𝟐
− 𝑫
𝝏𝒖
𝝏𝒙
𝒖( 𝟎, 𝒕) = 𝒖( 𝑳, 𝒕) = 𝟎 , 𝒙 ∈ [ 𝟎, 𝑳]
𝒖( 𝒙, 𝟎) = 𝒔𝒊𝒏( 𝝅𝒙)
Aproximando mediante diferencias finitas hacia adelante en la parte temporal, al nodo
(i,j) tenemos:
𝝏𝒖
𝝏𝒕
=
𝒖𝒊,𝒋+𝟏 − 𝒖𝒊,𝒋
𝚫
Aproximando mediante diferencias finitas centrales en la parte espacial, al nodo (i,j)
tenemos:
𝝏 𝟐
𝒖
𝝏𝒙 𝟐
=
𝒖𝒊+𝟏,𝒋 − 𝟐𝒖𝒊,𝒋 + 𝒖𝒊−𝟏,𝒋
𝒉 𝟐
𝝏𝒖
𝝏𝒙
=
𝒖𝒊+𝟏,𝒋 − 𝒖𝒊−𝟏,𝒋
𝒉
Reemplazando estas ecuaciones en la ecuación diferencial tenemos:
𝒖 𝒊,𝒋+𝟏−𝒖 𝒊,𝒋
𝚫
= 𝒂 𝟐
(
𝒖 𝒊+𝟏,𝒋−𝟐𝒖 𝒊,𝒋+𝒖 𝒊−𝟏,𝒋
𝒉 𝟐
) − 𝑫(
𝒖 𝒊+𝟏,𝒋−𝒖 𝒊−𝟏,𝒋
𝒉
) (1)
Ahora aproximando mediante diferencias finitas hacia atrás en la parte temporal, al
nodo (i, j+1) tenemos:
𝝏𝒖
𝝏𝒕
=
𝒖𝒊,𝒋+𝟏 − 𝒖𝒊,𝒋
𝚫
De igual manera aproximando mediante diferencias finitas centrales en la parte espacial,
al nodo (i, j+1) tenemos:
𝝏 𝟐
𝒖
𝝏𝒙 𝟐
=
𝒖𝒊+𝟏,𝒋+𝟏 − 𝟐𝒖𝒊,𝒋+𝟏 + 𝒖𝒊−𝟏,𝒋+𝟏
𝒉 𝟐
𝝏𝒖
𝝏𝒙
=
𝒖𝒊+𝟏,𝒋+𝟏 − 𝒖𝒊−𝟏,𝒋+𝟏
𝒉
Reemplazando en la ecuación original tenemos:
𝒖 𝒊,𝒋+𝟏−𝒖 𝒊,𝒋
𝚫
= 𝒂 𝟐
(
𝒖 𝒊+𝟏,𝒋+𝟏−𝟐𝒖 𝒊,𝒋+𝟏+𝒖 𝒊−𝟏,𝒋+𝟏
𝒉 𝟐
) − 𝑫(
𝒖 𝒊+𝟏,𝒋+𝟏−𝒖 𝒊−𝟏,𝒋+𝟏
𝒉
) (2)
Sumando (1)+ (2) tenemos:
3. 𝒖 𝒊,𝒋+𝟏 =
( 𝟏 − 𝜸)
( 𝟏 + 𝜸)
( 𝒖 𝒊,𝒋) +
𝜸
( 𝟐 + 𝟐𝜸)
( 𝒖𝒊+𝟏,𝒋 + 𝒖𝒊−𝟏,𝒋 + 𝒖𝒊+𝟏,𝒋+𝟏 + 𝒖𝒊−𝟏,𝒋+𝟏)
−
𝑫∆
( 𝟒 + 𝟒𝜸)
( 𝒖𝒊+𝟏,𝒋 − 𝒖𝒊−𝟏,𝒋 + 𝒖𝒊+𝟏,𝒋+𝟏 − 𝒖𝒊−𝟏,𝒋+𝟏)
UTILIZANDO FORTRAN 90 TENEMOS:
PROGRAM CRANK_NICHOLSON
PARAMETER (IDM=1000)
DIMENSION X(IDM),T(IDM),U(IDM,IDM),R(IDM,IDM)
REAL ALFA,GAM,HT,HX,NT,NX
OPEN(UNIT=11,FILE='CRANK.TXT',STATUS='UNKNOWN',ACTION='WRITE')
PRINT*,''
PRINT*,
'====================================================================='
PRINT*,' CRACK NICHOLSON METHODPARA PARABOLIC PDE'
PRINT*,'==================================================================
===='
PRINT*,''
PRINT*, 'INGRESAR EL RANGO INFERIOR DE LA VARIABLE X (X=0):'
READ(5,*) AX
PRINT*, 'INGRESAR EL RANGO SUPERIOR DE LA VARIABLE X (X=5):'
READ*, BX
PRINT*, 'INGRESAR EL NUMBER DE SUBINTERVALOS DE X (N=8):'
READ*, NX
PRINT*,'INGRESAR EL RANGO INFERIOR DE LA VARIABLE T (T=0):'
READ*,AT
PRINT*, 'INGRESAR EL RANGO SUPERIOR DE LA VARIABLE T (T=3):'
READ*, BT
PRINT*, 'INGRESAR EL NUMBER DE SUBINTERVALOS DE T (N=8):'
READ*, NT
PRINT*, 'INGRESAR TOLERANCIA:'
READ*, TOL
PRINT*,''
PRINT*,('*',I=1,79)
PRINT '(5X,"RESULTADOS COMPUTACIONALES")'
PRINT*,('*',I=1,79)
PRINT*,''
PI = 4.0*ATAN(1.0)
B=54 !W/(M-K)
RHO=7800 !KG/M^3)
P=490
D=1 !J/(KG-K)
ALFA=B/(RHO*P)
HX=(BX-AX)/NX
HT=(BT-AT)/NT
DO J=1,NT+1
T(J)=(J-1)*HT
ENDDO
DO I=1,NX+1
X(I)=(I-1)*HX
ENDDO
DO I=2,NX
U(I,1)=F(X(I))
4. ENDDO
DO J=1,NT+1
U(1,J)=G1(T(J))
U(NX+1,J)=G2(T(J))
ENDDO
GAM=ALFA*HT/(HX**2)
WRITE(11,7)AX,(AT+(L1-1)*HT,L1=1,NT+1)
PRINT'(2X,F5.2,F8.3,8F8.3)',AX,(AT+(L1-1)*HT,L1=1,NT+1)
R(NX+1,NT+1)=0
S=1
K=0
DO WHILE (S>TOL)
DO J=1,NT+1
DO I=2,NX
V=GAM/(2+2*GAM)*(U(I-1,J)+U(I+1,J)+U(I-1,J+1)+U(I+1,J+1))+(1-GAM)*U(I,J)/(1+GAM)-
D*HT*(U(I+1,J)-U(I-1,J)+U(I+1,J+1)-U(I-1,J+1))/(4+4*GAM)
R(I,J)=ABS(V-U(I,J+1))
U(I,J+1)=V
enddo
enddo
S=R(1,1)
DO I=2,NX
DO J=1,NT
IF (R(I,J)>S) THEN
S=R(I,J)
ENDIF
ENDDO
ENDDO
K=K+1
END DO
7 FORMAT (2X,F5.2,F8.3,201F8.3)
DO I=1,NX+1
WRITE(11,9)AX,(U(I,J),J=1,NT+1)
PRINT' (2X,F5.2,1X,F8.3,201F8.3)',AX,(U(I,J),J=1,NT+1)
AX=AX+HX
ENDDO
9 FORMAT(2X,F5.2,1X,F8.3,201F8.3)
PRINT*,''
STOP
CONTAINS
FUNCTION F(Y)
REAL Y,F
F=SIN(PI*Y)
RETURN
END FUNCTION
FUNCTION G1(Y)
REAL Y,G1
G1=0+0*Y
RETURN
END FUNCTION
FUNCTION G2(Y)
REAL Y,G2
G2=0+0*Y
RETURN
END FUNCTION
5. END
USANDO SCILAB TENEMOS:
//Condiciones iniciales
function y=f(x, t)
y=0
endfunction
//
function y=fi(x)
y= sin(%pi*x)
endfunction
//
function [u, x, t, r, k]=neiav(N, K, L, T, a, d, U1, U2, eps)
//
hx=L/N;
//
delta=T/K;
//
for i=1:N+1
x(i)=(i-1)*hx;
end
//
for j=1:K+1
t(j)=(j-1)*delta;
end
6. //
for i=2:N
x(i)=(i-1)*hx;
u(i,1)=fi(x(i));
end
//
for j=1:K+1
t(j)=(j-1)*delta;
u(1,j)=U1;
u(N+1,j)=U2;
end
//
R(N+1,K+1)=0;
//
gam=a^2*delta/hx^2;
r=1;
k=0;
//
while r>eps
//
for j=1:K
for i=2:N
V=gam/(2+2*gam)*(u(i-1,j)+u(i+1,j)+u(i-1,j+1)+u(i+1,j+1))+(1-gam)*u(i,j)...
/(1+gam)+delta*(f(x(i),t(j))+f(x(i),t(j+1)))/(2+2*gam)-...
d*delta*(u(i+1,j)-u(i-1,j)+u(i+1,j+1)-u(i-1,j+1))/(4+4*gam);
R(i,j)=abs(V-u(i,j+1));
u(i,j+1)=V;
end
end
//
r=R(1,1);
for i=1:N+1
for j=1:K+1
if R(i,j)>r
r=R(i,j);
end
end
end
//
k=k+1;
end
endfunction
//
a=sqrt(54/(7800*490));
[u,x,t,r,k]=neiav(8,8,5,3,a,1,0,0,0.001);
surf(x,t,u');
title('ECUACIÓN PARABÓLICA POR EL MÉTODO DE CRANK NICHOLSON','fontsize',4);
xlabel('X');
ylabel('T');
zlabel('U');
8. hx=L/N;
delta=T/K;
for i=1:N+1
x(i)=(i-1)*hx;
end
for j=1:K+1
t(j)=(j-1)*delta;
end
for i=2:N
x(i)=(i-1)*hx;
u(i,1)=fi(x(i));
end
for j=1:K+1
t(j)=(j-1)*delta;
u(1,j)=U1;
u(N+1,j)=U2;
end
R(N+1,K+1)=0;
gam=a^2*delta/hx^2;
r=1;
k=0;
while r>eps
for j=1:K
for i=2:N
V=gam/(2+2*gam)*(u(i-1,j)+u(i+1,j)+u(i-1,j+1)+u(i+1,j+1))+(1-
gam)*u(i,j)...
/(1+gam)+delta*(f(x(i),t(j))+f(x(i),t(j+1)))/(2+2*gam)-...
d*delta*(u(i+1,j)-u(i-1,j)+u(i+1,j+1)-u(i-1,j+1))/(4+4*gam);
R(i,j)=abs(V-u(i,j+1));
u(i,j+1)=V;
end
end
r=R(1,1);
for i=1:N+1
for j=1:K+1
if R(i,j)>r
r=R(i,j);
end
end
end
k=k+1;
end
end