Search code examples
functionmatlabmathematical-optimization

Maximize function with fminsearch


Within my daily work, I have got to maximize a particular function making use of fminsearch; the code is:

clc
 clear all
 close all

 f = @(x,c,k) -(x(2)/c)^3*(((exp(-(x(1)/c)^k)-exp(-(x(2)/c)^k))/((x(2)/c)^k-(x(1)/c)^k))-exp(-(x(3)/c)^k))^2;
 c = 10.1;
 k = 2.3;
 X = fminsearch(@(x) f(x,c,k),[4,10,20]);

It works fine, as I expect, but not the issue is coming up: I need to bound x within certain limits, as:

 4 < x(1) < 5
 10 < x(2) < 15
20 < x(3) < 30

To achieve the proper results, I should use the optimization toolbox, that I unfortunately cannot hand.

Is there any way to get the same analysis by making use of only fminsearch?


Solution

  • Well, not using fminsearch directly, but if you are willing to download fminsearchbnd from the file exchange, then yes. fminsearchbnd does a bound constrained minimization of a general objective function, as an overlay on fminsearch. It calls fminsearch for you, applying bounds to the problem.

    Essentially the idea is to transform your problem for you, in a way that your objective function sees as if it is solving a constrained problem. It is totally transparent. You call fminsearchbnd with a function, a starting point in the parameter space, and a set of lower and upper bounds.

    For example, minimizing the rosenbrock function returns a minimum at [1,1] by fminsearch. But if we apply purely lower bounds on the problem of 2 for each variable, then fminsearchbnd finds the bound constrained solution at [2,4].

    rosen = @(x) (1-x(1)).^2 + 105*(x(2)-x(1).^2).^2;
    
    fminsearch(rosen,[3 3])     % unconstrained
    ans =
       1.0000    1.0000
    
    fminsearchbnd(rosen,[3 3],[2 2],[])     % constrained
    ans =
       2.0000    4.0000
    

    If you have no constraints on a variable, then supply -inf or inf as the corresponding bound.

    fminsearchbnd(rosen,[3 3],[-inf 2],[])
    ans =
           1.4137            2