1048
1049
//---------------------------------------------------------------
1051
double only_f_aux_root(double x, void *pars) {
1052
double (*f)(double) = (double (*)(double)) pars;
1056
int root(int method, double f(double),
1057
double epsrel, int maxit,
1058
double xl, double xu, RMAT(sol)) {
1059
REQUIRES(solr == maxit && solc == 4,BAD_SIZE);
1060
DEBUGMSG("root_only_f");
1061
gsl_function my_func;
1062
// extract function from pars
1063
my_func.function = only_f_aux_root;
1067
const gsl_root_fsolver_type *T;
1068
gsl_root_fsolver *s;
1071
case 0 : {T = gsl_root_fsolver_bisection; printf("7\n"); break; }
1072
case 1 : {T = gsl_root_fsolver_falsepos; break; }
1073
case 2 : {T = gsl_root_fsolver_brent; break; }
1074
default: ERROR(BAD_CODE);
1076
s = gsl_root_fsolver_alloc (T);
1077
gsl_root_fsolver_set (s, &my_func, xl, xu);
1079
double best, current_lo, current_hi;
1080
status = gsl_root_fsolver_iterate (s);
1081
best = gsl_root_fsolver_root (s);
1082
current_lo = gsl_root_fsolver_x_lower (s);
1083
current_hi = gsl_root_fsolver_x_upper (s);
1084
solp[iter*solc] = iter + 1;
1085
solp[iter*solc+1] = best;
1086
solp[iter*solc+2] = current_lo;
1087
solp[iter*solc+3] = current_hi;
1089
if (status) /* check if solver is stuck */
1093
gsl_root_test_interval (current_lo, current_hi, 0, epsrel);
1095
while (status == GSL_CONTINUE && iter < maxit);
1097
for (i=iter; i<solr; i++) {
1098
solp[i*solc+0] = iter;
1103
gsl_root_fsolver_free(s);
1108
double (*f)(double);
1109
double (*jf)(double);
1112
double f_aux_uni(double x, void *pars) {
1113
uniTfjf * fjf = ((uniTfjf*) pars);
1117
double jf_aux_uni(double x, void * pars) {
1118
uniTfjf * fjf = ((uniTfjf*) pars);
1119
return (fjf->jf)(x);
1122
void fjf_aux_uni(double x, void * pars, double * f, double * g) {
1123
*f = f_aux_uni(x,pars);
1124
*g = jf_aux_uni(x,pars);
1127
int rootj(int method, double f(double),
1129
double epsrel, int maxit,
1130
double x, RMAT(sol)) {
1131
REQUIRES(solr == maxit && solc == 2,BAD_SIZE);
1132
DEBUGMSG("root_fjf");
1133
gsl_function_fdf my_func;
1134
// extract function from pars
1135
my_func.f = f_aux_uni;
1136
my_func.df = jf_aux_uni;
1137
my_func.fdf = fjf_aux_uni;
1141
my_func.params = &stfjf;
1144
const gsl_root_fdfsolver_type *T;
1145
gsl_root_fdfsolver *s;
1148
case 0 : {T = gsl_root_fdfsolver_newton;; break; }
1149
case 1 : {T = gsl_root_fdfsolver_secant; break; }
1150
case 2 : {T = gsl_root_fdfsolver_steffenson; break; }
1151
default: ERROR(BAD_CODE);
1153
s = gsl_root_fdfsolver_alloc (T);
1155
gsl_root_fdfsolver_set (s, &my_func, x);
1159
status = gsl_root_fdfsolver_iterate (s);
1161
x = gsl_root_fdfsolver_root(s);
1162
solp[iter*solc+0] = iter+1;
1163
solp[iter*solc+1] = x;
1166
if (status) /* check if solver is stuck */
1170
gsl_root_test_delta (x, x0, 0, epsrel);
1172
while (status == GSL_CONTINUE && iter < maxit);
1175
for (i=iter; i<solr; i++) {
1176
solp[i*solc+0] = iter;
1179
gsl_root_fdfsolver_free(s);
1184
//---------------------------------------------------------------
1050
1186
typedef void TrawfunV(int, double*, int, double*);
1052
int only_f_aux_root(const gsl_vector*x, void *pars, gsl_vector*y) {
1188
int only_f_aux_multiroot(const gsl_vector*x, void *pars, gsl_vector*y) {
1053
1189
TrawfunV * f = (TrawfunV*) pars;
1054
1190
double* p = (double*)calloc(x->size,sizeof(double));
1055
1191
double* q = (double*)calloc(y->size,sizeof(double));
1066
1202
return 0; //hmmm
1069
int root(int method, void f(int, double*, int, double*),
1205
int multiroot(int method, void f(int, double*, int, double*),
1070
1206
double epsabs, int maxit,
1071
1207
KRVEC(xi), RMAT(sol)) {
1072
1208
REQUIRES(solr == maxit && solc == 1+2*xin,BAD_SIZE);
1073
1209
DEBUGMSG("root_only_f");
1074
1210
gsl_multiroot_function my_func;
1075
1211
// extract function from pars
1076
my_func.f = only_f_aux_root;
1212
my_func.f = only_f_aux_multiroot;
1077
1213
my_func.n = xin;
1078
1214
my_func.params = f;
1079
1215
size_t iter = 0;