#include
double func(double x) {
double y;
y = 1/((x-0.3)*(x-0.3)+0.01) + 1/((x-0.9)*(x-0.9)+0.04) - 6;
return -y;
}
int main() {
double x0, xf, rel_tol, abs_tol;
double func(double);
double xmin, fminval;
int status;
string_t title = "f =-1/((x-0.3)*(x-0.3)+0.01) - 1/((x-0.9)*(x-0.9)+0.04) + 6 ";
fplotxy(func, -1, 1, 50, title, "x", "y");
x0 = -1; xf = 0; /* fminimum is at 0.0 */
status = fminimum(&fminval, &xmin, func, x0, xf);
printf("Interval = [%3.2f, %3.2f]\n", x0, xf);
printf("status = %d\n", status);
printf("xmin = %f\n", xmin);
printf("m = %f\n\n", fminval);
x0 = 0; xf = 0.8; /* fminimum is around 0.3 */
status = fminimum(&fminval, &xmin, func, x0, xf);
printf("Interval = [%3.2f, %3.2f]\n", x0, xf);
printf("status = %d\n", status);
printf("xmin = %f\n", xmin);
printf("m = %f\n\n", fminval);
rel_tol = 1E-2; /* default tolerance is 1E-6 */
abs_tol = 1E-2; /* default tolerance is 1E-6 */
x0 = 0; xf = 0.8; /* fminimum is around 0.6 */
status = fminimum(&fminval, &xmin, func, x0, xf,rel_tol,abs_tol);
printf("Interval = [%3.2f, %3.2f]\n", x0, xf);
printf("status = %d\n", status);
printf("xmin = %f\n", xmin);
printf("m = %f\n\n", fminval);
x0 = 0.4; xf = 1; /* fminimum is at 0.4 */
status = fminimum(&fminval, &xmin, func, x0, xf);
printf("Interval = [%3.2f, %3.2f]\n", x0, xf);
printf("status = %d\n", status);
printf("xmin = %f\n", xmin);
printf("m = %f\n\n", fminval);
x0 = 0; xf = 1; /* Only local minimum at 0.892716 is found */
status = fminimum(&fminval, &xmin, func, x0, xf);
printf("Interval = [%3.2f, %3.2f]\n", x0, xf);
printf("status = %d\n", status);
printf("xmin = %f\n", xmin);
printf("m = %f\n\n", fminval);
}
Interval = [-1.00, 0.00]
status = 0
xmin = 0.000000
m = -5.176471
Interval = [0.00, 0.80]
status = 0
xmin = 0.300375
m = -96.501409
Interval = [0.00, 0.80]
status = 0
xmin = 0.305573
m = -96.232705
Interval = [0.40, 1.00]
status = 0
xmin = 0.400000
m = -47.448276
Interval = [0.00, 1.00]
status = 0
xmin = 0.892717
m = -21.734573