[SciPy-User] fmin_slsqp constraint problem

Neal Becker ndbecker2@gmail....
Fri Oct 26 10:57:37 CDT 2012


Do you think applying np.min here will produce the same sort of convergence 
behaviour?

Oleksandr Huziy wrote:

> 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@nih.gov>
> 
>> > -----Original Message-----
>> > From: Neal Becker [mailto:ndbecker2@gmail.com]
>> > Sent: Friday, October 26, 2012 11:08 AM
>> > To: scipy-user@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@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@scipy.org
>> http://mail.scipy.org/mailman/listinfo/scipy-user
>>




More information about the SciPy-User mailing list