ODE: A Differential Equation Solver
/****************************************************************/
/* S A S S A M P L E L I B R A R Y */
/* */
/* NAME: ODE */
/* TITLE: ODE: A Differential Equation Solver */
/* PRODUCT: IML */
/* SYSTEM: ALL */
/* KEYS: */
/* PROCS: IML */
/* SUPPORT: GHG UPDATE: */
/* REF: */
/* MISC: */
/* */
/****************************************************************/
PROC IML ;
/*-------------------------------------------------------------*/
/* EXAMPLE1: A SIMPLE PROGRAM TO SOLVE THE DIFFERENTIAL */
/* EQUATION */
/* */
/* dx */
/* --- = - t x with x(0) = .5 */
/* dt */
/* */
/* THE USER MUST SUPPLY */
/* */
/* 1) THE (ORDERED) LIST OF POINTS AT WHICH THE */
/* SOLUTION IS TO BE REPORTED. */
/* THE INTEGRATION IS TO BE CARRIED UP TO .3 */
/* AND ALSO REPORT THE RESULTS AT .1 and .2 */
/* */
/* 2) THE RIGHT HAND SIDE (here it is : -t*x) */
/* */
/* 3) THE STEP-SIZE VECTOR */
/* THE INTEGRATION IS TO BE CARRIED WITH */
/* A MAXIMUM STEP SIZE OF 1 */
/* A MINIMUM STEP SIZE OF 1E-12 */
/* AN INITIAL STEP SIZE OF 1E-5 */
/* THESE NUMBERS ARE SPECIFIED IN H (NOT ORDERED) */
/* */
/* THE USER CAN SUPPLY */
/* */
/* 1) THE JACOBIAN OF THE RIGHT HAND SIDE (HERE : -T)*/
/* IF NOT SUPPLIED FINITE DIFFERENCE METHODS WILL */
/* BE USED TO ESTIMATE THE JACOBIAN */
/* */
/* RESULTS ARE */
/* */
/* Z[1,1] = 4.975062395981900000E-01 */
/* Z[1,2] = 4.900993366551400000E-01 */
/* Z[1,3] = 4.779987409188300000E-01 */
/*-------------------------------------------------------------*/
START FUN(T,X) GLOBAL(COUNT); /* DEFINE THE RHS */
COUNT = COUNT+1; /* WE COUNT THE NUMBER OF */
/* FUNCTION EVALUATIONS */
V = -T*X;
RETURN(V);
FINISH;
START JAC(T,X) ; /* DEFINE THE JACOBIAN */
V = -T;
RETURN(V);
FINISH;
T = { 0 .1 .2 .3}; /* SPECIFY THE ORDERED LIST*/
/* OF POINTS THAT DESCRIBE */
/* THE INTERVALS */
C = .5; /* SPECIFY THE INITIAL */
/* VALUE */
H = {1.E-12 1 1.E-5}; /* SPECIFY THE H VECTOR */
COUNT = 0; /* SET THE COUNTER */
CALL ODE(Z,"FUN",C,T,H) EPS = 1.E-12 J="JAC";
/* CALL ODE */
PRINT COUNT;
PRINT Z[FORMAT =E25.15];
/*-------------------------------------------------------------*/
/* EXAMPLE2: A SIMPLE PROGRAM TO SOLVE THE DIFFERENTIAL */
/* EQUATION */
/* */
/* dx | 1 | */
/* --- = A x with x(0) = | | */
/* dt | 2 | */
/* */
/* | | */
/* | -1 1 | */
/* A = | | */
/* | 1 2 | */
/* | | */
/* */
/* THE USER MUST SUPPLY */
/* */
/* 1) THE (ORDERED) LIST OF POINTS AT WHICH THE */
/* SOLUTION IS TO BE REPORTED. */
/* THE INTEGRATION IS TO BE CARRIED UP TO .3 */
/* AND ALSO REPORT THE RESULTS AT .1 AND .2 */
/* */
/* 2) THE RIGHT HAND SIDE (HERE IT IS : -T*X) */
/* */
/* 3) THE STEP-SIZE VECTOR */
/* THE INTEGRATION IS TO BE CARRIED WITH */
/* A MAXIMUM STEP SIZE OF 1 */
/* A MINIMUM STEP SIZE OF 1E-12 */
/* AN INITIAL STEP SIZE OF 1E-5 */
/* THESE NUMBERS ARE SPECIFIED IN H (NOT ORDERED) */
/* */
/* 4) THE INITIAL VECTOR */
/* */
/* THE USER CAN SUPPLY */
/* */
/* 1) THE JACOBIAN OF THE RIGHT HAND SIDE (HERE : -T)*/
/* IF NOT SUPPLIED FINITE DIFFERENCE METHODS WILL */
/* BE USED TO ESTIMATE THE JACOBIAN */
/* RESULTS */
/* */
/* FOR T= 1 THE RESULT IS STORED IN Z[,1] */
/* */
/* Z[1,1] = 1.059276279257100000E+00 */
/* Z[2,1] = 7.554305542309500000E-01 */
/* */
/* FOR T= 2 THE RESULT IS STORED IN Z[,2] */
/* */
/* Z[1,2] = 7.504499669077400000E-01 */
/* Z[2,2] = 4.711431015044000000E-01 */
/* */
/* FOR T= 3 THE RESULT IS STORED IN Z[,3] */
/* */
/* Z[1,3] = 5.141930081253500000E-01 */
/* Z[2,3] = 3.183434053151600000E-01 */
/* */
/*-------------------------------------------------------------*/
START FUN2(T,X) GLOBAL(A) ; /* DEFINE THE RHS */
/* PASS A AS A PARAMETER */
V = A*X;
RETURN(V);
FINISH;
T = { 0 1 2 3 }; /* DECLARE THE INTERVALS */
C = { 1 , 2 }; /* DECLARE THE INTIAL */
/* VECTOR C */
A = { -1 1 , 1 -2 } ; /* DEFINE A */
H = {1.E-9 1 1.E-5}; /* SET THE H VECTOR */
CALL ODE(Z,"FUN2",C,T,H) EPS = 1.E-5; /* CALL THE INTEGRATOR */
DO I = 1 TO 3;
D = Z[,I];
PRINT D[FORMAT =E25.15];
END;