solve_ivp报错:float()参数必须是字符串或数字而非'function'
问题分析与修复方案
错误原因
fun函数返回的是lambda函数,但solve_ivp要求传入的微分方程右侧函数必须直接返回当前状态的导数数组,而非另一个函数,这会导致求解器无法正确计算导数,引发错误。fun内部的lambda重复定义t, s参数,覆盖了外部传入的参数,逻辑冗余且易出错。fun2中的t参数未被实际使用,属于冗余参数。
修正后的代码
import numpy as np from scipy.integrate import solve_ivp def fun(t, s, rho_0, rho_1): # 直接计算并返回导数,不再返回lambda mat = np.array([[0.775416, 0], [0, 0.308968]]) return np.dot(mat, s) + np.array([rho_0, rho_1]) def fun2(rho_0, rho_1): t_eval = np.arange(0, 5) res = solve_ivp(fun, [0, 5], y0=[0, 0], t_eval=t_eval, args=(rho_0, rho_1), vectorized=True) return res.y[1] # 调用时无需传入冗余的t参数 print(fun2(rho_0=0.0099532, rho_1=0.001699))
关键改动说明
- 重构
fun函数:删除返回lambda的逻辑,直接计算导数数组,完全符合solve_ivp对右侧函数的要求。 - 优化矩阵定义:将一维数组改为直观的二维矩阵形式,省略冗余的
reshape操作。 - 移除冗余参数:删除
fun2中未使用的t参数,调用时也无需传入。 - 对齐参数顺序:
fun的参数顺序t, s, *args严格匹配solve_ivp的调用逻辑,确保额外参数rho_0、rho_1能正确传入。
内容的提问来源于stack exchange,提问作者Carl
相关产品推荐
相关产品推荐

