符号模型函数传入lmfit遇自变量无效错误,求解决方案
问题解决
报错核心原因
你定义的拟合函数g的参数是xa, anion, a,但告诉lmfit的独立变量是xCl和xI——这俩根本不在函数参数列表里,lmfit自然找不到对应自变量,所以抛出Invalid independent variable name错误。此外代码还有几个其他问题:用sympy符号运算做数值拟合、变量名混淆(定义了obj却用mod.fit)、缺少ydat数据,这些都需要一起修正。
修正后的完整代码
import numpy as np import lmfit # 示例数据:替换成你的真实数据即可 xCl = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) xI = np.array([0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.8, 0.11, 0.12]) # 生成带噪声的模拟目标数据,模拟你实际要拟合的ydat ydat = xCl * xI + 0.1 + np.random.normal(0, 0.2, size=len(xCl)) def g(xCl, xI, a): # 直接做数值计算,lmfit需要返回数值结果,不能用sympy符号 xzc = xCl * xI + a return xzc # 明确告知lmfit:函数g的独立变量是xCl和xI,剩余的a是拟合参数 obj = lmfit.Model(g, independent_vars=['xCl', 'xI']) pars = obj.make_params(a=0.1) # 调用拟合时用正确的变量名,且用关键字参数传递自变量更清晰 result = obj.fit(ydat, pars, xCl=xCl, xI=xI) print(result.fit_report())
关键改动说明
- 调整函数参数结构:把
xCl和xI直接作为g的参数,让lmfit能识别到指定的独立变量 - 替换符号运算为数值计算:lmfit要求拟合函数返回数值结果,sympy的符号对象无法用于数值拟合,改用numpy数组直接计算
- 修正变量名错误:原代码定义了
obj = lmfit.Model(...),却错误调用mod.fit,改为obj.fit - 补充模拟目标数据:原代码缺少拟合目标
ydat,这里生成了模拟数据,你可以替换成自己的真实实验/观测数据 - 用关键字参数传递自变量:调用
fit时使用xCl=xCl形式,避免因参数顺序出错
内容的提问来源于stack exchange,提问作者Z. K
相关产品推荐
相关产品推荐

