# [SciPy-dev] parameter control in scipy.optimize.leastsq

Maximilian Fabricius mxhf@gmx....
Sun Oct 19 10:28:14 CDT 2008

```On Sun, Oct 19, 2008 at 12:52 PM, Robin <robince@gmail.com> wrote:
> On Sun, Oct 19, 2008 at 11:28 AM, Maximilian Fabricius <mxhf@gmx.net> wrote:
>> Robin,
>>
>> thank you for the quick reply.
>> Indeed, but this would still involve to swap parameters around between
>> fixed and non-fixed and
>> changing the lambda function manually rather then just switching the
>> fissint on and off
>> with a single variable.
>>
>> But no doubt, a wrapper can be done.
>
> I couldn't think of a way to squeeze it into a lamdba single
> statement, but something like this would do:
>
> def fit_function(x, fit, y):
>    p0 = zeros(fit.size)
>    p0[fit] = x
>    p0[~fit] = y
>
> where fit is a boolean array, x is the ones to optimised and y are the
> fixed values.
> You have the extra overhead of the p0 array allocation for every
> iteration of the function - but perhaps that is worth it for the
> convenience.
>
> Robin
> _______________________________________________
> Scipy-dev mailing list
> Scipy-dev@scipy.org
> http://projects.scipy.org/mailman/listinfo/scipy-dev
>

Robin,

great, nice idea! As this may be of use to others, my solution now is:

def fit_function(p_fit, fit, p_fixed, ... ):
# assemble p_fit and p_fixed into a single array
# while restoring the correct order of the original p0 array.
p = zeros(fit.size)
p[ where(fit == True) ] = p_fit
p[ where(fit == False) ] = p_fixed
# calls the original residuals routine
return residuals(p, ... )

main():
# best guesses
p0 = zeros(10)
p0[0] = vrot_d
p0[1] = vsig_d
....

# choose which parameters to fit
fit = zeros(len(p0))
fit[0:7] = True
fit[8] = False
fit[9] = False

# store parameters which should be fit in p_fit
#  all the others in p_fixed
p_fit = p0[ where(fit == True) ]
p_fixed = p0[ where(fit == False) ]
plsq = leastsq(fit_function, p_fit, args=(fit, p_fixed,  ...) )

Thanks!

Cheers,

Maximilian
```