scipy 曲线拟合未能拟合洛伦兹
scipy curve fit failing to fit Lorentzian
我正在尝试使用 scipy 中的 curve_fit 函数将一系列洛伦兹曲线拟合到一系列峰。
目前与我的问题相关的代码是:
def fit_a_Lorentzian_peak(wavenumber_position,amplitude,peak_center,linewidth):
x = ( wavenumber_position - peak_center)/ (linewidth/2.0)
return amplitude/( 1.0 + x**2)
Xdata, Ydata= numpy.loadtxt(....)
Xdata= numpy.array(Xdata)
Ydata= numpy.array(Ydata)
initialGuess = [Ydata[maximum_point_index], Xdata[maximum_point_index], 2.0]
fitting_parameters, covarance_matrix_of_fitting_parameters = curve_fit(fit_a_Lorentzian_peak, Xdata[data_range_to_fit_to_lower:data_range_to_fit_to_upper],Ydata[data_range_to_fit_to_lower:data_range_to_fit_to_upper],p0=initialGuess)
我省略了获取 data_range_to_fit_to_lower:data_range_to_fit_to_upper 的代码,因为它与正在发生的错误无关。
发生的错误如下:
File "D:\Python\Python27\lib\site-packages\scipy\optimize\minpack.py", line 515, in curve_fit
res = leastsq(func, p0, args=args, full_output=1, **kw)
File "D:\Python\Python27\lib\site-packages\scipy\optimize\minpack.py", line 354, in leastsq
shape, dtype = _check_func('leastsq', 'func', func, x0, args, n)
File "D:\Python\Python27\lib\site-packages\scipy\optimize\minpack.py", line 17, in _check_func
res = atleast_1d(thefunc(*((x0[:numinputs],) + args)))
File "D:\Python\Python27\lib\site-packages\scipy\optimize\minpack.py", line 427, in _general_function
return function(xdata, *params) - ydata
File "D:\DropBox\Dropbox\PhD\Time resolved spectroscopy data\utility\transmission_plotting_and_analysis_V_09.py", line 38, in fit_a_Lorentzian_peak
x = ( wavenumber_position - peak_center)/ (linewidth/2.0)
ValueError: operands could not be broadcast together with shapes (73757) (10332)
现在我确切地知道这里的问题是什么,但我完全不知道它为什么会发生或如何解决它。为什么 curve_fit 为我的拟合函数提供不同大小的参数和自变量数组?
现在我发现其他人也遇到了同样的问题:
ValueError: operands could not be broadcast together with shapes (0) (26) when using optimize.curve
但是,我在行中添加了明确确保我的 Xdata 和 Ydata 都是 numpy 数组的行,所以这不可能是同一个问题。
这里有没有人遇到过这个问题并且能够解决它?
如果是,怎么做?
感谢您的任何见解。
没关系,我的 initialGuess 数组是错误的。
不小心将 maximum_point_index 作为整数数组而不是整数输入,因此给出的初始参数估计值比参数多得多。
我正在尝试使用 scipy 中的 curve_fit 函数将一系列洛伦兹曲线拟合到一系列峰。 目前与我的问题相关的代码是:
def fit_a_Lorentzian_peak(wavenumber_position,amplitude,peak_center,linewidth):
x = ( wavenumber_position - peak_center)/ (linewidth/2.0)
return amplitude/( 1.0 + x**2)
Xdata, Ydata= numpy.loadtxt(....)
Xdata= numpy.array(Xdata)
Ydata= numpy.array(Ydata)
initialGuess = [Ydata[maximum_point_index], Xdata[maximum_point_index], 2.0]
fitting_parameters, covarance_matrix_of_fitting_parameters = curve_fit(fit_a_Lorentzian_peak, Xdata[data_range_to_fit_to_lower:data_range_to_fit_to_upper],Ydata[data_range_to_fit_to_lower:data_range_to_fit_to_upper],p0=initialGuess)
我省略了获取 data_range_to_fit_to_lower:data_range_to_fit_to_upper 的代码,因为它与正在发生的错误无关。
发生的错误如下:
File "D:\Python\Python27\lib\site-packages\scipy\optimize\minpack.py", line 515, in curve_fit
res = leastsq(func, p0, args=args, full_output=1, **kw)
File "D:\Python\Python27\lib\site-packages\scipy\optimize\minpack.py", line 354, in leastsq
shape, dtype = _check_func('leastsq', 'func', func, x0, args, n)
File "D:\Python\Python27\lib\site-packages\scipy\optimize\minpack.py", line 17, in _check_func
res = atleast_1d(thefunc(*((x0[:numinputs],) + args)))
File "D:\Python\Python27\lib\site-packages\scipy\optimize\minpack.py", line 427, in _general_function
return function(xdata, *params) - ydata
File "D:\DropBox\Dropbox\PhD\Time resolved spectroscopy data\utility\transmission_plotting_and_analysis_V_09.py", line 38, in fit_a_Lorentzian_peak
x = ( wavenumber_position - peak_center)/ (linewidth/2.0)
ValueError: operands could not be broadcast together with shapes (73757) (10332)
现在我确切地知道这里的问题是什么,但我完全不知道它为什么会发生或如何解决它。为什么 curve_fit 为我的拟合函数提供不同大小的参数和自变量数组?
现在我发现其他人也遇到了同样的问题: ValueError: operands could not be broadcast together with shapes (0) (26) when using optimize.curve
但是,我在行中添加了明确确保我的 Xdata 和 Ydata 都是 numpy 数组的行,所以这不可能是同一个问题。
这里有没有人遇到过这个问题并且能够解决它? 如果是,怎么做?
感谢您的任何见解。
没关系,我的 initialGuess 数组是错误的。 不小心将 maximum_point_index 作为整数数组而不是整数输入,因此给出的初始参数估计值比参数多得多。