home *** CD-ROM | disk | FTP | other *** search
- PROGRAM d16r2(input,output);
- (* driver for routine SHOOTF *)
- LABEL 1;
- CONST
- nvar=3;
- n1=2;
- n2=1;
- delta=1.0e-3;
- eps=1.0e-6;
- dx=1.0e-4;
- TYPE
- gl1array = ARRAY [1..1] OF real;
- gln2array = gl1array;
- gl2array = ARRAY [1..2] OF real;
- gln1array = gl2array;
- gl3array = ARRAY [1..3] OF real;
- glnarray = gl3array;
- glarray = gl3array;
- glnvar = gl3array;
- glnpbynp = ARRAY [1..3,1..3] OF real;
- glnvarbynvar = glnpbynp;
- glindx = ARRAY [1..3] OF integer;
- VAR
- c2,factr,h1,hmin : real;
- q1,x1,x2,xf : real;
- i,m,n : integer;
- v1,delv1,dv1 : gln2array;
- v2,delv2,dv2 : gln1array;
- f : glnvar;
- kmax,kount : integer;
- dxsav : real;
- xp : ARRAY [1..200] OF real;
- yp : ARRAY [1..10,1..200] OF real;
-
- PROCEDURE load1(x1: real; v1: gl1array; VAR y: gl3array);
- (* Programs using routine LOAD1 must define the types
- TYPE
- gl1array = ARRAY [1..1] OF real;
- gl3array = ARRAY [1..3] OF real;
- and must declare the variables
- VAR
- c2,factr : real;
- m : integer;
- in the main routine. *)
- BEGIN
- y[3] := v1[1];
- y[2] := -(y[3]-c2)*factr/2.0/(m+1.0);
- y[1] := factr+y[2]*dx
- END;
-
- PROCEDURE load2(x2: real; v2: gl2array; VAR y: gl3array);
- (* Programs using routine LOAD2 must define the types
- TYPE
- gl2array = ARRAY [1..2] OF real;
- gl3array = ARRAY [1..3] OF real;
- and must declare the variables
- c2 : real;
- m : integer;
- in the main routine. *)
- BEGIN
- y[3] := v2[2];
- y[1] := v2[1];
- y[2] := (y[3]-c2)*y[1]/2.0/(m+1.0)
- END;
-
- PROCEDURE score(xf: real; y: gl3array; VAR f: gl3array);
- (* Programs using routine SCORE must define the type
- TYPE
- gl3array = ARRAY [1..3] OF real;
- in the main routine. *)
- VAR
- i : integer;
- BEGIN
- FOR i := 1 to 3 DO BEGIN
- f[i] := y[i]
- END
- END;
-
- PROCEDURE derivs(x: real; y: gl3array; VAR dydx: gl3array);
- (* Programs using routine DERIVS must define the type
- TYPE
- gl3array = ARRAY [1..3] OF real;
- and must declare the variables
- c2 : real;
- m : integer;
- in the main routine. *)
- BEGIN
- dydx[1] := y[2];
- dydx[3] := 0.0;
- dydx[2] := (2.0*x*(m+1.0)*y[2]-(y[3]-c2*x*x)*y[1])/(1.0-x*x)
- END;
-
- (*$I MODFILE.PAS *)
- (*$I LUBKSB.PAS *)
-
- (*$I LUDCMP.PAS *)
-
- (*$I RK4.PAS *)
-
- (*$I RKQC.PAS *)
-
- (*$I ODEINT.PAS *)
-
- (*$I SHOOTF.PAS *)
-
- BEGIN
- 1: write('Input M,N,C-SQUARED: ');
- readln(m,n,c2);
- IF ((n < m) OR (m < 0)) THEN BEGIN
- writeln('Improper arguments');
- GOTO 1
- END;
- factr := 1.0;
- IF (m <> 0) THEN BEGIN
- q1 := n;
- FOR i := 1 to m DO BEGIN
- factr := -0.5*factr*(n+i)*(q1/i);
- q1 := q1-1.0
- END
- END;
- v1[1] := n*(n+1)-m*(m+1)+c2/2.0;
- IF (((n-m) MOD 2) = 0) THEN v2[1] := factr
- ELSE v2[1] := -factr;
- v2[2] := v1[1];
- delv1[1] := delta*v1[1];
- delv2[1] := delta*factr;
- delv2[2] := delv1[1];
- h1 := 0.1;
- hmin := 0.0;
- x1 := -1.0+dx;
- x2 := 1.0-dx;
- xf := 0.0;
- writeln;
- writeln('mu(-1)':26,'y(1-dx)':20,'mu(+1)':19);
- REPEAT
- shootf(nvar,v1,v2,delv1,delv2,n1,n2,x1,x2,
- xf,eps,h1,hmin,f,dv1,dv2);
- writeln;
- writeln('v ':6,v1[1]:20:6,v2[1]:20:6,v2[2]:20:6);
- writeln('dv':6,dv1[1]:20:6,dv2[1]:20:6,dv2[2]:20:6);
- UNTIL (abs(dv1[1]) <= abs(eps*v1[1]))
- END.
-