JAZ164|
begin    comment   JAZ164, R743, Outer Planets;

comment library A0, A1, A4, A5, A12, A15;

integer  form1p12e;
integer  form1p1e;
integer  form7p1;
integer  form2p9;

integer  k,t; real  a,k2,x; boolean      fi;
array    y,ya,z,za[1:15],m[0:5],e[1:60],d[1:33];
array    ownd[1:5,1:5],ownr[1:5];

real  procedure  f(k); integer  k;
   begin
   integer  i,j,i3,j3;
   real  p;
   if  k ± 1 then goto  A;
   for  i := 1 step  1 until  4 do
      begin
      i3 := 3×i;
      for  j := i+1 step 1 until  5 do
         begin
         j3 := 3×j;
         p := (y[i3-2] - y[j3-2]) ^ 2 + (y[i3-1] - y[j3-1]) ^ 2 + (y[i3] - y[j3]) ^ 2;
         ownd[i,j] := ownd[j,i] := 1/p/sqrt(p)
         end
      end ;
   for  i := 1 step  1 until  5 do
      begin
      i3 := 3×i;
      ownd[i,i] := 0;
      p := y[i3-2] ^ 2 + y[i3-1] ^ 2 + y[i3] ^ 2;
      ownr[i] := 1/p/sqrt(p)
      end ;

   A:

   i := (k - 1) ÷ 3 + 1;
   f := k2 × (- m[0] × y[k] × ownr[i] + SUM(j,1,5,m[j]×((y[3×(j-i)+k]-y[k])×ownd[i,j]-y[3×(j-i)+k]×ownr[j])))
   end  f;

procedure  RK3n(x,a,b,y,ya,z,za,fxyj,j,e,d,fi,n); value b,fi,n;
integer j,n; real x,a,b,fxyj;
boolean  fi; array  y,ya,z,za,e,d;
  begin
  integer  jj;
    real  xl,h,hmin,int,hl,absh,fhm,discry,discrz,toly,tolz,mu,mu1,fhy,fhz;
    boolean  last,first,reject;
    array  yl,zl,k0,k1,k2,k3,k4,k5[1:n],ee[1:4×n];
    if  fi
    then  begin  d[3] := a;
                 for  jj := 1 step  1 until  n do
                 begin  d[jj+3] := ya[jj]; d[n+jj+3] := za[jj] end
               end ;
    d[1] := 0; xl := d[3];
    for  jj := 1 step  1 until  n do
    begin  yl[jj] := d[jj+3]; zl[jj] := d[n+jj+3] end ;
    if  fi then  d[2] := b - d[3];
    absh := h := abs(d[2]);
    if  b - xl < 0 then  h := - h;
    int := abs(b - xl); hmin := int × e[1] + e[2];
    for  jj := 2 step  1 until  2×n do
    begin  hl := int × e[2×jj-1] + e[2×jj];
      if  hl < hmin then  hmin := hl
    end ;
    for  jj := 1 step  1 until  4×n do  ee[jj] := e[jj]/int;
    first := reject := true ;
    if  fi
    then  begin  last := true ; goto  nstep end ;
  test: absh := abs(h);
    if  absh < hmin
    then  begin  h := if  h > 0 then  hmin else  - hmin;
               absh := hmin
             end ;
  if  h  >  b - xl eqv h  >  0
  then  begin  d[2] := h; last := true ;
               h := b - xl; absh := abs(h)
             end
  else  last := false ;
nstep: if  reject
  then  begin  x := xl;
               for  jj := 1 step  1 until  n do
               y[jj] := yl[jj];
               for  j := 1 step  1 until  n do
               k0[j] := fxyj × h
             end
  else  begin  fhy := h/hl;
               for  jj := 1 step  1 until  n do
               k0[jj] := k5[jj] × fhy
             end ;
  x := xl + .27639 32022 50021 × h;
  for  jj := 1 step  1 until  n do
  y[jj] := yl[jj] + (zl[jj] × .27639 32022 50021 +
                      k0[jj] × .03819 66011 25011) × h;
  for  j := 1 step  1 until  n do  k1[j] := fxyj × h;
  x := xl + .72360 67977 49979 × h;
  for  jj := 1 step  1 until  n do
  y[jj] := yl[jj] + (zl[jj] × .72360 67977 49979 +
                      k1[jj] × .26180 33988 74989) × h;
  for  j := 1 step  1 until  n do  k2[j] := fxyj × h;
  x := xl + h × .5;
  for  jj := 1 step  1 until  n do
  y[jj] := yl[jj] + (zl[jj] × .5 +
                      k0[jj] × .04687 5 +
                      k1[jj] × .07982 41558 39840 -
                      k2[jj] × .00169 91558 39840) × h;
  for  j := 1 step  1 until  n do  k4[j] := fxyj × h;
  x := if  last then  b else  xl + h;
  for  jj := 1 step  1 until  n do
  y[jj] := yl[jj] + (zl[jj] +
                      k0[jj] × .30901 69943 74947 +
                      k2[jj] × .19098 30056 25053) × h;
  for  j := 1 step  1 until  n do  k3[j] := fxyj × h;
  for  jj := 1 step  1 until  n do
  y[jj] := yl[jj] + (zl[jj] +
                      k0[jj] × .08333 33333 33333 +
                      k1[jj] × .30150 28323 95825 +
                      k2[jj] × .11516 38342 70842) × h;
  for  j := 1 step  1 until  n do  k5[j] := fxyj × h;
  reject := false ; fhm := 0;
  for  jj := 1 step  1 until  n do
  begin
    discry := abs((- k0[jj] × .5 + k1[jj] × 1.80901 69943 74947 +
                      k2[jj] × .69098 30056 25053 - k4[jj] × 2) × h);
    discrz := abs((k0[jj] - k3[jj]) × 2 - (k1[jj] + k2[jj]) × 10 +
                    k4[jj] × 16 + k5[jj] × 4);
    toly := absh × (abs(zl[jj]) × ee[2×jj-1] + ee[2×jj]);
    tolz := abs(k0[jj]) × ee[2×(jj+n)-1] + absh × ee[2×(jj+n)];
    reject := discry > toly or discrz > tolz or reject;
    fhy := discry/toly; fhz := discrz/tolz;
    if  fhz > fhy then  fhy := fhz;
    if  fhy > fhm then  fhm := fhy
  end ;
  mu := 1/(1 + fhm) + .45;
  if  reject
  then  begin  if  absh  <  hmin
               then  begin  d[1] := d[1] + 1;
                           for  jj := 1 step  1 until  n  do
                           begin  y[jj] := yl[jj];
                             z[jj] := zl[jj]
                           end ;
                           first := true ; goto  next
                         end ;
               h := mu × h; goto  test
            end  rej;
  if  first
  then  begin  first := false ; hl := h; h := mu × h;
               goto  acc
            end ;
  fhy := mu × h/hl + mu - mu1; hl := h; h := fhy × h;
