使用python的optimize.leastsq()和optimize.curve_fit将数据拟合到Faddeeva函数

时间:2017-06-27 07:53:28

标签: python

Hello Stackoverflow社区,

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

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                                 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

我用于拟合的数据是10e-6到10e-2范围内的数据,测量数据范围是10e-19到10e-16。两个测试函数用于计算单个数字,因为z1和z2是已知的工作。我认为它与python的拟合例程有关,它们在计算过程中可能无法处理复杂的值?

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

1 个答案:

答案 0 :(得分:0)

PRMoureu就我的问题发表的第三条评论解决了这个问题。