You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用LMFIT拟合带共享参数的非线性曲线出现TypeError求助

错误原因

核心报错TypeError: unsupported operand type(s) for -: 'float' and 'str'说明你从dat文件读取的反射率R、透射率T数据为字符串类型,无法和模型输出的浮点数值做算术运算,该问题和kws参数配置无关。

修复步骤
    1. 读取数据时强制转换为数值类型,同时处理异常值:
# 读取数据并强制转换为数值,转换失败的值设为空值
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]
    1. 修正残差函数格式,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])
    1. 修正拟合方法名的拼写,lmfit的最小二乘方法名全为小写:
myfit = lmfit.minimize(residual, pfit, method='least_squares', args=(wavenumbers,), kws={'sigma':sigma, 'data1': R, 'data2':T })

内容的提问来源于stack exchange,提问作者leebyeoungju

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 14:27:03