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

Julia求解ODE时触发BoundsError错误,求解决方案

问题:Julia求解常微分方程(ODE)时出现BoundsError错误

原始代码

using DifferentialEquations

const C = 1.1;
const R = 0.9;
const A = 1e-4;
const B = 60/72;

function flow(t)
    bloodflow = A*sin.(2*π*t/B)
    bloodflow[bloodflow.<0] .= 0;
    return bloodflow
end

function pressure(P,p,t)
    return flow(t)/C - P/(C*R)
end

P0 = 90;
tspan = (0,1);
prob = ODEProblem(pressure,P0,tspan)
sol = solve(prob);

错误信息

BoundsError: attempt to access Float64 at index [false]

错误原因

flow函数的逻辑存在问题:求解器调用pressure时传入的t是标量(Float64类型),你使用向量化的sin.(...)后,得到的结果仍是标量,但后续尝试用bloodflow[bloodflow.<0] .= 0对标量进行布尔索引赋值——标量没有索引维度,因此触发BoundsError。

修正后的代码

using DifferentialEquations

const C = 1.1
const R = 0.9
const A = 1e-4
const B = 60/72

function flow(t)
    bloodflow = A * sin(2π * t / B)
    # 直接对标量做条件判断,替代数组索引操作
    return bloodflow < 0 ? 0.0 : bloodflow
end

function pressure(P, p, t)
    return flow(t)/C - P/(C*R)
end

P0 = 90.0  # 明确声明为浮点数,避免潜在类型不匹配
tspan = (0.0, 1.0)
prob = ODEProblem(pressure, P0, tspan)
sol = solve(prob)

额外说明

  • 移除了不必要的分号(Julia中仅用分号抑制输出,非语句强制结束符)
  • 将初始值和时间范围的元素改为浮点数,让类型更严谨
  • 把flow函数的数组操作替换为标量条件判断,完全匹配求解器的调用逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 16:47:51