使用python';s optimize.leastsq()和optimize.curve_fit

使用python';s optimize.leastsq()和optimize.curve_fit,python,Python,大家好,我的社区 我正在尝试使用Pyton的optimize.leastsq()或optimize.curve_fit()将数据拟合到Faddeeva函数(optimize.special.wofz)。拟合参数有以下两个:z1和z2。它们是复杂的,而自变量(时间)和函数的输出(meas_数据)是纯实数。这是我第一次尝试拟合数据: import numpy as np from scipy import optimize from scipy import special meas_data =

大家好,我的社区

我正在尝试使用Pyton的optimize.leastsq()或optimize.curve_fit()将数据拟合到Faddeeva函数(optimize.special.wofz)。拟合参数有以下两个:z1和z2。它们是复杂的,而自变量(时间)和函数的输出(meas_数据)是纯实数。这是我第一次尝试拟合数据:

import numpy as np
from scipy import optimize
from scipy import special

meas_data = np.loadtxt('directory')
time = np.loadtxt('directory')

def test(params, time):
    z1 = params[0]
    z2 = params[1]

    a = z1*np.sqrt(time)
    b = z2*np.sqrt(time)

    a = np.complex(0, a)
    b = np.complex(0, b)

    c = special.wofz(a)
    d = special.wofz(b)

    return np.real(c*d)

def test_error(params, time, t_error):
    return test(params, time) - t_error

initial_guess = (300+200j, 300-200j)
params_fit, cov_x, infodict, mesg, ier = optimize.leastsq(test_error, initial_guess, args = (time, meas_data), full_output = True)
我的第二次尝试看起来像:

import numpy as np
from scipy import optimize
from scipy import special

meas_data = np.loadtxt('directory')
time = np.loadtxt('directory')

def test(time, z1, z2):
    a = z1*np.sqrt(time)
    b = z2*np.sqrt(time)

    a = np.complex(0, a)
    b = np.complex(0, b)

    c = special.wofz(a)
    d = special.wofz(b)


    return np.real(c*d)

popt, pcov = optimize.curve_fit(test, time, meas_data)
对于这两种情况,我都会收到类似的错误消息:

第一次尝试:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-13-9286b2981692> in <module>()
     22 
     23 initial_guess = (300+200j, 300-200j)
---> 24 params_fit, cov_x, infodict, mesg, ier = optimize.leastsq(test_error, initial_guess, args = (time, msd), full_output = True)

/Users/tthalheim/anaconda/lib/python3.5/site-packages/scipy/optimize/minpack.py in leastsq(func, x0, args, Dfun, full_output, col_deriv, ftol, xtol, gtol, maxfev, epsfcn, factor, diag)
    375     if not isinstance(args, tuple):
    376         args = (args,)
--> 377     shape, dtype = _check_func('leastsq', 'func', func, x0, args, n)
    378     m = shape[0]
    379     if n > m:

/Users/tthalheim/anaconda/lib/python3.5/site-packages/scipy/optimize/minpack.py in _check_func(checker, argname, thefunc, x0, args, numinputs, output_shape)
     24 def _check_func(checker, argname, thefunc, x0, args, numinputs,
     25                 output_shape=None):
---> 26     res = atleast_1d(thefunc(*((x0[:numinputs],) + args)))
     27     if (output_shape is not None) and (shape(res) != output_shape):
     28         if (output_shape[0] != 1):

<ipython-input-13-9286b2981692> in test_error(params, time, t_error)
     19 
     20 def test_error(params, time, t_error):
---> 21     return test(params, time) - t_error
     22 
     23 initial_guess = (z1, z2)

<ipython-input-13-9286b2981692> in test(params, time)
     10     b = z2*np.sqrt(time)
     11 
---> 12     a = np.complex(0, a)
     13     b = np.complex(0, b)
     14 

TypeError: only length-1 arrays can be converted to Python scalars
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在()
22
23初始猜测=(300+200j,300-200j)
--->24参数拟合,cov x,infodict,mesg,ier=optimize.leastsq(测试错误,初始猜测,参数=(时间,msd),完整输出=True)
/用户/tthalheim/anaconda/lib/python3.5/site-packages/scipy/optimize/minpack.py(func、x0、args、Dfun、full_输出、col_deriv、ftol、xtol、gtol、maxfev、epsfcn、factor、diag)
375如果不是isinstance(参数、元组):
376 args=(args,)
-->377形状,数据类型=_check_func('leastsq','func',func,x0,args,n)
378米=形状[0]
379如果n>m:
/Users/tthalheim/anaconda/lib/python3.5/site-packages/scipy/optimize/minpack.py in_check_func(checker、argname、thefunc、x0、args、numinput、output_shape)
24 def\u check\u func(checker、argname、thefunc、x0、args、numinput、,
25输出(形状=无):
--->26 res=至少1d(thefunc(*(x0[:numput],)+args)))
27如果(输出形状不是无)和(形状(分辨率)!=输出形状):
28如果(输出_形[0]!=1):
测试中的错误(参数、时间、t错误)
19
20 def测试错误(参数、时间、测试错误):
--->21返回测试(参数、时间)-t_错误
22
23初始猜测=(z1,z2)
测试中(参数、时间)
10b=z2*np.sqrt(时间)
11
--->12 a=np.复合体(0,a)
13b=np.复数(0,b)
14
TypeError:只有长度为1的数组才能转换为Python标量
第二次尝试:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-8-8f631a7ede54> in <module>()
     16     return np.real(c*d)
     17 
