[SciPy-User] how to use properly the function fmin () to scipy.optimize
Warren Weckesser
warren.weckesser at enthought.com
Tue Mar 13 13:35:25 EDT 2012
On Tue, Mar 13, 2012 at 8:02 AM, javi <fralosal at ei.upv.es> wrote:
> Hello, I have been trying to find the right way to use the function fmin
> () to
> use downhill simplex.
>
> Mainly I have a problem with that is that the algorithm converges to good
> effect, ie as a solution with a value next to zero.
>
> To test the performance of the algorithm I used the following example:
>
> def minimize (x):
>
> min = x [0] + x [1] + x [2] + x [3]
> return min
>
> In which given a vector x would want to obtain the values of its elements
> that
> when added give the minimum possible value.
>
> To do this use the following function call:
>
> solution = fmin (minimize, x0 = array ([1, 2, 3, 4]), args = "1", xtol =
> 0.21, =
> 0.21 ftol, full_output = 1)
>
> print "value parameters", solution [0], "\ n"
>
> and I get the following results:
>
> Optimization terminated successfully.
> Current function value: 10.000000
> Iterations: 1
> Function evaluations: 5
>
> value of the parameters: [1. 2. 3. 4.]
>
> As you can see the solution is VERY BAD, and I understand that due to large
> values of ftol and xtol that I gave it converges very quickly and gives a
> small value.
>
> Now, for that is a better result, ie, better than the 10 found understand
> that I
> must decrease and ftol xtol values, but in doing so I get:
>
>
> "Warning: Maximum number of function evaluations exceeded Has Been."
>
> Where I understand the algorithm before converging has made excessive
> calls to
> the function "minimize".
>
> Could you tell me what the correct use of the parameters ftol and xtol to
> find
> a good minimum next to 0?. Sshould generally be used in subsequent cases
> of ftol
> and xtol values?, They differ?.
>
> A greeting and thank you very much.
>
>
It looks like you want to solve a *constrained* minimization problem, in
which all the components of x remain positive. The function fmin() is for
unconstrained optimization, and your objective function has no
(unconstrained) minimum.
You can try fmin_cobyla or fmin_slsqp. Here's a short demonstration:
-----
from scipy.optimize import fmin_slsqp, fmin_cobyla
def objective(x):
"""The objective function to be minized."""
return x.sum()
def all_positive_constr(x):
"""Component constraint function for fmin_slsqp."""
return x
# The following are the component constraint functions for fmin_cobyla.
def x0_positive(x):
return x[0]
def x1_positive(x):
return x[1]
def x2_positive(x):
return x[2]
def x3_positive(x):
return x[3]
if __name__ == "__main__":
print "Using fmin_slsqp"
result = fmin_slsqp(objective, [1,2,3,4], f_ieqcons=all_positive_constr)
print result
print
print "Using fmin_cobyla"
result = fmin_cobyla(objective, [1,2,3,4], [x0_positive, x1_positive,
x2_positive, x3_positive])
print result
print
-----
Warren
_______________________________________________
> SciPy-User mailing list
> SciPy-User at scipy.org
> http://mail.scipy.org/mailman/listinfo/scipy-user
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.scipy.org/pipermail/scipy-user/attachments/20120313/ff9fec44/attachment.html>
More information about the SciPy-User
mailing list