void test_f (const gsl_root_fsolver_type * T, const char * description, gsl_function *f, double lower_bound, double upper_bound, double correct_root) { int status; size_t iterations = 0; double r, a, b; double x_lower, x_upper; gsl_root_fsolver * s; x_lower = lower_bound; x_upper = upper_bound; s = gsl_root_fsolver_alloc(T); gsl_root_fsolver_set(s, f, x_lower, x_upper) ; do { iterations++ ; gsl_root_fsolver_iterate (s); r = gsl_root_fsolver_root(s); a = gsl_root_fsolver_x_lower(s); b = gsl_root_fsolver_x_upper(s); if (a > b) gsl_test (GSL_FAILURE, "interval is invalid (%g,%g)", a, b); if (r < a || r > b) gsl_test (GSL_FAILURE, "r lies outside interval %g (%g,%g)", r, a, b); status = gsl_root_test_interval (a,b, EPSABS, EPSREL); } while (status == GSL_CONTINUE && iterations < MAX_ITERATIONS); gsl_test (status, "%s, %s (%g obs vs %g expected) ", gsl_root_fsolver_name(s), description, gsl_root_fsolver_root(s), correct_root); if (iterations == MAX_ITERATIONS) { gsl_test (GSL_FAILURE, "exceeded maximum number of iterations"); } /* check the validity of the returned result */ if (!WITHIN_TOL (r, correct_root, EPSREL, EPSABS)) { gsl_test (GSL_FAILURE, "incorrect precision (%g obs vs %g expected)", r, correct_root); } gsl_root_fsolver_free(s); }
int main (void) { int status; int iter = 0, max_iter = 100; const gsl_root_fsolver_type *T; gsl_root_fsolver *s; double r = 0, r_expected = sqrt (5.0); double x_lo = 0.0, x_hi = 5.0; gsl_function F; struct quadratic_params params = {1.0, 0.0, -5.0}; F.function = &quadratic; F.params = ¶ms; T = gsl_root_fsolver_brent; s = gsl_root_fsolver_alloc (T); gsl_root_fsolver_set (s, &F, x_lo, x_hi); printf ("using %s method\n", gsl_root_fsolver_name (s)); printf ("%5s [%9s, %9s] %9s %10s %9s\n", "iter", "lower", "upper", "root", "err", "err(est)"); do { iter++; status = gsl_root_fsolver_iterate (s); r = gsl_root_fsolver_root (s); x_lo = gsl_root_fsolver_x_lower (s); x_hi = gsl_root_fsolver_x_upper (s); status = gsl_root_test_interval (x_lo, x_hi, 0, 0.001); if (status == GSL_SUCCESS) printf ("Converged:\n"); printf ("%5d [%.7f, %.7f] %.7f %+.7f %.7f\n", iter, x_lo, x_hi, r, r - r_expected, x_hi - x_lo); } while (status == GSL_CONTINUE && iter < max_iter); gsl_root_fsolver_free (s); return status; }
int main () { int status; int iterations = 0, max_iterations = 100; gsl_root_fsolver *s; double r = 0, r_expected = sqrt (5.0); double x_lower x = 0.0, x_upper = 5.0; gsl_function F; struct quadratic_params params = {1.0, 0.0, -5.0}; F.function = &quadratic; F.params = ¶ms; s = gsl_root_fsolver_alloc (gsl_root_fsolver_bisection); gsl_root_fsolver_set (s, &F, x); printf ("using %s method\n", gsl_root_fsolver_name (s)); printf ("%5s [%9s, %9s] %9s %9s %10s %9s\n", "iter", "lower", "upper", "root", "actual", "err", "err(est)"); do { iterations++; status = gsl_root_fsolver_iterate (s); r = gsl_root_fsolver_root (s); x_lower = gsl_root_fsolver_x_lower (s); x_upper = gsl_root_fsolver_x_upper (s); status = gsl_root_test_interval (x, 0, 0.001); if (status == GSL_SUCCESS) printf ("Converged:\n"); printf ("%5d [%.7f, %.7f] %.7f %.7f %+.7f %.7f\n", iterations, x_lower, x_upper, r, r_expected, r - r_expected, x_upper - x_lower); } while (status == GSL_CONTINUE && iterations < max_iterations); }
void test_f_e (const gsl_root_fsolver_type * T, const char * description, gsl_function *f, double lower_bound, double upper_bound, double correct_root) { int status; size_t iterations = 0; double x_lower, x_upper; gsl_root_fsolver * s; x_lower = lower_bound; x_upper = upper_bound; s = gsl_root_fsolver_alloc(T); status = gsl_root_fsolver_set(s, f, x_lower, x_upper) ; gsl_test (status != GSL_EINVAL, "%s (set), %s", T->name, description); if (status == GSL_EINVAL) { gsl_root_fsolver_free(s); return ; } do { iterations++ ; gsl_root_fsolver_iterate (s); x_lower = gsl_root_fsolver_x_lower(s); x_upper = gsl_root_fsolver_x_lower(s); status = gsl_root_test_interval (x_lower, x_upper, EPSABS, EPSREL); } while (status == GSL_CONTINUE && iterations < MAX_ITERATIONS); gsl_test (!status, "%s, %s", gsl_root_fsolver_name(s), description, gsl_root_fsolver_root(s) - correct_root); gsl_root_fsolver_free(s); }
int calcola_equilibrio(double cost_Hamaker, double cost_Debye_quadra, double* risultato) { // da esempio: http://www.gnu.org/software/gsl/manual/html_node/Root-Finding-Examples.html int status; int iter = 0, max_iter = 100; const gsl_root_fsolver_type *T; gsl_root_fsolver *s; double r = 0; double x_lo = 1E-10, x_hi = 8E-9; gsl_function F; params parametri = {cost_Hamaker, cost_Debye_quadra, in.sigma, in.D_me, in.teta}; F.function = &funzione_equilibrio; F.params = ¶metri; //T = gsl_root_fsolver_brent; T = gsl_root_fsolver_bisection; s = gsl_root_fsolver_alloc (T); gsl_root_fsolver_set (s, &F, x_lo, x_hi); #ifdef DEBUG_ROOT printf ("using %s method\n", gsl_root_fsolver_name (s)); printf ("%5s [%12s, %12s] %12s %12s\n", "iter", "lower", "upper", "root", "err(est)"); #endif do { iter++; status = gsl_root_fsolver_iterate (s); r = gsl_root_fsolver_root (s); x_lo = gsl_root_fsolver_x_lower (s); x_hi = gsl_root_fsolver_x_upper (s); status = gsl_root_test_interval (x_lo, x_hi, 0, 0.001); // controllo su dimensione minima if(x_hi < in.D_min){ *risultato = in.D_min; #ifdef DEBUG_ROOT printf ("limite superiore= %e < %e=minimo consentito\n",x_hi,in.D_min); #endif gsl_root_fsolver_free (s); return GSL_SUCCESS; } #ifdef DEBUG_ROOT if (status == GSL_SUCCESS) printf ("Converged:\n"); printf ("%5d [%e, %e] %e %e\n", iter, x_lo, x_hi, r, x_hi - x_lo); #endif } while (status == GSL_CONTINUE && iter < max_iter); gsl_root_fsolver_free (s); *risultato = r; return status; }
static VALUE rb_gsl_fsolver_name(VALUE obj) { gsl_root_fsolver *s = NULL; Data_Get_Struct(obj, gsl_root_fsolver, s); return rb_str_new2(gsl_root_fsolver_name(s)); }