[SciPy-User] Fitting problem using optimize.fmin_slsqp
guillaume gwenael
gwenln44 at gmail.com
Thu May 19 06:07:54 EDT 2011
Hello,
I need to fit analytic data using a constrained least square fit. Here is
the script :
import numpy as npimport scipy as scp
from scipy.optimize import fmin_slsqp
def OriginalFunc(xaxis,a,b,c,d,e,f):
p1=d*1e3
p2=(a*e**2*c)/(p1*f)
p3=(a*b*e)/f
M=p3*np.sqrt( (1-1j*xaxis*p2)/(-1j*xaxis*p2) )
N = ((e*xaxis)/b)*np.sqrt( (1-1j*xaxis*p2)/(-1j*xaxis*p2) )
return M,p3,N
def FirstOrderLinSyst(num,den,xaxis):
j=np.complex(0,1)
fos=num/(den-j*xaxis)
return fos
def PartialFractionExpansion(coefs,ref,xaxis):
order=len(coefs)/2
num=coefs[:order]
den=coefs[order:]
SumK=0.
for k in range(order):
fos=FirstOrderLinSyst(num[k],den[k],xaxis)
SumK=SumK+fos
approx=ref*SumK
return approx
def Residuals(fitcoefs,curve,ref,xaxis):
diff=np.real(curve)-np.real(PartialFractionExpansion(fitcoefs,ref,xaxis))
err=np.sqrt(
np.sum(np.power(diff,2),axis=0)/np.sum(np.power(np.real(curve),2),axis=0) )
return np.array([err],dtype=float)
def GetParams4Fitting(init_fitcoefs,curve,ref,xaxis):
pbounds=[(-np.inf,np.inf),(-np.inf,np.inf),(-np.inf,np.inf),(-np.inf,np.inf),
(-np.inf,np.inf),(-np.inf,np.inf),(0,np.inf),(0,np.inf),(0,np.inf),
(0,np.inf),(0,np.inf),(0,np.inf)]
fitcoefs,fittedfunc,iters,imode,smode=fmin_slsqp(Residuals,
init_fitcoefs,
args=(curve,ref,xaxis),
bounds=pbounds)
return fitcoefs,fittedfunc,iters,imode,smode
# Parameters
a=1.204
b=344.4256
c=1.41
d=10
e=np.sqrt(3.5)
f=0.5
x_min=100
x_max=5000
step=100
xaxis=2*np.pi*np.array([np.arange(x_min,x_max+step,step)])
# Oiginal function
M,p3,N=OriginalFunc(xaxis,a,b,c,d,e,f)
# Initialization of fitting parameters
order=6
params_k=np.zeros((2*order))
# Fitting parameters computing
fitcoefs,fittedfunc,iters,imode,smode=GetParams4Fitting(params_k,M,p3,xaxis)
It returnes the foolwing error:
File "C:\Python26\lib\site-packages\scipy\optimize\slsqp.py", line 318, in
fmin_slsqp g = append(fprime(x),0.0) File
"C:\Python26\lib\site-packages\scipy\optimize\optimize.py", line 176, in
function_wrapper return function(x, *args) File
"C:\Python26\lib\site-packages\scipy\optimize\optimize.py", line 377, in
approx_fprime grad[k] = (f(*((xk+ei,)+args)) - f0)/epsilon ValueError:
setting an array element with a sequence.
Can anyone help me?
Regards,
Gwenaël
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.scipy.org/pipermail/scipy-user/attachments/20110519/7e835708/attachment.html>
More information about the SciPy-User
mailing list