' PROGRAM WRITTEN BY INGEMAR BJERLE MARCH 2002 ' SOLVING OF 3 FIRST ORDER DIFF. EQ. REACTION: A ---> B ---> C ' INITIAL BOUNDARY VALUE SITUATION IS HANDLED [START] GOSUB [ini] INPUT "NUMBER OF STEPS ";N print " XIN = ";XIN print " XEND = ";XEND print " YIN = ";YIN print " UIN = ";UIN print " ZIN = ";ZIN print " XEND1 = ";XEND1 PRINT"" q=10000 PRINT" X Y(A) U(B) Z(C)" NN=10' INCREASE THIS TO GET FINER PRINT GRID AND SMALLER DX DX=(XEND/NN-XIN)/N X=XIN: Y=YIN: U=UIN: Z=ZIN PRINT USING("####.##",X);" "; INT(Y*q+.5)/q;" ";INT(U*q+.5)/q;" ";INT(Z*q+.5)/q FOR K=1 TO NN X=XIN: Y=YIN: U=UIN: Z=ZIN FOR I=1 TO N GOSUB [RUNGE] NEXT I PRINT USING("####.###",X);" "; INT(Y*q+.5)/q;" ";INT(U*q+.5)/q;" ";INT(Z*q+.5)/q XIN=XIN+XEND/NN YIN=Y UIN=U ZIN=Z NEXT K PRINT " RUNGE-DX = ";DX PRINT"" CONFIRM" DO YOU WANT TO QUIT Y/N";answer$ IF answer$="yes" THEN GOTO [END] ELSE GOTO [START] END IF [END] PRINT " ENTER TO END" INPUT R$ PRINT " *** END ***" END [EQ] ' SUBROUTINE EQUATIONS REM 3 FIRST ORDER DIFF. EQ: DY/DX=-KA1*Y: DU/DX=KA1*Y-KA2*U REM DZ/DX=KA2*U A --->B---> C REM KA1 KA2 REM BOUNDARY CONDITIONS: SEE [ini] ' A=DY B=DU D=DZ '***************************CHOOSE THE SAME VARIABLE NAMES AS IN RUNGE KA1=.0196:KA2=.049 A=KA1*Y*(-1) B=KA1*Y-KA2*U D=KA2*U '***************************INSERT THE BOUNDARY CONDITIONS IN MAIN PROGR RETURN [ini] 'SUBROUTINE WITH INITIAL DATES XIN=0 XEND=100 YIN=.294 UIN=0 ZIN=0 XEND1=0 return [RUNGE] ' SUBROUTINE RUNGE rem VARIABLES IN SUBROUTINE: INDEPENTENT: X DEPENDENT: Y, U AND Z X=X: Y=Y: U=U: Z=Z GOSUB [EQ] K1=A*DX: L1=B*DX: F1=D*DX X=X+DX/2: Y=Y+K1/2: U=U+L1/2: Z=Z+F1/2 GOSUB [EQ] K2=A*DX: L2=B*DX: F2=D*DX X=X-DX/2: Y=Y-K1/2: U=U-L1/2 :Z=Z-F1/2 X=X+DX/2: Y=Y+K2/2: U=U+L2/2 :Z=Z+F2/2 GOSUB [EQ] K3=A*DX: L3=B*DX: F3=D*DX X=X-DX/2: Y=Y-K2/2: U=U-L2/2 :Z=Z-F2/2 X=X+DX: Y=Y+K3: U=U+L3 :Z=Z+F3 GOSUB [EQ] K4=A*DX: L4=B*DX: F4=D*DX X=X-DX: Y=Y-K3: U=U-L3 :Z=Z-F3 X=X+DX Y=Y+K1/6+K2/3+K3/3+K4/6: U=U+L1/6+L2/3+L3/3+L4/6 Z=Z+F1/6+F2/3+F3/3+F4/6 RETURN