[SciPy-User] fmin_slsqp constraint problem

Oleksandr Huziy guziy.sasha at gmail.com
Fri Oct 26 11:51:47 EDT 2012


You can modify your constraint


  ## constrain poles to be inside unit circle
    def c(coef, len_z, len_p, dz, dp):
        p = compose ((coef/opt.scale)[len_z:-1], dp)
        return np.min( np.abs(p) - 1)

Cheers
--
Oleksandr (Sasha) Huziy

2012/10/26 Moore, Eric (NIH/NIDDK) [F] <eric.moore2 at nih.gov>

> > -----Original Message-----
> > From: Neal Becker [mailto:ndbecker2 at gmail.com]
> > Sent: Friday, October 26, 2012 11:08 AM
> > To: scipy-user at scipy.org
> > Subject: Re: [SciPy-User] fmin_slsqp constraint problem
> >
> > The obj_fnc is much too complicated to include here, but does return a
> > single
> > value.  I think the problem is ieqcons returns an array, while
> > fmin_slsqp
> > expects a single value.
> >
> > Oleksandr Huziy wrote:
> >
> > > What is your obj_fnc, I know it is naive, bu still, is it possible
> > that it
> > > returns a list?
> > >
> > > Cheers
> > > --
> > > Oleksandr (Sasha) Huziy
> > >
> > > 2012/10/26 Neal Becker <ndbecker2 at gmail.com>
> > >
> > >> I have a ineq constraint:
> > >>
> > >>     ## constrain poles to be inside unit circle
> > >>     def c(coef, len_z, len_p, dz, dp):
> > >>         p = compose ((coef/opt.scale)[len_z:-1], dp)
> > >>         return np.abs(p) - 1
> > >>
> > >> So this will return a 1D array where each value should satisfy the
> > >> constraint.
> > >> fmin_slsqp will not accept this directly:
> > >>
> > >>     e = fmin_slsqp (obj_fnc, coef*opt.scale, ieqcons=[lambda coef,
> > len_z,
> > >> len_p,
> > >> dz, dp: -c(coef, len_z, len_p, dz, dp)], args=(len(lz), len(lp), dz,
> > dp),
> > >> eqcons=[lambda coef, len_z, len_p, dz, dp: h(coef, len_z, len_p, dz,
> > dp)],
> > >> full_output=True)
> > >>
> > >> Traceback (most recent call last):
> > >>   File "./optimize_pll5.3.2.py", line 519, in <module>
> > >>     run_line (sys.argv)
> > >>   File "./optimize_pll5.3.2.py", line 498, in run_line
> > >>     e = fmin_slsqp (obj_fnc, coef*opt.scale, ieqcons=[lambda coef,
> > len_z,
> > >> len_p,
> > >> dz, dp: -c(coef, len_z, len_p, dz, dp)], args=(len(lz), len(lp), dz,
> > dp),
> > >> eqcons=[lambda coef, len_z, len_p, dz, dp: h(coef, len_z, len_p, dz,
> > dp)],
> > >> full_output=True)
> > >>   File "/usr/lib64/python2.7/site-packages/scipy/optimize/slsqp.py",
> > line
> > >> 334,
> > >> in fmin_slsqp
> > >>     a_ieq[i] = ieqcons_prime[i](x)
> > >>   File "/usr/lib64/python2.7/site-
> > packages/scipy/optimize/optimize.py",
> > >> line
> > >> 176, in function_wrapper
> > >>     return function(x, *args)
> > >>   File "/usr/lib64/python2.7/site-
> > packages/scipy/optimize/optimize.py",
> > >> line
> > >> 398, in approx_fprime
> > >>     grad[k] = (f(*((xk+ei,)+args)) - f0)/epsilon
> > >> ValueError: setting an array element with a sequence.
> > >>
> > >> Any ideas on this?
> > >>
>
> It looks like the difference between ieqcons and f_ieqcons is returning an
> array or an scalar. I've not used fmin_slsqp, this is based solely on the
> documentation.
>
> Eric
> _______________________________________________
> 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/20121026/8e0c0ee5/attachment.html>


More information about the SciPy-User mailing list