/*    ATK IV - Numerical Programming (2006)      */
/*       Excercise 5.2b -  Derivatives           */

#include<stdio.h>
#include<math.h>
#define Pi 3.141592
#define N 80

void deriv2(double h, double y[], double dy[], int n);
void deriv3(double h, double y[], double dy[], int n);

int main(void){
  double y[N+1];
  double dy[N+1],dy2[N+1];
  double h;
  double a=0.0;
  double b=2*Pi;
  double x=a;
  int i;

  h = (b-a)/N;
  for(i=0;i<=N;i++){
    y[i]=sin(x);
    x+=h;
  }

  deriv2(h,y,dy,N);
  deriv3(h,y,dy2,N);

  x=a;
  for(i=0;i<=N;i++){
    printf("%f %f %f\n", dy[i], dy2[i], cos(x));
    x+=h;
  }

  return 0;
}

void deriv2(double h, double y[], double dy[], int n){
  int i;
  
  dy[n]=(y[n]-y[n-1])/h;

  for(i=0;i<N;i++){
    dy[i]=(y[i+1]-y[i])/h;
  }
}
void deriv3(double h, double y[], double dy[], int n){
  int i;
  dy[0] = (-3.0*y[0]+4.0*y[1]-y[2])/(2.0*h);
  dy[n] = (y[n-2]-4.0*y[n-1]+3.0*y[n])/(2.0*h);
  for(i=1;i<n;i++){
    dy[i] = (y[i+1]-y[i-1])/(2.0*h);
  }
}