#include<stdio.h> #include<iostream> using namespace std; double f (double x) { return (x * (1-x)); } int ternary_search(double lo, double hi) { /* We know that f() is a unimodal function in the range [lo,hi] -- Specifically there are points x0=lo <= x1 <= x2 <= x3=hi where the region [x0,x1] is increasing, the region [x1,x2] is constant and the region [x2,x3] is decreasing. Your algorithm knows x0 and x3. The goal is to find a point of maximum value in [x0,x3]. Each of these three regions is possibly of zero length. It works both when the range is continuous or discrete, and the function value is continuous or discrete. In this example we use the continuous case for both. */ double x0,x1,x2,x3,f1,f2; x0 = lo; x3 = hi; /* Induction hypothesis at start of loop: (1) x0 < x3 (1) the function is unimodal in the range [x0,x3] (2) the range [x0,x3] contains a maximum of the function over the range [lo,hi] */ for (int count = 0; count < 100; count++) { x1 = (2*x0 + x3)/3; x2 = (x0 + 2*x3)/3; f1 = f(x1); f2 = f(x2); if (f1 < f2) x0 = x1; else x3 = x2; } return (x0 + x3)/2; } int main() { printf ("searching in [%.2f, %.2f] minimum at %f\n", 0.0, 1.0, ternary_search(0.0, 1.0)); printf ("searching in [%.2f, %.2f] minimum at %f\n", 1.0, 10.0, ternary_search(1.0, 10.0)); printf ("searching in [%.2f, %.2f] minimum at %f\n", -10.0, 10.0, ternary_search(-10.0, 10.0)); return 0; }