Julia GpABC包abc-example运行simulator函数报错原因排查
故障原因
报错是OrdinaryDiffEq版本迭代导致的接口行为差异:
你参考的示例编写时间较早,对应旧版OrdinaryDiffEq中,solve返回的ODESolution对象支持直接通过Array{Float64, 2}(Obs)转换为二维数值矩阵。你当前环境安装的是新版OrdinaryDiffEq,ODESolution默认以「向量的向量」结构存储逐时间步的状态值,直接强制转换为Float64二维矩阵时,Julia会尝试把整个ODESolution复合对象写入矩阵的单个Float64元素位置,最终触发类型不匹配的MethodError。
修复方法
只需要修改GeneReg函数最后返回求解结果的代码行,替换为正确提取二维数值矩阵的写法即可,两种写法效果一致,都能输出和原示例结构匹配的结果(行对应状态变量、列对应时间点):
- 写法1:直接拼接逐时间步的状态向量,逻辑最明确
# 替换原代码中的 return Array{Float64, 2}(Obs) return reduce(hcat, Obs.u)
- 写法2:调用解对象内置数组转换方法后转置
# 替换原代码中的 return Array{Float64, 2}(Obs) return Array(Obs)'
修改完成后重新运行脚本,simulator_function([2.0, 15.0, 1.0])即可正常返回3行101列的Float64类型求解结果,不会再触发类型转换错误。
内容的提问来源于stack exchange,提问作者Eva Janoušková
相关产品推荐
相关产品推荐

