Symfit代码运行遇除零与无效值警告,请求技术协助
Symfit拟合出现除零与无效值警告的问题分析与修复
我来帮你排查一下这个问题——你遇到的两个RuntimeWarning,根源其实是几个容易忽略的代码细节问题,咱们一步步来解决:
报错信息
/home/runner/.site-packages/symfit/core/fit.py:1046: RuntimeWarning: divide by zero encountered in true_divide W = 1/sigma**2/s_sq[:, np.newaxis] /home/runner/.site-packages/symfit/core/fit.py:1783: RuntimeWarning: invalid value encountered in double_scalars return 1 - SS_res/SS_tot
这些警告本质是拟合过程中残差或权重计算出现了无效值,核心问题出在你的代码逻辑上,不是symfit的bug。
你的代码里的关键问题
- 变量与表达式混淆:你先定义了
x1, ya = sf.variables('x1, ya'),紧接着又把ya赋值为拟合表达式,直接覆盖了因变量ya,导致symfit无法正确解析模型结构。 - 缺失因变量观测数据:拟合时只传入了
x1=x1data,但没有传入ya的目标观测值(也就是你生成的y1data),symfit无法计算残差,进而引发内部计算的无效值。 - 未定义约束中的
p:约束条件里的Eq(ya.subs({x1: 60}), -p)中的p没有赋值,导致约束逻辑无法正常计算。 - 常数未明确赋值:代码中提到
q_subm和EI是常数,但没有给出具体值,会导致表达式计算出错。
修正后的完整代码
import symfit as sf import numpy as np import matplotlib.pyplot as plt # 明确区分变量和参数,避免覆盖 x1 = sf.variable('x1') ya = sf.variable('ya') I1, I2, I3, A, B, C, D = sf.parameters('I1, I2, I3, A, B, C, D') # 初始化参数值 I1.value = 46.483 I2.value = 5.916 I3.value = 21.90 A.value = -3.828e-5 B.value = 0 C.value = 0 D.value = 0 # 给常数赋值(替换成你的实际值即可) q_subm = 1.0 EI = 1000.0 # 单独定义拟合表达式,不覆盖变量 ya_expr = A*x1**3 + B*x1**2 + C*x1 + D + (q_subm*x1**4)/(24*EI) # 正确定义模型:键是因变量,值是表达式 model = sf.Model({ya: ya_expr}) # 定义约束里的p(从你绘图的点来看,假设是0.4,替换成你的实际值) p = 0.4 # 修正约束条件:用表达式而非被覆盖的变量 constraints = [ sf.Eq(ya_expr.subs(x1, 0), 0), sf.Eq(ya_expr.subs(x1, 60), -p), sf.Eq(ya_expr.diff(x1).subs(x1, 0), 0), sf.Eq(ya_expr.diff(x1).subs(x1, 60), 0) ] # 生成观测数据 x1data = np.linspace(0, 60., 60) # 用表达式生成基准数据,转成numpy数组 y1data = np.array(ya_expr.subs({A: -3.828e-5, B:0, C:0, D:0, q_subm: q_subm, EI: EI}).evalf(x=x1data), dtype=np.float64) # 添加噪声 np.random.seed(2) y1data = np.random.normal(y1data, 0.005) # 绘图 plt.plot([60], [0.4], 'ro') plt.scatter(x1data, y1data) plt.savefig('plot.png') print('Done plotting fig') # 拟合时必须传入因变量的观测数据ya=y1data fit = sf.Fit(model, x1=x1data, ya=y1data, constraints=constraints) print('Done fitting model') fit_result = fit.execute() print(fit_result)
修正说明
- 把因变量
ya和拟合表达式ya_expr分开,避免symfit解析模型时出现混淆 - 拟合时传入了
ya=y1data,让symfit有了计算残差的目标数据 - 给
p、q_subm、EI都赋了明确的值,确保所有变量都能正确计算 - 约束条件改用
ya_expr而非被覆盖的ya变量,保证约束逻辑正确
这样修改后,应该就能解决你遇到的除零和无效值警告,顺利完成拟合了。
内容的提问来源于stack exchange,提问作者Ronald Schotman
相关产品推荐
相关产品推荐

