#include #include #include #include #include "demo_fn.h" double absoulte(double x) { if (x>=0) return x; else return -x; } int main (void) { int status; int iter = 0, max_iter = 100; const gsl_root_fdfsolver_type *T; gsl_root_fdfsolver *s; double x0, x = 0.90, r_expected = 0; // double x0, x = 5, r_expected = 0; gsl_function_fdf FDF; struct xenx_params params = {1.0, 0.0}; FDF.f = &xenx; FDF.df = &xenx_deriv; FDF.fdf = &xenx_fdf; FDF.params = ¶ms; T = gsl_root_fdfsolver_newton; s = gsl_root_fdfsolver_alloc (T); gsl_root_fdfsolver_set (s, &FDF, x); printf ("using %s method\n", gsl_root_fdfsolver_name (s)); printf ("%-5s %10s %10s %10s\n", "iter", "root", "err", "err(est)"); do { iter++; status = gsl_root_fdfsolver_iterate (s); x0 = x; x = gsl_root_fdfsolver_root (s); // status = gsl_root_test_delta (x, x0, 0, 0.001); if (absoulte(x-x0) < 0.001) status = GSL_SUCCESS; else status = GSL_CONTINUE; if (status == GSL_SUCCESS) printf ("Converged:\n"); printf ("%5d %10.7f %+10.7f %10.7f \n", iter, x, x - r_expected, x - x0); } while (status == GSL_CONTINUE && iter < max_iter); return status; }