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
相关产品推荐
相关产品推荐

