使用LMFIT拟合带共享参数的非线性曲线出现TypeError求助
错误原因
核心报错TypeError: unsupported operand type(s) for -: 'float' and 'str'说明你从dat文件读取的反射率R、透射率T数据为字符串类型,无法和模型输出的浮点数值做算术运算,该问题和kws参数配置无关。
修复步骤
- 读取数据时强制转换为数值类型,同时处理异常值:
# 读取数据并强制转换为数值,转换失败的值设为空值 R = pd.read_csv('R_si.dat', sep='\t', header=None) R = pd.to_numeric(R.iloc[2:, 1], errors='coerce').to_numpy() T = pd.read_csv('T_si.dat', sep='\t', header=None) T = pd.to_numeric(T.iloc[2:, 1], errors='coerce').to_numpy() # 过滤空值对应的行,波数数组也要同步裁剪 valid_mask = ~np.isnan(R) & ~np.isnan(T) R = R[valid_mask] T = T[valid_mask] wavenumbers = wavenumbers[valid_mask]
- 修正残差函数格式,lmfit要求残差返回一维数组,原代码将两个残差平均会丢失拟合信息,建议拼接两个曲线的残差同时优化:
def residual(pars, x, sigma=None, data1=None, data2=None): # 优先使用传入的x参数,避免依赖全局变量 n,k = refractive_index(x, pars) model1 = df_one_row(n, k, level=pars['level']) model2 = df_one_row1(n, k, level=pars['level']) if data1 is None and data2 is None: return np.concatenate([model1, model2]) res1 = model1 - data1 res2 = model2 - data2 if sigma is None: return np.concatenate([res1, res2]) return np.concatenate([res1 * sigma, res2 * sigma])
- 修正拟合方法名的拼写,lmfit的最小二乘方法名全为小写:
myfit = lmfit.minimize(residual, pfit, method='least_squares', args=(wavenumbers,), kws={'sigma':sigma, 'data1': R, 'data2':T })
内容的提问来源于stack exchange,提问作者leebyeoungju
相关产品推荐
相关产品推荐

