Professional Documents
Culture Documents
Optimization
Biostatistics 615/815
Lecture 15
Lectures
Lecture notes
Weekly Homework
Midterm
Content
Last Lecture
z
Today
z
Root finding
Ideas:
Limits on accuracy
Local approximations
Numerical Optimization
z
Algorithmic Objectives
z
Solve problem
Specific Objectives
z
A Quick Detour
z
Root Finding in C
double zero(double (*func)(double), double lo, double hi, double e)
{
while (1)
{
double d = hi lo;
double point = lo + d * 0.5;
double fpoint = (*func)(point);
if (fpoint < 0.0)
{ d = lo point; lo = point; }
else
{ d = point hi; hi = point; }
if (fabs(d) < e || fpoint == 0.0)
return point;
}
}
f * ( x) = f (a ) + ( x a )
f (b) f (a )
ba
Performance Comparison
z
double function(double x)
{
return (4*x 3);
}
int main(int argc, char ** argv)
{
double min = zero(my_function, -5, +5, 1e-5);
printf(Minimum for my function is %.3f at %.3f\n,
my_function(min), min);
}
Bracketing
Accuracy
Note on Accuracy
z
Note on Accuracy II
z
f ( x) f (b) +
z
f (b)( x b)
Part I
Part II
Bracket minimum
Successively tighten bracketing interval
a < b< c
f(b) < f(a) and f(b) < f(c)
4
3
5
6
Part I:
Finding a Bracketing Interval
z
a, b
f(a) > f(b)
Bracketing in C
#define SCALE
void bracket
{
double fa
double fb
double fc
while (fb
{
*a =
*b =
*c =
fc =
}
}
1.618
(double (*f)(double), double* a, double* b, double* c)
= (*f)( *a);
= (*f)( *b);
= (*f)( *c = *b + SCALE * (*b - *a) );
> fc)
*b; fa = fb;
*c; fb = fc;
*b + SCALE * (*b - *a);
(*f) (*c);
Bracketing in C++
#define SCALE
void bracket
{
double fa
double fb
double fc
1.618
(double (*f)(double), double & a, double & b, double & c)
= (*f)(a);
= (*f)(b);
= (*f)(c = b + SCALE * (b - a) );
Part II:
Finding Minimum after Bracketing
z
a < b< c
f(b) < f(a) and f(b) < f(c)
Consider
Consider
Formulae
w=
ba
ca
z=
x b
ca
Effectively
The optimal case is
z = 1 2w
z
=w
1 w
This gives
3- 5
= 0.38197
w=
2
Golden Search
Bracketing Triplet
New Point
B
0.38196
C
0.38196
X
0.38196
X
0.38196
Golden Search
z
Golden Step
#define GOLD
#define ZEPS
0.38196
1e-10
Golden Search
double golden_search(double (*func)(double),
double a, double b, double c, double e)
{
double fb = (*func)(b);
while ( fabs(c - a) > fabs(b * e) + ZEPS)
{
double x = b + golden_step(a, b, c);
double fx = (*func)(x);
if (fx < fb)
{
if (x > b) { a = b; } else { c = b; }
b = x; fb = fx;
}
else
if (x < b) { a = x; } else { c = x; }
}
return b;
}
Further Improvements
z
Recommended Reading
z
Online at
http://www.numerical-recipes.com/
http://www.library.cornell.edu/nr/