# [SciPy-user] Fitting with global parameters optimize.leastsq

Steve Schmerler elcorto at gmx.net
Mon Nov 6 14:53:28 CST 2006

```Iain Day wrote:
> Dear All,
>
> I apologise in advance if this has been covered elsewhere, I can't seem
> to get my head around it.
>
> I'm trying to globally fit a series of traces to the same function with
> some common and some local parameters. I have a 2D array (raw_signals)
> which contains each data trace as its columns. I have a 1D array of the
> time points.
>
> I'd like to fit an exponential of the form:
> 	y(t) = A * exp(-t/B) + C
>
> and I'd like C to be global across all data sets, but A and B to be
> local to each trace.
>
> So far I've put A and B into arrays ntraces long. I'm trying to keep the
> code as general as possible as I've got lots to fit each with differing
> numbers of traces.
>
> I've followed the example on the SciPy cookbook and I see the principle
> but I'm not sure ow to extend it in my case.
>
> I've got some code which generates the error (cost) function as an array
> of the same dimensions as raw_signals, but I can't see how to use
> optimize.leastsq with that.
>

I'm not sure if I understood what you're doing, but your error function
must return an 1D array of residuals, no 2D (like raw_signals).

import numpy as nu
from scipy.optimize import leastsq

# t is your time array
# x the parameter array for the current trace
# y = raw_signals[:,i] = the (i+1)th column

# fit a trace
def model(t, x):
A = x[0]
B = x[1]
C = x[2]
return A * nu.exp(-t/B) + C

def residuals(x, t, y):
return y - model(t, x)

x_sol = leastsq(residuals, x0, args = (t,y))

--
cheers,
steve

Random number generation is the art of producing pure gibberish as
quickly as possible.
```