我正在尝试在我的 M1 MacBook Pro 上使用 Julia 中的 LSODA 求解 ODE 的代码。在我的 Linux 机器上一切都正常,但是尽管进行了很多谷歌搜索,我仍然无法解决这个问题。甚至在尝试从 LSODA.jl 的 Readme 运行简单示例时就出现了问题。
因此,我已经完成了以下工作:
如果我尝试运行LSODA自述文件中的最小示例,我会得到以下输出(请参见底部的编辑,因为我复制了错误的错误):
这表明Julia实际上找不到底层的lsoda库。因此,我按照说明从头构建了该库。生成的
此时此刻,我有些迷茫,所以任何帮助都将不胜感激。
编辑: 我成功复制了上述问题描述中的错误。第三点给出以下错误输出:
因此,我已经完成了以下工作:
- 我安装了实验性的 Julia 版本 1.8.0-rc3,适用于 macOS ARM(M 系列处理器),网址为 https://julialang.org/downloads/
- 在 Julia 控制台中,我尝试安装 LSODA.jl 包,运行
] add LSODA
,但会产生以下结果:
(@v1.8) pkg> add LSODA
Resolving package versions...
Updating `~/.julia/environments/v1.8/Project.toml`
[7f56f5a3] + LSODA v0.7.0
Updating `~/.julia/environments/v1.8/Manifest.toml`
[9e28174c] + BinDeps v1.0.2
[7f56f5a3] + LSODA v0.7.0
[30578b45] + URIParser v0.4.1
[aae0fff6] + LSODA_jll v0.1.1+0
如果我尝试运行LSODA自述文件中的最小示例,我会得到以下输出(请参见底部的编辑,因为我复制了错误的错误):
julia> using LSODA
julia> function rhs!(t, x, ydot, data)
ydot[1]=1.0E4 * x[2] * x[3] - .04E0 * x[1]
ydot[3]=3.0E7 * x[2] * x[2]
ydot[2]=-ydot[1] - ydot[3]
nothing
end
rhs! (generic function with 1 method)
julia> y0 = [1.,0.,0.]
3-element Vector{Float64}:
1.0
0.0
0.0
julia> tspan = [0., 0.4]
2-element Vector{Float64}:
0.0
0.4
julia> res = lsoda(rhs!, y0, tspan, reltol= 1e-4, abstol = Vector([1.e-6,1.e-10,1.e-6]))
ERROR: UndefVarError: lsoda not defined
Stacktrace:
[1] top-level scope
@ REPL[7]:1
这表明Julia实际上找不到底层的lsoda库。因此,我按照说明从头构建了该库。生成的
liblsoda.dylib
库似乎可以让我成功运行测试(我得到了与LSODA Github上提到的相同输出)。此时,我不知道如何告诉Julia实际上使用这个库。我尝试重新构建Julia LSODA包,运行] build LSODA
(顺便说一句,运行] test LSODA
会产生与上述相同的错误),在库目录中启动Julia,将LD_LIBRARY_PATH环境变量设置为库的位置......但什么都没有用。当我运行示例时,仍然得到与上面相同的输出。为了检查我是否弄错了Julia安装本身的问题,我使用了不同的求解器(来自OrdinaryDiffEq包的Tsit5()
)运行了以下ODE求解示例,它没有任何问题,并给出了以下输出:julia> using OrdinaryDiffEq
julia> function rhs!(du, u, p, t)
du[1]=1.0E4 * u[2] * u[3] - .04E0 * u[1]
du[3]=3.0E7 * u[2] * u[2]
du[2]=-du[1] - du[3]
nothing
end
rhs! (generic function with 1 method)
julia> y0 = [1.,0.,0.]
3-element Vector{Float64}:
1.0
0.0
0.0
julia> tspan = (0., 0.4)
(0.0, 0.4)
julia> prob = ODEProblem(rhs!,y0,tspan)
ODEProblem with uType Vector{Float64} and tType Float64. In-place: true
timespan: (0.0, 0.4)
u0: 3-element Vector{Float64}:
1.0
0.0
0.0
julia> sol = solve(prob, Tsit5())
retcode: Success
Interpolation: specialized 4th order "free" interpolation
t: 281-element Vector{Float64}:
0.0
0.0014148463701573728
0.002044917824570354
0.0031082395219656383
0.004077786184478819
0.005515331547111039
0.007190039901585917
0.009125371178864151
0.011053910882556455
0.012779075887510953
⋮
0.38962386292571205
0.39105986979707663
0.3924964595438138
0.39393300822861893
0.3953689357731328
0.39680395859574674
0.3982382036135917
0.3996721389859908
0.4
u: 281-element Vector{Vector{Float64}}:
[1.0, 0.0, 0.0]
[0.9999434113374243, 3.283958368828848e-5, 2.3749078887421564e-5]
[0.9999182177955453, 3.554267892392701e-5, 4.623952553065492e-5]
[0.9998757150665857, 3.630246922738996e-5, 8.798246418685756e-5]
[0.9998369766423073, 3.6462803069599716e-5, 0.00012656055462304005]
[0.9997795672802454, 3.646643085493869e-5, 0.00018396628889956693]
[0.9997127287562698, 3.6447280004319005e-5, 0.00025082396372578164]
[0.9996355450580071, 3.636681631277154e-5, 0.00032808812568000767]
[0.99955869263762, 3.601892856283502e-5, 0.0004052884338170678]
[0.9994899965749859, 3.4686952113841286e-5, 0.00047531647290014134]
⋮
[0.9855287248204975, 3.3380535729784715e-5, 0.01443789464377367]
[0.9854791547754341, 3.3371763645216536e-5, 0.01448747346092161]
[0.985429589879464, 3.3361195969757255e-5, 0.014537048924567189]
[0.9853800515675893, 3.3349731795215403e-5, 0.014586598700616432]
[0.9853305597195883, 3.3338642943875154e-5, 0.014636101637468868]
[0.9852811239988389, 3.33290122744337e-5, 0.014685546988887663]
[0.9852317399743383, 3.332125091318715e-5, 0.014734938774749495]
[0.9851823915340508, 3.331492718519977e-5, 0.014784293538765007]
[0.985171094472304, 3.359314691926523e-5, 0.01479531238077784]
此时此刻,我有些迷茫,所以任何帮助都将不胜感激。
编辑: 我成功复制了上述问题描述中的错误。第三点给出以下错误输出:
ERROR: UndefVarError: liblsoda not defined
Stacktrace:
[1] lsoda_prepare
@ ~/.julia/packages/LSODA/En9TK/src/types_and_consts.jl:88 [inlined]
[2] lsoda(f::Function, y0::Vector{Float64}, tspan::Vector{Float64}; userdata::Nothing, reltol::Float64, abstol::Vector{Float64}, nbsteps::Int64)
@ LSODA ~/.julia/packages/LSODA/En9TK/src/solver.jl:97
[3] top-level scope
@ REPL[5]:1