在Apple M1上运行LSODA.jl示例

3
我正在尝试在我的 M1 MacBook Pro 上使用 Julia 中的 LSODA 求解 ODE 的代码。在我的 Linux 机器上一切都正常,但是尽管进行了很多谷歌搜索,我仍然无法解决这个问题。甚至在尝试从 LSODA.jl 的 Readme 运行简单示例时就出现了问题。
因此,我已经完成了以下工作:
  1. 我安装了实验性的 Julia 版本 1.8.0-rc3,适用于 macOS ARM(M 系列处理器),网址为 https://julialang.org/downloads/
  2. 在 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.0127790758875109530.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
2个回答

1

0
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:

这表明julia实际上无法找到底层的lsoda库。
嗯,不是的,lsoda不是底层库或任何东西,只是lsoda()未定义,很可能是因为LSODA.jl没有导出它。
但无论如何,这对我来说都很好用。

julia> using LSODA

julia> LSODA.lsoda
lsoda

julia> lsoda
lsoda

你能再确认一下你安装的包版本是否正确吗?


嗨,感谢您的回答。我刚才复制了错误信息,所以我编辑了帖子。这是否意味着julia无法看到该库?关于您的建议,我可以运行与您完全相同输出的三个命令...没有错误,但实际使用求解器会导致问题。正如我在第2点下所示,我安装了LSODA.jl v0.7.0。但我也尝试了v0.6.2,出现了相同的问题。 - Vanessa
@Vanessa 你可以尝试使用 Julia 的 Rosetta 版本,而不是 M-series 吗? - jling
刚刚尝试了Rosetta v1.7.3,上面的例子可以运行。感谢您的提示。然而,由于我最终需要从Python代码中调用Julia,并且这需要PyCall包,所以我现在遇到了问题,因为Julia Rosetta版本似乎不喜欢arm python安装。虽然我正在努力弄清楚是否可以让它工作,但我想问一下,您知道如何让Julia识别特定的库吗?就像我上面说的,我从头开始构建了Julia找不到的库。我只是不知道该如何告诉Julia在哪里找到它。您知道怎么做吗? - Vanessa
我认为最干净的解决方案是在这里添加M系列支持:https://github.com/JuliaPackaging/Yggdrasil/blob/master/L/LSODA/build_tarballs.jl - jling
作为我对Julia还不太熟悉,你能解释一下你的意思吗?或者说该如何做到这一点?通过查看https://github.com/JuliaPackaging/BinaryBuilderBase.jl/blob/4b21cde2105830e287271c323d909b9ee8a64c5e/src/Rootfs.jl#L714上支持的平台,我认为这意味着M1支持应该已经包括在内了。 - Vanessa
不在LSODA的配方中 - jling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接