Analytical Computing 
by Laurent Bernardin


Listing One
> a[0] := 11/2; a[1] := 61/11;
> for i from 2 to 20 do
    a[i] := evalf( 111-1130/a[i-1]+3000/(a[i-1]*a[i-2]) )
  end do;
       a[2] := 5.59016393
       a[3] := 5.63343106
       a[4] := 5.67464821
       a[5] := 5.71332183
       a[6] := 5.74899458
       a[7] := 5.77961409
       a[8] := 5.77331611
       a[9] := 5.17967242
      a[10] := -6.8391055
      a[11] := 191.5387186
      a[12] := 102.8102519
      a[13] := 100.1612232
      a[14] := 100.0095189
      a[15] := 100.0005641
      a[16] := 100.0000335
      a[17] := 100.0000020
      a[18] := 100.0000001
      a[19] := 100.0000000
      a[20] := 100.0000000

Listing Two
> for i from 2 to 20 do
    a[i] := evalf( 111-1130/a[i-1]+3000/(a[i-1]*a[i-2]), 30 )
  end do;
       a[2] := 5.5901639344262295081967213114
       a[3] := 5.6334310850439882697947214080
       a[4] := 5.6746486205101509630400832965
       a[5] := 5.7133290523805155490321989960
       a[6] := 5.7491209197026380437051448349
       a[7] := 5.7818109204856155794683379136
       a[8] := 5.8113142382939957232038462063
       a[9] := 5.8376565489587119615631669961
      a[10] := 5.8609515225161319729296295759
      a[11] := 5.8813772158414186066348580484
      a[12] := 5.8991539057900653804656369740
      a[13] := 5.9145249506789843093265503806
      a[14] := 5.9277414077768100768697258775
      a[15] := 5.9390504854613682145398481297
      a[16] := 5.9486874924846266324223440920
      a[17] := 5.9568707319889872021880625846
      a[18] := 5.9637987220073017812321934030
      a[19] := 5.9696491639651381786739608575
      a[20] := 5.9745793622911322066401902108

Listing Three
> for i from 21 to 30 do
    a[i] := evalf( 111-1130/a[i-1]+3000/(a[i-1]*a[i-2]), 30 )
  end do;
      a[21] := 5.9787313055716646903432098926
      a[22] := 5.9823017419650597836243768506
      a[23] := 5.9866906078267980996399642244
      a[24] := 6.0136522709040277799769525928
      a[25] := 6.4232153924054698100400652873
      a[26] := 12.7415627706574382005210260605
      a[27] := 58.9699458767796995910794892852
      a[28] := 95.8304070556576619076782493096
      a[29] := 99.7392043815332393272183617503
      a[30] := 99.9843246386708478051625918056

Listing Four
> for i from 2 to 100 do
    a[i] := 111-1130/a[i-1]+3000/(a[i-1]*a[i-2]);
    printf("a[%d] := %a\n",i,evalf(a[i]))
  end do:
      a[2] := 5.590163934
      a[3] := 5.633431085
      a[4] := 5.674648621
      a[5] := 5.713329052
      a[6] := 5.749120920
      a[7] := 5.781810920
      a[8] := 5.811314238
      a[9] := 5.837656549
      a[10] := 5.860951523
      a[11] := 5.881377216
      a[12] := 5.899153906
      a[13] := 5.914524951
      a[14] := 5.927741408
      a[15] := 5.939050485
      a[16] := 5.948687492
      a[17] := 5.956870732
      a[18] := 5.963798721
      a[19] := 5.969649144
      a[20] := 5.974579029
            ...
      a[100] := 5.999999988

Listing Five
> g := codegen[optimize](f);
g := proc(x, y, z, t)
local t9, t18, t2, t1, t3, t6, t28;
    t1 := x^2; t2 := t1^2; t3 := y^2; t6 := z^2;
    t9 := t^2; t18 := t3^2; t28 := t6^2;
    t2 - 3*t1*t3 - 2*t1*t6 - t1*t9 + 4*x*t3*z + 4*y*z*x*t
       + t18 - 2*t3*y*t - 2*t3*t6 + t3*t9 - 2*t6*y*t + t28
end proc
> codegen[cost](g);
  7 storage + 7 assignments + 28 multiplications + 11 additions

Listing Six
> h := codegen[GRADIENT](g);
h := proc(x, y, z, t)
local df, t1, t18, t2, t28, t3, t6, t9;
    t1 := x^2; t2 := t1^2; t3 := y^2; t6 := z^2;
    t9 := t^2; t18 := t3^2; t28 := t6^2;
    df := array(1 .. 7);
    df[7] := 1; df[6] := 1; df[5] := -t1 + t3;
    df[4] := 2*df[7]*t6 - 2*t1 - 2*t3 - 2*y*t;
    df[3] := 2*df[6]*t3 - 3*t1 + 4*x*z - 2*y*t - 2*t6 + t9;
    df[2] := 1; df[1] := 2*df[2]*t1 - 3*t3 - 2*t6 - t9;
    (4*t3*z + 4*z*y*t + 2*df[1]*x,
     4*z*x*t - 2*t3*t - 2*t6*t + 2*df[3]*y,
     4*x*t3 + 4*x*y*t + 2*df[4]*z,
     4*y*x*z - 2*t3*y - 2*t6*y + 2*df[5]*t)
end proc

Listing Seven
Toeplits matrix
> codegen[C](h,ansi);
void h(double x,double y,double z,double t,double crea_par[4])
{
  double df[7];
  double t1;
  double t18;
  double t2;
  double t28;
  double t3;
  double t6;
  double t9;
  {
    t1 = x*x;
    t2 = t1*t1;
    t3 = y*y;
    t6 = z*z;
    t9 = t*t;
    t18 = t3*t3;
    t28 = t6*t6;
    df[6] = 1.0;
    df[5] = 1.0;
    df[4] = -t1+t3;
    df[3] = 2.0*df[6]*t6-2.0*t1-2.0*t3-2.0*y*t;
    df[2] = 2.0*df[5]*t3-3.0*t1+4.0*x*z-2.0*y*t-2.0*t6+t9;
    df[1] = 1.0;
    df[0] = 2.0*df[1]*t1-3.0*t3-2.0*t6-t9;
    crea_par[0] = 4.0*t3*z+4.0*z*y*t+2.0*df[0]*x;
    crea_par[1] = 4.0*z*x*t-2.0*t3*t-2.0*t6*t+2.0*df[2]*y;
    crea_par[2] = 4.0*x*t3+4.0*x*y*t+2.0*df[3]*z;
    crea_par[3] = 4.0*y*x*z-2.0*t3*y-2.0*y*t6+2.0*df[4]*t;
    return;
  }
}
 




