diff options
Diffstat (limited to 'lib/Numeric/GSL/gsl-aux.c')
-rw-r--r-- | lib/Numeric/GSL/gsl-aux.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/lib/Numeric/GSL/gsl-aux.c b/lib/Numeric/GSL/gsl-aux.c index 756edf1..24d82c4 100644 --- a/lib/Numeric/GSL/gsl-aux.c +++ b/lib/Numeric/GSL/gsl-aux.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <gsl/gsl_poly.h> | 29 | #include <gsl/gsl_poly.h> |
30 | #include <gsl/gsl_multimin.h> | 30 | #include <gsl/gsl_multimin.h> |
31 | #include <gsl/gsl_multiroots.h> | 31 | #include <gsl/gsl_multiroots.h> |
32 | #include <gsl/gsl_min.h> | ||
32 | #include <gsl/gsl_complex_math.h> | 33 | #include <gsl/gsl_complex_math.h> |
33 | #include <gsl/gsl_rng.h> | 34 | #include <gsl/gsl_rng.h> |
34 | #include <gsl/gsl_randist.h> | 35 | #include <gsl/gsl_randist.h> |
@@ -905,6 +906,59 @@ double only_f_aux_min(const gsl_vector*x, void *pars) { | |||
905 | return res; | 906 | return res; |
906 | } | 907 | } |
907 | 908 | ||
909 | double only_f_aux_root(double x, void *pars); | ||
910 | int uniMinimize(int method, double f(double), | ||
911 | double epsrel, int maxit, double min, | ||
912 | double xl, double xu, RMAT(sol)) { | ||
913 | REQUIRES(solr == maxit && solc == 4,BAD_SIZE); | ||
914 | DEBUGMSG("minimize_only_f"); | ||
915 | gsl_function my_func; | ||
916 | my_func.function = only_f_aux_root; | ||
917 | my_func.params = f; | ||
918 | size_t iter = 0; | ||
919 | int status; | ||
920 | const gsl_min_fminimizer_type *T; | ||
921 | gsl_min_fminimizer *s; | ||
922 | // Starting point | ||
923 | switch(method) { | ||
924 | case 0 : {T = gsl_min_fminimizer_goldensection; break; } | ||
925 | case 1 : {T = gsl_min_fminimizer_brent; break; } | ||
926 | case 2 : {T = gsl_min_fminimizer_quad_golden; break; } | ||
927 | default: ERROR(BAD_CODE); | ||
928 | } | ||
929 | s = gsl_min_fminimizer_alloc (T); | ||
930 | gsl_min_fminimizer_set (s, &my_func, min, xl, xu); | ||
931 | do { | ||
932 | double current_min, current_lo, current_hi; | ||
933 | status = gsl_min_fminimizer_iterate (s); | ||
934 | current_min = gsl_min_fminimizer_x_minimum (s); | ||
935 | current_lo = gsl_min_fminimizer_x_lower (s); | ||
936 | current_hi = gsl_min_fminimizer_x_upper (s); | ||
937 | solp[iter*solc] = iter + 1; | ||
938 | solp[iter*solc+1] = current_min; | ||
939 | solp[iter*solc+2] = current_lo; | ||
940 | solp[iter*solc+3] = current_hi; | ||
941 | iter++; | ||
942 | if (status) /* check if solver is stuck */ | ||
943 | break; | ||
944 | |||
945 | status = | ||
946 | gsl_min_test_interval (current_lo, current_hi, 0, epsrel); | ||
947 | } | ||
948 | while (status == GSL_CONTINUE && iter < maxit); | ||
949 | int i; | ||
950 | for (i=iter; i<solr; i++) { | ||
951 | solp[i*solc+0] = iter; | ||
952 | solp[i*solc+1]=0.; | ||
953 | solp[i*solc+2]=0.; | ||
954 | solp[i*solc+3]=0.; | ||
955 | } | ||
956 | gsl_min_fminimizer_free(s); | ||
957 | OK | ||
958 | } | ||
959 | |||
960 | |||
961 | |||
908 | // this version returns info about intermediate steps | 962 | // this version returns info about intermediate steps |
909 | int minimize(int method, double f(int, double*), double tolsize, int maxit, | 963 | int minimize(int method, double f(int, double*), double tolsize, int maxit, |
910 | KRVEC(xi), KRVEC(sz), RMAT(sol)) { | 964 | KRVEC(xi), KRVEC(sz), RMAT(sol)) { |