---> 18 popt, pcov = optimize.curve_fit(test, time, msd)

/Users/tthalheim/anaconda/lib/python3.5/site-packages/scipy/optimize/minpack.py in curve_fit(f, xdata, ydata, p0, sigma, absolute_sigma, check_finite, bounds, method, jac, **kwargs)
    674         # Remove full_output from kwargs, otherwise we're passing it in twice.
    675         return_full = kwargs.pop('full_output', False)
--> 676         res = leastsq(func, p0, Dfun=jac, full_output=1, **kwargs)
    677         popt, pcov, infodict, errmsg, ier = res
    678         cost = np.sum(infodict['fvec'] ** 2)

/Users/tthalheim/anaconda/lib/python3.5/site-packages/scipy/optimize/minpack.py in leastsq(func, x0, args, Dfun, full_output, col_deriv, ftol, xtol, gtol, maxfev, epsfcn, factor, diag)
    375     if not isinstance(args, tuple):
    376         args = (args,)
--> 377     shape, dtype = _check_func('leastsq', 'func', func, x0, args, n)
    378     m = shape[0]
    379     if n > m:

/Users/tthalheim/anaconda/lib/python3.5/site-packages/scipy/optimize/minpack.py in _check_func(checker, argname, thefunc, x0, args, numinputs, output_shape)
     24 def _check_func(checker, argname, thefunc, x0, args, numinputs,
     25                 output_shape=None):
---> 26     res = atleast_1d(thefunc(*((x0[:numinputs],) + args)))
     27     if (output_shape is not None) and (shape(res) != output_shape):
     28         if (output_shape[0] != 1):

/Users/tthalheim/anaconda/lib/python3.5/site-packages/scipy/optimize/minpack.py in func_wrapped(params)
    453     if weights is None:
    454         def func_wrapped(params):
--> 455             return func(xdata, *params) - ydata
    456     else:
    457         def func_wrapped(params):

<ipython-input-8-8f631a7ede54> in test(time, z1, z2)
      7     b = z2*np.sqrt(time)
      8 
----> 9     a = np.complex(0, a)
     10     b = np.complex(0, b)
     11 

TypeError: only length-1 arrays can be converted to Python scalars
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在()
16返回np.实数(c*d)
17
--->18 popt,pcov=优化曲线拟合(试验、时间、msd)
/曲线拟合中的用户/tthalheim/anaconda/lib/python3.5/site-packages/scipy/optimize/minpack.py
674#从kwargs中删除完整输出,否则我们将传入两次。
675 return\u full=kwargs.pop('full\u output',False)
-->676 res=leastsq(func,p0,Dfun=jac,满输出=1,**kwargs)
677 popt、pcov、infodict、errmsg、ier=res
678成本=总成本(infodict['fvec']**2)
/用户/tthalheim/anaconda/lib/python3.5/site-packages/scipy/optimize/minpack.py(func、x0、args、Dfun、full_输出、col_deriv、ftol、xtol、gtol、maxfev、epsfcn、factor、diag)
375如果不是isinstance(参数、元组):
376 args=(args,)
-->377形状,数据类型=_check_func('leastsq','func',func,x0,args,n)
378米=形状[0]
379如果n>m:
/Users/tthalheim/anaconda/lib/python3.5/site-packages/scipy/optimize/minpack.py in_check_func(checker、argname、thefunc、x0、args、numinput、output_shape)
24 def\u check\u func(checker、argname、thefunc、x0、args、numinput、,
25输出(形状=无):
--->26 res=至少1d(thefunc(*(x0[:numput],)+args)))
27如果(输出形状不是无)和(形状(分辨率)!=输出形状):
28如果(输出_形[0]!=1):
/func_wrapped中的Users/tthalheim/anaconda/lib/python3.5/site-packages/scipy/optimize/minpack.py(参数)
453如果权重为无:
454 def func_包装(参数):
-->455返回函数(扩展数据,*参数)-ydata
456其他:
457 def func_包装(参数):
试验中(时间,z1,z2)
7b=z2*np.sqrt(时间)
8.
---->9A=np.复数(0,a)
10b=np.复合物(0,b)
11
TypeError:只有长度为1的数组才能转换为Python标量
我用于拟合的数据是10e-6到10e-2范围内的时间,以及10e-19到10e-16范围内的测量数据。假设z1和z2是已知功,则用于计算单个数字的两个测试函数。我认为这与python的拟合例程有关,这些例程在计算过程中可能无法处理复杂的值


如果有人能帮我解决这个问题,我会非常高兴。

普穆鲁对我的问题的第三次评论解决了这个问题。

普穆鲁对我的问题的第三次评论解决了这个问题。

请你举一个输入
测量数据
时间
的例子好吗?然后你应该分解函数
test()
,以了解出了什么问题(通过更多的步骤更容易,回溯将指出真正的问题/行)好的,我已经分解了返回。复杂的建筑可能需要解决方法,你试过
np.vectorize(complex)(0,a)
?因此,我现在尝试了你的建议,例如,在第一次尝试中,我精确地将行
a=np.complex(0,a)
替换为
a=np.vectorize(complex)(0,a)
。Python现在引发了一个新类型的错误:
-->24个参数fit、cov\u x、infodict、mesg、ier=optimize.leastsq(test\u error、initial\u guess、args=(time、msd)、full\u output=True)。。。。。。TypeError:无法根据规则“安全”将数组数据从dtype('complex128')强制转换为dtype('float64')
第二次尝试如何?五月