/*               ATK IV - Numerical Programming (2006)                */
/*    Excercise 10.2 -  Differential Equations, Elementary Methods    */

#include<stdio.h>
#include<math.h>

double f(double x, double y){return sqrt(x)*y-y;}
void euler(int n, double x0, double xend, double y0);
void rk2(int n, double x0, double xend,  double y0);

int main(void){
  double x0=0.0, y0=1.0, xend = 10.0;
  int n=100;

  euler(n,x0,xend,y0);
  rk2(n,x0,xend,y0);

  return 0;

}

void euler(int n, double x0, double xend, double y0){
  int i;
  double h=(xend-x0)/(1.0*(n-1));
  double x,y=y0;
  FILE *file;

  file=fopen("euler.txt","w");

  for(i=1;i<=n;i++){
    x=x0+(i-1)*h;
    y+=h*f(x,y);
    fprintf(file,"%f %f\n",x,y);
  }
  fclose(file);
}
    
void rk2(int n, double x0, double xend,  double y0){
  int i;
  double h=(xend-x0)/(1.0*(n-1));
  double x,y=y0,k1,k2;
  FILE *file;

  file = fopen("rk2.txt","w");

  for(i=1;i<=n;i++){
    x=x0+(i-1)*h;
    k1=h*f(x,y);
    k2=h*f(x+h/2.0,y+k1/2.0);

    y+=k2;
    fprintf(file,"%f %f\n",x,y);
  }
}