acc: mu1 := mu;
  for  jj := 1 step  1 until  n do
  z[jj] := zl[jj] + (k0[jj] + k3[jj]) × .08333 33333 33333 +
                    (k1[jj] + k2[jj]) × .41666 66666 66667;
next: if  b ± x
  then  begin  xl := x;
               for  jj := 1 step  1 until  n do
               begin  yl[jj] := y[jj]; zl[jj] := z[jj] end ;
               goto  test
            end ;
  if  not  last then  d[2] := h;
  d[3] := x;
  for  jj := 1 step  1 until  n do
  begin  d[jj+3] := y[jj]; d[n+jj+3] := z[jj] end
end  RK3n;

procedure  TYP(x); array  x;
   begin
   integer  k;
   newline(10, 1);
   writetext(10,[T * = * ]); comment  ABSFIXT;
   write(10,form7p1,t+a);
   newline(10, 2);
   for  k := 1 step  1 until  5 do
      begin
       if  k=1 then  writetext(10,[J *  *  * ]) else
       if  k=2 then  writetext(10,[S *  *  * ]) else
       if  k=3 then  writetext(10,[U *  *  * ]) else
       if  k=4 then  writetext(10,[N *  *  * ]) else
                       writetext(10,[P *  *  * ]);
       write(10,form2p9,x[3×k-2]);
       write(10,form2p9,x[3×k-1]);
       write(10,form2p9,x[3×k]);
       newline(10, 1)
      end
   end  TYP;

real  procedure  SUM(i,a,b,xi); value  b; integer  i,a,b; real  xi;
   begin
   real  s;
   s := 0;
   for  i := a step  1 until  b do  s := s + xi;
   SUM := s
   end  SUM;

form1p12e :=  format([s+d.dddddddddddº+nd_]);
form1p1e  :=  format([+d.dº+nd_]);
form7p1   :=  format([snnnnnnd.d_]);
form2p9   :=  format([+nd.ddddddddds_]);
open(10);
open(20);

a := read(20);
for  k := 1 step  1 until 15 do
   begin
   ya[k] := read(20);  za[k] := read(20);
   end ;
for  k := 0 step  1 until 5 do
   m[k] := read(20);
k2 := read(20); e[1] := read(20);
for  k := 2 step  1 until  60 do
   e[k] := e[1];
writetext(10,[JAZ164, * R743, * Outer * Planets_]); newline(10, 2);
for  k := 1 step  1 until  15 do
   begin
   write(10,form1p12e,ya[k]);
   write(10,form1p12e,za[k]);
   newline(10, 1)
   end ;
for  k := 0 step  1 until  5 do
   begin
   newline(10, 1);
   write(10,form1p12e,m[k])
   end ;
newline(10, 2);
write(10,form1p12e,k2);
newline(10, 2);
writetext(10,[eps * = * ]);
write(10,form1p1e,e[1]);
newline(10, 1);
t := 0;
TYP(ya);
fi := true ;
for  t := 500,1000 do
   begin
   RK3n(x,0,t,y,ya,z,za,f(k),k,e,d,fi,15);
   fi := false ;
   TYP(y)
   end;

close(20);
close(10);

end
|
2430000.5,

+0.342947415189º+1,
-0.557160570446º-2,
+0.335386959711º+1,
+0.505696783289º-2,
+0.135494901715º+1,
+0.230578543901º-2,
+0.664145542550º+1,
-0.415570776342º-2,
+0.597156957878º+1,
+0.365682722812º-2,
+0.218231499728º+1,
+0.169143213293º-2,
+0.112630437207º+2,
-0.325325669158º-2,
+0.146952576794º+2,
+0.189706021964º-2,
+0.627960525067º+1,
+0.877265322780º-3,
-0.301552268759º+2,
-0.240476254170º-3,
+0.165699966404º+1,
-0.287659532608º-2,
+0.143785752721º+1,
-0.117219543175º-2,
-0.211238353380º+2,
-0.176860753121º-2,
+0.284465098142º+2,
-0.216393453025º-2,
+0.153882659679º+2,
-0.148647893090º-3,
+0.100000597682º+1,

+0.954786104043º-3,
+0.285583733151º-3,
+0.437273164546º-4,
+0.517759138449º-4,
+0.277777777778º-5,
+0.295912208286º-3,

+0.10º-3;
|
|