#include <stdio.h> 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