[SciPy-User] fmin_slsqp- Bounds are not obeyed
jagan prabhu
jagan_cbe2003@yahoo.co...
Wed Nov 4 04:16:43 CST 2009
Thank you for your answers, the program is working now
referring to "outside bounds"
optimizer occasionally evaluate the objective outside of the bounds (which are quite abnormal for my case?)
For example:
occasionally fmin_slsqp passes parameters like -45.0,-12.0,16
which perfectly obeys inequality constrain, but out of bounds..
my code is quite sensitive, at any case it should stick with in bounds.
Please help me. Is there any problem in my Bound syntax ?
* i face out of bounds problem in all Constrained (multivariate) optimization methods.
--- On Wed, 4/11/09, Zachary Pincus <zachary.pincus@yale.edu> wrote:
From: Zachary Pincus <zachary.pincus@yale.edu>
Subject: Re: [SciPy-User] fmin_slsqp- Bounds are not obeyed
To: "SciPy Users List" <scipy-user@scipy.org>
Date: Wednesday, 4 November, 2009, 1:39 AM
Hello,
> Problem is " Bounded with inequality constrains", in slssqp often
> Bounds are not obeyed, its deviates the bounds. So if deviates i
> made it to come back with in the region(bounds). But i face a
> problem in execution. i get error like,
>
> File "/usr/lib/python2.5/site-packages/scipy/optimize/slsqp.py",
> line 277, in fmin_slsqp
> c_ieq = array([ ieqcons[i](x) for i in range(len(ieqcons)) ])
> File "/usr/lib/python2.5/site-packages/scipy/optimize/
> optimize.py", line 97, in function_wrapper
> return function(x, *args)
> TypeError: <lambda>() takes exactly 1 argument (2 given)
I can't help with the bounds not being obeyed... but I can say that
you'll probably need to provide more detail about what you mean by
this for others to help though -- is it that the optimizer will
occasionally evaluate the objective outside of the bounds (which I
understand is normal?) or that the final results are out-of-bounds?
Anyhow, the traceback explains exactly what the problem with the
execution is. You define your inequality constraint as:
con1 = lambda x:numpy.asarray(x[1]-x[0], x[2]-x[1])
but from the traceback, you can see that it is being called like:
function(x, *args)
The error is quite clear on the problem: your lambda takes one
argument, but it is called with two.
I assume that x is the current position, and args is just what you
passed to the slsqp. So you should rewrite con1 as lambda x, args:
whatever...
Zach
On Nov 3, 2009, at 2:58 PM, jagan prabhu wrote:
> Dear users,
>
> Problem is " Bounded with inequality constrains", in slssqp often
> Bounds are not obeyed, its deviates the bounds. So if deviates i
> made it to come back with in the region(bounds). But i face a
> problem in execution. i get error like,
>
> File "/usr/lib/python2.5/site-packages/scipy/optimize/slsqp.py",
> line 277, in fmin_slsqp
> c_ieq = array([ ieqcons[i](x) for i in range(len(ieqcons)) ])
> File "/usr/lib/python2.5/site-packages/scipy/optimize/
> optimize.py", line 97, in function_wrapper
> return function(x, *args)
> TypeError: <lambda>() takes exactly 1 argument (2 given)
>
> program will look like,
>
>
> #import os
> #import scipy.optimize
> from scipy import *
> import numpy
> from scipy import optimize
> from numpy import asarray
> from math import *
>
>
> def cst(aParams,bounds):
> aParams = numpy.asarray(aParams)
> for par in range(len(aParams)):
> if ((bounds[par][0]<= aParams[par]<= bounds[par][1])):
> pass
> else:
> if (aParams[par]< bounds[par][0]): aParams[par] = bounds[par][0]
> if (aParams[par]> bounds[par][1]): aParams[par] = bounds[par][1]
>
> x = aParams[0]
> y = aParams[1]
> z = aParams[2]
> # objective function
> eqn = -cos(x)*cos(y)*cos(z)*log(-((x-pi)**2-(y-pi)**2-(z-pi)**2))
> return eqn
>
>
> #Initial guess
> Init = numpy.array([5.0,15.0,17.0]) # parameters x,y,z
> bounds = [(2.0, 20000.0),(4.0, 50000.0),(5.0, 60000.0)]
> # inequality constraints x must be least,y larger than x smaller
> than z,and z the largest of all
> con1 = lambda x:numpy.asarray(x[1]-x[0], x[2]-x[1])
>
>
> opt = fmin_slsqp(cst,Init,ieqcons= [con1] , bounds=bounds, fprime =
> None, args=(bounds,), full_output=True, iter=20000, iprint=2,
> acc=0.001)
>
> print '****************************************'
>
> print opt[0]
> print opt[1]
> print opt[2]
> print opt[4]
>
> Problems are,
> 1, bounds i could not able to pass to the function as args( ).
> 2, Whether implementation of the ineq. constraints are correct? any
> better way?
> 3, How to avoid bounds deviation?
>
> Please help me.
>
> Regards,
> Prabhu
>
> Add whatever you love to the Yahoo! India homepage. Try now!
> _______________________________________________
> SciPy-User mailing list
> SciPy-User@scipy.org
> http://mail.scipy.org/mailman/listinfo/scipy-user
_______________________________________________
SciPy-User mailing list
SciPy-User@scipy.org
http://mail.scipy.org/mailman/listinfo/scipy-user
Yahoo! India has a new look. Take a sneak peek http://in.yahoo.com/trynew
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.scipy.org/pipermail/scipy-user/attachments/20091104/e32fb013/attachment.html
More information about the SciPy-User
mailing list