Python 在scipy.optimize.curve_fit函数中为单个独立点指定边界

Python 在scipy.optimize.curve_fit函数中为单个独立点指定边界,python,numpy,scipy,curve-fitting,Python,Numpy,Scipy,Curve Fitting,我正在尝试将普朗克曲线拟合到辐射度读数。我知道一些已知波长(11个数据点)的辐射,要拟合的参数是温度 返回波长和温度的辐射度的普朗克函数: def bbody(lam, T) : lam = 1e-6 * lam # from micrometres to metres return 2*h*c**2 / ( lam**5 * ( np.exp(h*c/(lam*k*T)) - 1 ) ) # radiance in SI units: W.m-2.sr-1.m-1 由scip

我正在尝试将普朗克曲线拟合到辐射度读数。我知道一些已知波长(11个数据点)的辐射,要拟合的参数是温度

返回波长和温度的辐射度的普朗克函数:

def bbody(lam, T) :
    lam = 1e-6 * lam # from micrometres to metres
    return 2*h*c**2 / ( lam**5 * ( np.exp(h*c/(lam*k*T)) - 1 ) ) # radiance in SI units: W.m-2.sr-1.m-1
由scipy.optimize.curve_拟合使用,输入11个波长的辐射读数:

def fit_planck_curve(wavs_list, rads_list) :
    temp = curve_fit(bbody, wavs_list, rads_list, p0=1800)
    return(temp)
拟合函数是在获得辐射数据并声明产生这些数据的波长后调用的。这里有一个例子:

wavelengths_list = [0.555, 0.659, 0.865, 1.375, 1.61, 2.25, 3.74, 10.85, 12, 3.74, 10.85]
radiances_list = [268900000.00000006, 233200000.00000003, 174400000.0, 200000.0, 49200000.0, 8800000.0, 725170.86180638766, 5713946.0379738025, 5468427.1473144693, 902723.66658727441, 5698079.1655633291]
Temp_estimate = fit_planck_curve(wavelengths_list, radiances_list)[0][0]
到目前为止,这是可行的

但是我想输入更多的信息,即波长的界限。 对于进行辐射度读数的11个波长中的每一个(自变量),都有界限:

wl_width_array = np.array([0.02, 0.02, 0.02, 0.015, 0.06, 0.05, 0.38, 0.9, 1, 0.38, 0.9])
wl_lowerbound_list = list(np.array(wavelengths_list) - wl_width_array)
wl_upperbound_list = list(np.array(wavelengths_list) + wl_width_array)
这两个列表是11个波长的上限和下限

如何使scipy.optimize.curve_拟合考虑这些边界?有边界选项,但从示例中,我了解到这些是自变量作为一个整体的边界,而不是单个点的边界

我尝试将边界设置为2元组,其中第一个元素是两个独立变量的下界,第二个元素是上界。每个元素由一个列表(11个波长的下限或上限)和另一个自变量(温度)的np.inf组成,因此该自变量不设为界:

然而,我犯了一个错误

如何做到这一点?使用scipy.optimize.curve_fit是否可能实现这一点?还是有其他选择

谢谢。

看来你的“界限”以某种方式量化了自变量(波长)读数的不确定性

bounds
参数绝对没有帮助:它的工作是为您估计的参数设置允许的边界(例如,您知道温度不是负值)

如果处理因变量上的误差条,可以直接使用
最小二乘法
形式的成本函数
和i(y\u i-f(x\u i))**2/dy\u i**2

既然你在处理一个自变量上的错误条,单靠它是行不通的。
考虑这些因素的一个简单方法是假设个别测量值的某些分布(例如,宽度由边界给定的高斯分布),生成一组合成数据集,拟合这些数据集并分析结果的温度分布。

Hello。谢谢你的回复。正如我所担心的,这比我想象的要复杂。
wl_bounds = ([wl_lowerbound_list, -np.inf] , [wl_upperbound_list, np.inf])