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

Scipy solve_ivp中y类型异常:'float'不可下标访问问题求助

问题解决:Scipy solve_ivp 中 "float object is not subscriptable" 错误

错误根源

你的fun函数参数顺序不符合solve_ivp的要求:

  • solve_ivp调用自定义微分方程函数时,参数顺序是先传时间t,再传状态向量y,最后是args里的额外参数。
  • 你写的函数是def fun(y, t, J, param):,把y和t的顺序搞反了。这导致函数被调用时,y实际接收的是单个浮点数类型的时间t,而t接收的才是状态向量,自然无法对浮点数做切片操作,触发错误。

另外还有一个小问题:重构矩阵A时,切片起始索引错误。x是前N个元素(y[:N]),那么A的展开应该从索引N开始,而不是N+1,否则会丢失一个元素,导致后续reshape失败。

修正后的代码

修正微分方程函数

def fun(t, y, J, param):  # 调整t和y的顺序
    [g, k, p, N] = param
    x = np.reshape(y[:N], (N,))
    A = np.reshape(y[N:], (N, N))  # 修正切片起始索引
    W = J + A
    phiX = np.tanh(x)
    dx = -x + np.matmul(W, phiX)
    dA = -A + (k/N) * np.outer(phiX, phiX)
    return np.concatenate((dx, (1/p) * dA), axis=None)

求解代码保持不变

y0 = np.random.uniform(0, 1, (N*(N + 1),))
sol = solve_ivp(fun, (0, 300), y0=y0, first_step=0.1, args=(J, param))

额外说明

  • solve_ivp要求自定义函数的签名必须是fun(t, y, *args),这是官方明确规定的参数顺序,和旧版odeint的参数顺序刚好相反,容易混淆。
  • 确认param中的N和你初始化y0时使用的N一致,避免维度不匹配的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 04:12:40