summaryrefslogtreecommitdiff
path: root/lib/Numeric/GSL/gsl-aux.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Numeric/GSL/gsl-aux.c')
-rw-r--r--lib/Numeric/GSL/gsl-aux.c54
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
909double only_f_aux_root(double x, void *pars);
910int 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
909int minimize(int method, double f(int, double*), double tolsize, int maxit, 963int 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)) {