MATLAB Optimization Greg Reese, Ph.D Research Computing Support Group Miami University MATLAB Optimization © 2010-2013 Greg Reese. All rights reserved 2 Function Summary Function Parameter Linearity Constraints Location fgoalattain fminbnd fmincon fminimax fminsearch fminunc fzero lsqlin lsqnonlin lsqnonneg 3 Optimization Optimization - finding value of a parameter that maximizes or minimizes a function with that parameter – Talking about mathematical optimization, not optimization of computer code! – "function" is mathematical function, not MATLAB language function 4 Optimization Optimization - finding value of a parameter that maximizes or minimizes a function with that parameter – Can have multiple parameters – Can have multiple functions – Parameters can appear linearly or nonlinearly 5 Linear programming Linear programming – "programming" means determining feasible programs (plans, schedules, allocations) that are optimal with respect to a certain criterion – Most often used kind of optimization –Tremendous number of practical applications\ Won't discuss further 6 fminbnd The basic optimizing 1D routine is fminbnd, which attempts to find a minimum of a function of one variable within a fixed interval. • function must be continuous • only real values (not complex) • only scalar values (not vector) • might only find local minimum 7 fminbnd x = fminbnd( @fun, x1, x2 ) x1 < x2 is the minimization interval x is the x-value in [x1,x2] where the minimum occurs fun is the function whose minimum we’re looking for. fun must accept exactly one scalar argument and must return exactly one scalar value Because there are no restrictions on the value of fun, finding the minimum is called unconstrained optimization. 8 fminbnd x = fminbnd( @fun, x1, x2 ) @fun is called a function handle. You must include the “@” when you call fminbnd. 9 fminbnd Try It Find the minimum of f(x) = ( x – 3 )2 – 1 on the interval [0,5] Step 1 – make an m-file with the function 10 fminbnd Try It Step 2 – call fminbnd with your function >> x = fminbnd( @parabola, 0, 5 ) x = 3 If you want to get the value of the function at its minimum, call the function with the minimum x value returned by fminbnd >> parabola(x) ans = -1 11 fminbnd Try It Step 3 – verify result is a global minimum by plotting function over a range, say [-10 10] >> ezplot( @parabola, [-10 10] ) 12 fminunc The multidimensional equivalent of fminbnd is fminunc. It attempts to find a local minimum of a function of one or more variables. • function must be continuous • only real values (not complex) • only scalar values (not vector) • might only find local minimum 13 fminunc x = fminunc( @fun, x0 ) x0 is your guess of where the minimum is fun is the function whose minimum we’re looking for. fun must accept exactly one scalar or vector argument and must return exactly one scalar value 14 fminunc x = fminunc( @fun, x0 ) fun only has one argument. If the argument is a vector, each element represents the corresponding independent variable in the function Example f(x,y,z) = x2 + y2 + z2 function w = f( x ) w = x(1)^2 + x(2)^2 + x(3)^2 15 fminunc Optimizing routines such as fminunc are often sensitive to the initial value. For bad initial values they may converge to the wrong answer, or not converge at all. Tip – if fun is a function of one or two variables, plot it first to get an idea of where the minimum is 16 fminunc Try It Find the minimum of f(x) = ( x – π )2 – 1 Step 1 – make an m-file with the function 17 fminunc Try It Step 2 – plot the function to get an estimate of the location of its minimum Looks like min is at about 3 18 fminunc Try It Step 3 – call fminunc with your function and an initial guess of 3 Ignore this stuff >> xmin = fminunc( @pi_parabola, 3 ) Warning: Gradient must be provided for trust-region method; using line-search method instead. > In fminunc at 247 Optimization terminated: relative infinity-norm of gradient less than options.TolFun. xmin = 3.1416 19 fminunc Try It Find the minimum of f(x,y) = ( x–22.22 )2 + ( y-44.44 )2 - 17 Step 1 – make an m-file with the function 20 fminunc Try It Step 2 – plot the function to get an estimate of the location of its minimum ezsurf expects a function that takes two arguments. Since parabola only takes one, we need to make a different version that takes two. Let's call it paraboloid_xy 21 fminunc Try It Step 2 – plot the function to get an estimate of the location of its minimum >> ezsurf( @parabola_xy, [ 0 50 0 50] ) After zooming and panning some, it looks like the min is at about x=20 and y=50 22 fminunc Try It Step 3 – call fminunc with your function and an initial guess of [20 50] >> x = fminunc( @paraboloid, [20 50] ) x = 22.2200 44.4400 >> paraboloid( x ) ans = -17.0000 23 fminunc Try It Find the minimum of a 5D hypersphere of centered at [ 1 2 3 4 5 ] f(x,y,z,a,b) = (x–1)2 + (y–2)2 + (z–3)2 + (a–4)2 + (b–5)2 Step 1 – make an m-file with the function Use 3 dots to continue a line in a file. 24 fminunc Try It Step 2 – can't plot 5D, so guess [ 0 0 0 0 0] Step 3 – call fminunc with your function and an initial guess of [0 0 0 0 0] >> xmin = fminunc( @hypersphere, [0 0 0 0 0] ) xmin = 1.0000 2.0000 3.0000 4.0000 5.0000 >> hypersphere( xmin ) ans = 3.9790e-012 ≈0 25 MATLAB Optimization Questions? 26 The End 27