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

使用DifferentialEquations.jl求解非自治ODE的问题排查

问题分析与解决方法

错误原因解析

第一个错误(广播语法问题)

你的初始代码中,u是一维数组(因为u0 = [20]),(0.1 + 0.2*t)*0.3是标量,标量与数组做元素级减法时必须用广播语法.-,否则会触发类型不匹配错误,这就是你看到提示“For element-wise subtraction, use broadcasting with dot syntax: scalar .- array”的原因。

第二个错误(解为常数的核心问题)

你修改后的代码虽然解决了广播问题,但犯了DifferentialEquations.jl中in-place模式ODE函数的关键错误:你重新给du赋值,而非修改传入的du数组的内容。

在in-place模式下,du是求解器预先分配好的数组,函数需要直接修改这个数组的元素值。当你执行du = ...时,只是让du指向了新变量,原数组根本没被修改,求解器拿到的始终是初始零数组,相当于告诉求解器u'(t)=0,所以解自然是常数u0。

修正后的代码

u0 = [20]
tspan = (0, 400)

# 方法1:直接修改du的元素(适合标量ODE场景)
function salt1(du, u, p, t)
    du[1] = (0.1 + 0.2*t)*0.3 - 5*u[1] / (0.01*t^2 - 4.9*t + 400)
end

# 方法2:广播赋值(适配多维数组,保持代码通用性)
# function salt1(du, u, p, t)
#     du .= (0.1 + 0.2*t)*0.3 .- 5*u ./ (0.01*t^2 - 4.9*t + 400)
# end

prob = ODEProblem(salt1, u0, tspan)  # 原代码中未定义参数p,需移除
sol = solve(prob)

额外注意事项

  • 原代码中ODEProblem参数里的p未定义,会引发新错误,需移除(若你的ODE无需参数)。
  • 若你的ODE是标量类型(即u0为单个数值而非数组),可使用更简洁的out-of-place模式:
u0 = 20.0
tspan = (0, 400)

function salt1(u, p, t)
    return (0.1 + 0.2*t)*0.3 - 5*u / (0.01*t^2 - 4.9*t + 400)
end

prob = ODEProblem(salt1, u0, tspan)
sol = solve(prob)

内容的提问来源于stack exchange,提问作者G. Church

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 06:43:15