使用python';s optimize.leastsq()和optimize.curve_fit
大家好,我的社区 我正在尝试使用Pyton的optimize.leastsq()或optimize.curve_fit()将数据拟合到Faddeeva函数(optimize.special.wofz)。拟合参数有以下两个:z1和z2。它们是复杂的,而自变量(时间)和函数的输出(meas_数据)是纯实数。这是我第一次尝试拟合数据:使用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 =
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')
第二次尝试如何?五月