/* roots/test_funcs.c
 * 
 * Copyright (C) 1996, 1997, 1998, 1999, 2000 Reid Priedhorsky, Brian Gough
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or (at
 * your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 */

#include <config.h>
#include <math.h>
#include <stdlib.h>
#include <gsl/gsl_math.h>
#include <gsl/gsl_roots.h>

#include "test.h"

gsl_function create_function (double (*f)(double, void *)) 
{
  gsl_function F ;
  F.function = f;
  F.params = 0;
  return F ;
}

gsl_function_fdf create_fdf (double (*f)(double, void *),
                             double (*df)(double, void *),
                             void (*fdf)(double, void *, double *, double *))
{
  gsl_function_fdf FDF ;
  FDF.f = f ;
  FDF.df = df ;
  FDF.fdf = fdf ;
  FDF.params = 0 ;
  return FDF ;
}

/* f(x) = x^{20} - 1 */
/* f'(x) = 20x^{19} */
/* zero at x = 1 or -1 */

double
func1 (double x, void *p)
{
  return pow (x, 20.0) - 1;
}

double
func1_df (double x, void * p)
{
  return 20.0 * pow (x, 19.0);
}

void
func1_fdf (double x, void * p, double *y, double *yprime)
{
  *y = func1 (x, p);
  *yprime = 20.0 * pow (x, 19.0);
}

/* f(x) = sqrt(abs(x))*sgn(x) */
/* f'(x) = 1 / sqrt(abs(x) */
/* zero at x = 0 */
double
func2 (double x, void * p)
{
  double delta;

  if (x > 0)
    delta = 1.0;
  else if (x < 0)
    delta = -1.0;
  else
    delta = 0.0;

  return sqrt (fabs (x)) * delta;
}

double
func2_df (double x, void * p)
{
  return 1 / sqrt (fabs (x));
}

void
func2_fdf (double x, void * p, double *y, double *yprime)
{
  *y = func2 (x, p);
  *yprime = 1 / sqrt (fabs (x));
}


/* f(x) = x^2 - 1e-8 */
/* f'(x) = 2x */
/* zero at x = sqrt(1e-8) or -sqrt(1e-8) */
double
func3 (double x, void * p)
{
  return pow (x, 2.0) - 1e-8;
}

double
func3_df (double x, void * p)
{
  return 2 * x;
}

void
func3_fdf (double x, void * p, double *y, double *yprime)
{
  *y = func3 (x, p);
  *yprime = 2 * x;
}

/* f(x) = x exp(-x) */
/* f'(x) = exp(-x) - x exp(-x) */
/* zero at x = 0 */
double
func4 (double x, void * p)
{
  return x * exp (-x);
}

double
func4_df (double x, void * p)
{
  return exp (-x) - x * exp (-x);
}

void
func4_fdf (double x, void * p, double *y, double *yprime)
{
  *y = func4 (x, p);
  *yprime = exp (-x) - x * exp (-x);
}

/* f(x) = 1/(1+exp(x)) */
/* f'(x) = -exp(x) / (1 + exp(x))^2 */
/* no roots! */
double
func5 (double x, void * p)
{
  return 1 / (1 + exp (x));
}

double
func5_df (double x, void * p)
{
  return -exp (x) / pow (1 + exp (x), 2.0);
}

void
func5_fdf (double x, void * p, double *y, double *yprime)
{
  *y = func5 (x, p);
  *yprime = -exp (x) / pow (1 + exp (x), 2.0);
}

/* f(x) = (x - 1)^7 */
/* f'(x) = 7 * (x - 1)^6 */
/* zero at x = 1 */
double
func6 (double x, void * p)
{
  return pow (x - 1, 7.0);
}

double
func6_df (double x, void * p)
{
  return 7.0 * pow (x - 1, 6.0);
}

void
func6_fdf (double x, void * p, double *y, double *yprime)
{
  *y = func6 (x, p);
  *yprime = 7.0 * pow (x - 1, 6.0);
}

/* sin(x) packaged up nicely. */
double
sin_f (double x, void * p)
{
  return sin (x);
}

double
sin_df (double x, void * p)
{
  return cos (x);
}

void
sin_fdf (double x, void * p, double *y, double *yprime)
{
  *y = sin (x);
  *yprime = cos (x);
}

/* cos(x) packaged up nicely. */
double
cos_f (double x, void * p)
{
  return cos (x);
}

double
cos_df (double x, void * p)
{
  return -sin (x);
}

void
cos_fdf (double x, void * p, double *y, double *yprime)
{
  *y = cos (x);
  *yprime = -sin (x);
}
