Dear Josef and Jonathan.<br clear="all"><div><br></div><div>Thank you for your response, and I am trying to move in that direction. :-)</div><div>But I hope someone can provide a simple code snippet, to try out.</div><div>

<br></div><div>This I also hope will help other, facing same problem.</div><div>The following code snippet is my try for &quot;least squares&quot;, &quot;curve_fit&quot; and &quot;lmfit&quot;.</div><div><br></div><div>Maybe someone could modify it, to examplify a global fit problem , and solve it ? :-)</div>

<div><br></div><div>-----------</div><div><div>from pylab import *</div><div>import scipy.optimize</div><div>import lmfit</div><div><br></div><div>fitfunc = lambda x,a,b,c:a*np.exp(-b*x)+c # Target fitfunction</div><div>
errfitfunc = lambda p, x, y: fitfunc(x,*p) - y # Distance to the target fitfunction</div>
<div>def lmfitfunc(pars, x, data=None,eps=None):</div><div>    amp = pars[&#39;amp&#39;].value</div><div>    decay = pars[&#39;decay&#39;].value</div><div>    const = pars[&#39;const&#39;].value</div><div>    model = amp*np.exp(-decay*x)+const</div>

<div>    if data is None:</div><div>        return model</div><div>    if eps is None:</div><div>        return (model - data)</div><div>    return (model-data)/eps</div><div><br></div><div>datX = np.linspace(0,4,50)</div>

<div>pguess = [2.5, 1.3, 0.5]</div><div>datY = fitfunc(datX,*pguess)</div><div>datYran = datY + 0.2*np.random.normal(size=len(datX))</div><div><br></div><div>####### Try least squares</div><div>lea = {}</div><div>lea[&#39;par&#39;], lea[&#39;cov_x&#39;], lea[&#39;infodict&#39;], lea[&#39;mesg&#39;], lea[&#39;ier&#39;] = scipy.optimize.leastsq(errfitfunc, pguess, args=(datX, datYran), full_output=1)</div>

<div>print lea[&#39;par&#39;], lea[&#39;ier&#39;]</div><div>datY_lea = fitfunc(datX,*lea[&#39;par&#39;])</div><div><br></div><div>####### Try curve_fit</div><div>cur = {}</div><div>cur[&#39;par&#39;], cur[&#39;pcov&#39;], cur[&#39;infodict&#39;], cur[&#39;mesg&#39;], cur[&#39;ier&#39;] = scipy.optimize.curve_fit(fitfunc, datX, datYran, p0=pguess, full_output=1)</div>

<div>datY_cur=fitfunc(datX,*cur[&#39;par&#39;])</div><div>cur[&#39;par_variance&#39;] = diagonal(cur[&#39;pcov&#39;]); cur[&#39;par_stderr&#39;] = sqrt(cur[&#39;par_variance&#39;])</div><div># Read this: <a href="http://mail.scipy.org/pipermail/scipy-user/2009-March/020516.html">http://mail.scipy.org/pipermail/scipy-user/2009-March/020516.html</a></div>

<div>cur[&#39;chisq&#39;]=sum(cur[&#39;infodict&#39;][&#39;fvec&#39;]*cur[&#39;infodict&#39;][&#39;fvec&#39;]) # calculate final chi square</div><div>cur[&#39;NDF&#39;]=len(datY)-len(cur[&#39;par&#39;])</div><div>cur[&#39;RMS_residuals&#39;] = sqrt(cur[&#39;chisq&#39;]/cur[&#39;NDF&#39;])</div>

<div>print cur[&#39;par&#39;], cur[&#39;ier&#39;], cur[&#39;chisq&#39;], cur[&#39;par_stderr&#39;]</div><div><br></div><div>####### Try lmfit</div><div>par = lmfit.Parameters()</div><div>par.add(&#39;amp&#39;, value=2.5, vary=True)</div>

<div>par.add(&#39;decay&#39;, value=1.3, vary=True)</div><div>par.add(&#39;const&#39;, value=0.5, vary=True)</div><div>lmf = lmfit.minimize(lmfitfunc, par, args=(datX, datYran),method=&#39;leastsq&#39;)</div><div>#datY_lmfit =datYran+lmf.residual</div>

<div>datY_lmfit = lmfitfunc(par,datX)</div><div># See <a href="http://cars9.uchicago.edu/software/python/lmfit/fitting.html#fit-results-label">http://cars9.uchicago.edu/software/python/lmfit/fitting.html#fit-results-label</a></div>

<div>print par[&#39;amp&#39;].value, par[&#39;amp&#39;].stderr, par[&#39;amp&#39;].correl</div><div>print lmf.nfev, lmf.success, lmf.errorbars, lmf.nvarys, lmf.ndata, lmf.nfree, lmf.chisqr, lmf.redchi</div><div>lmfit.printfuncs.report_errors(par) #lmf.params</div>

<div><br></div><div>#####################  This part is just to explore lmfit</div><div>#ci, trace = lmfit.conf_interval(lmf,sigmas=[0.68,0.95],trace=True, verbose=0)</div><div>#lmfit.printfuncs.report_ci(ci)</div><div>#x, y, grid=lmfit.conf_interval2d(lmf,&#39;amp&#39;,&#39;decay&#39;,30,30)</div>

<div>#x1,y1,prob1=trace[&#39;amp&#39;][&#39;amp&#39;], trace[&#39;amp&#39;][&#39;decay&#39;],trace[&#39;amp&#39;][&#39;prob&#39;]</div><div>#x2,y2,prob2=trace[&#39;decay&#39;][&#39;decay&#39;], trace[&#39;decay&#39;][&#39;amp&#39;],trace[&#39;decay&#39;][&#39;prob&#39;]</div>

<div><br></div><div>#figure(1)</div><div>#contourf(x,y,grid)</div><div>#scatter(x1,y1,c=prob1,s=30)</div><div>#scatter(x2,y2,c=prob2,s=30)</div><div>#xlabel(&#39;amp&#39;);</div><div>#colorbar();</div><div>#ylabel(&#39;decay&#39;);</div>

<div>######################</div><div><br></div><div>figure(2)</div><div>subplot(3,1,1)</div><div>plot(datX,datY,&quot;.-&quot;,label=&#39;real&#39;)</div><div>plot(datX,datYran,&#39;o&#39;,label=&#39;random&#39;)</div><div>

plot(datX,datY_lea,&#39;.-&#39;,label=&#39;leastsq fit&#39;)</div><div>legend(loc=&quot;best&quot;)</div><div>subplot(3,1,2)</div><div>plot(datX,datY,&quot;.-&quot;,label=&#39;real&#39;)</div><div>plot(datX,datYran,&#39;o&#39;,label=&#39;random&#39;)</div>

<div>plot(datX,datY_cur,&#39;.-&#39;,label=&#39;curve fit&#39;)</div><div>legend(loc=&quot;best&quot;)</div><div>subplot(3,1,3)</div><div>plot(datX,datY,&quot;.-&quot;,label=&#39;real&#39;)</div><div>plot(datX,datYran,&#39;o&#39;,label=&#39;random&#39;)</div>

<div>plot(datX,datY_lmfit,&#39;.-&#39;,label=&#39;lmfit&#39;)</div><div>legend(loc=&quot;best&quot;)</div><div><br></div><div>show()</div></div><div>----------------------------</div><div><br></div><div>Thanks in advance !</div>

<div><br></div><div>Troels</div><br><div class="gmail_quote">2013/4/3  <span dir="ltr">&lt;<a href="mailto:josef.pktd@gmail.com" target="_blank">josef.pktd@gmail.com</a>&gt;</span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div class="HOEnZb"><div class="h5">On Wed, Apr 3, 2013 at 12:09 PM, Troels Emtekær Linnet<br>
&lt;<a href="mailto:tlinnet@gmail.com">tlinnet@gmail.com</a>&gt; wrote:<br>
&gt; Dear Scipy users.<br>
&gt;<br>
&gt; I am having trouble to implement what is probably known as:<br>
&gt; Nonlinear fit to multiple data sets with shared parameters<br>
&gt;<br>
&gt; I haven&#39;t been able to find a solution for this in scipy, and I would be<br>
&gt; happy to hear if someone could guide med how to fix this.<br>
&gt;<br>
&gt; I have a set of measured NMR peaks.<br>
&gt; Each peak has two eksperiment x values, x1, x2, which I can fit to a<br>
&gt; measured Y value.<br>
&gt; I have used lmfit, which extends scipy leastsq with some boundary options.<br>
&gt;<br>
&gt; For each peak, i can fit the following function:<br>
&gt;<br>
&gt; --------------------------------------<br>
&gt; def R1r_exch(pars,inp,data=None,eps=None):<br>
&gt;     tiltAngle,omega1=inp<br>
&gt;     R1 = pars[&#39;R1&#39;].value<br>
&gt;     R2 = pars[&#39;R2&#39;].value<br>
&gt;     kEX = pars[&#39;kEX&#39;].value<br>
&gt;     phi = pars[&#39;phi&#39;].value<br>
&gt;     model =<br>
&gt; R1*cos(tiltAngle*pi/180)**2+(R2+phi*kEX/((2*pi*omega1/tan(tiltAngle*pi/180))**2+(2*pi*omega1)**2+kEX**2))*sin(tiltAngle*pi/180)**2<br>
&gt;     if data is None:<br>
&gt;         return model<br>
&gt;     if eps is None:<br>
&gt;         return (model - data)<br>
&gt;     return (model-data)/eps<br>
&gt;<br>
&gt; calling with<br>
&gt;<br>
&gt; datX = [tilt,om1]<br>
&gt; par = lmfit.Parameters()<br>
&gt; par.add(&#39;R1&#39;, value=1.0, vary=True)<br>
&gt; par.add(&#39;R2&#39;, value=40.0, vary=True)<br>
&gt; par.add(&#39;kEX&#39;, value=10000.0, vary=False, min=0.0)<br>
&gt; par.add(&#39;phi&#39;, value=100000.0, vary=True, min=0.0)<br>
&gt; lmf = lmfit.minimize(R1r_exch, par, args=(datX, R1rex,<br>
&gt; R1rex_err),method=&#39;leastsq&#39;)<br>
&gt;<br>
&gt; print lmf.success, lmf.nfev<br>
&gt; print par[&#39;R1&#39;].value, par[&#39;R2&#39;].value, par[&#39;kEX&#39;].value, par[&#39;phi&#39;].value<br>
&gt; fig = figure(&#39;R1r %s&#39;%NI)<br>
&gt; ax = fig.add_subplot(111)<br>
&gt; calcR1r = R1r_exch(par,datX)<br>
&gt; tilt_s, om1_s = zip(*sorted(zip(datX[0], datX[1])))<br>
&gt; datXs = [array(tilt_s), array(om1_s)]<br>
&gt; calcR1rs = f_R1r_exch_lmfit(par,datXs)<br>
&gt; -----------------------------------------------------------<br>
&gt;<br>
&gt; That goes fine for each single peak.<br>
&gt;<br>
&gt; But now I wan&#39;t to do global fitting.<br>
&gt; <a href="http://www.originlab.com/index.aspx?go=Products/Origin/DataAnalysis/CurveFitting/GlobalFitting" target="_blank">http://www.originlab.com/index.aspx?go=Products/Origin/DataAnalysis/CurveFitting/GlobalFitting</a><br>


&gt; <a href="http://www.wavemetrics.com/products/igorpro/dataanalysis/curvefitting/globalfitting.htm" target="_blank">http://www.wavemetrics.com/products/igorpro/dataanalysis/curvefitting/globalfitting.htm</a><br>
&gt;<br>
&gt; I would like to fit the nonlinear model to several peak data sets<br>
&gt; simultaneously.<br>
&gt; The parameters &quot;R1,R2 and phi&quot; should be allowed to vary for each NMR peak,<br>
&gt; while kEX should be global and shared for all NMR peaks.<br>
&gt;<br>
&gt;<br>
&gt; Is there anybody who would be able to help finding a solution or guide med<br>
&gt; to a package?<br>
<br>
</div></div>The general solution for this kind of problems in statistics is to stack the<br>
fitting problems into one big problem.<br>
<br>
Stack all observations, concatenate the sub-problem specific<br>
parameters and the common parameters, and then write a model/error<br>
function that calculates all sub-problems and returns the stacked<br>
fitting error.<br>
<br>
Josef<br>
<div class="HOEnZb"><div class="h5"><br>
&gt;<br>
&gt;<br>
&gt; Best<br>
&gt; Troels Emtekær Linnet<br>
&gt;<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; SciPy-User mailing list<br>
&gt; <a href="mailto:SciPy-User@scipy.org">SciPy-User@scipy.org</a><br>
&gt; <a href="http://mail.scipy.org/mailman/listinfo/scipy-user" target="_blank">http://mail.scipy.org/mailman/listinfo/scipy-user</a><br>
&gt;<br>
_______________________________________________<br>
SciPy-User mailing list<br>
<a href="mailto:SciPy-User@scipy.org">SciPy-User@scipy.org</a><br>
<a href="http://mail.scipy.org/mailman/listinfo/scipy-user" target="_blank">http://mail.scipy.org/mailman/listinfo/scipy-user</a><br>
</div></div></blockquote></div><br>