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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:14:04