使用NeuralPDE.jl求解二维泊松方程时遇MethodError问题求助
问题
尝试在Julia中使用NeuralPDE.jl包基于物理信息神经网络(PINN)求解二维泊松方程,代码取自官方文档,具体代码如下:
using NeuralPDE, Flux, ModelingToolkit, GalacticOptim, Optim, DiffEqFlux @parameters x y @variables u(..) @derivatives Dxx''~x @derivatives Dyy''~y # 2D PDE eq = Dxx(u(x,y)) + Dyy(u(x,y)) ~ -sin(pi*x)*sin(pi*y) # Boundary conditions bcs = [u(0,y) ~ 0.f0, u(1,y) ~ -sin(pi*1)*sin(pi*y), u(x,0) ~ 0.f0, u(x,1) ~ -sin(pi*x)*sin(pi*1)] # Space and time domains domains = [x ∈ IntervalDomain(0.0,1.0), y ∈ IntervalDomain(0.0,1.0)] # Neural network dim = 2 # number of dimensions chain = FastChain(FastDense(dim,16,Flux.σ),FastDense(16,16,Flux.σ),FastDense(16,1)) # Discretization dx = 0.05 discretization = PhysicsInformedNN(chain,GridTraining()) pde_system = PDESystem(eq,bcs,domains,[x,y],[u]) prob = discretize(pde_system,discretization)
执行到最后一行prob = discretize(pde_system,discretization)时出现如下错误:
WARNING: could not import DistributionsAD._mv_categorical_logpdf into ReverseDiffX ERROR: LoadError: MethodError: no method matching zero(::FastChain{Tuple{FastDense{typeof(σ),DiffEqFlux.var"#initial_params#130"{typeof(Flux.glorot_uniform),typeof(Flux.zeros),Int64,Int64}},FastDense{typeof(σ),DiffEqFlux.var"#initial_params#130"{typeof(Flux.glorot_uniform),typeof(Flux.zeros),Int64,Int64}},FastDense{typeof(identity),DiffEqFlux.var"#initial_params#130"{typeof(Flux.glorot_uniform),typeof(Flux.zeros),Int64,Int64}}}}) Closest candidates are: zero(!Matched::Type{Missing}) at missing.jl:103 zero(!Matched::Type{LibGit2.GitHash}) at /build/julia-98cBbp/julia-1.4.1+dfsg/usr/share/julia/stdlib/v1.4/LibGit2/src/oid.jl:220 zero(!Matched::Type{Pkg.Resolve.VersionWeight}) at /build/julia-98cBbp/julia-1.4.1+dfsg/usr/share/julia/stdlib/v1.4/Pkg/src/Resolve/versionweights.jl:15 ... Stacktrace: [1] _colon(::Float64, ::Function, ::Float64) at ./range.jl:45 [2] (::Colon)(::Float64, ::Function, ::Float64) at ./range.jl:41 [3] (::NeuralPDE.var"#150#157")(::Tuple{ModelingToolkit.VarDomainPairing,FastChain{Tuple{FastDense{typeof(σ),DiffEqFlux.var"#initial_params#130"{typeof(Flux.glorot_uniform),typeof(Flux.zeros),Int64,Int64}},FastDense{typeof(σ),DiffEqFlux.var"#initial_params#130"{typeof(Flux.glorot_uniform),typeof(Flux.zeros),Int64,Int64}},FastDense{typeof(identity),DiffEqFlux.var"#initial_params#130"{typeof(Flux.glorot_uniform),typeof(Flux.zeros),Int64,Int64}}}}}) at ./none:0 [4] iterate at ./generator.jl:47 [inlined] [5] collect(::Base.Generator{Base.Iterators.Zip{Tuple{Array{ModelingToolkit.VarDomainPairing,1},Array{FastChain{Tuple{FastDense{typeof(σ),DiffEqFlux.var"#initial_params#130"{typeof(Flux.glorot_uniform),typeof(Flux.zeros),Int64,Int64}},FastDense{typeof(σ),DiffEqFlux.var"#initial_params#130"{typeof(Flux.glorot_uniform),typeof(Flux.zeros),Int64,Int64}},FastDense{typeof(identity),DiffEqFlux.var"#initial_params#130"{typeof(Flux.glorot_uniform),typeof(Flux.zeros),Int64,Int64}}}},1}}},NeuralPDE.var"#150#157") at ./array.jl:665 [6] generate_training_sets(::Array{ModelingToolkit.VarDomainPairing,1}, ::Function, ::Array{Equation,1}, ::Array{Symbol,1}, ::Array{Symbol,1}, ::Dict{Symbol,Int64}, ::Dict{Symbol,Int64}) at /home/suribe06/.julia/packages/NeuralPDE/7SDF6/src/pinns_pde_solve.jl:297 [7] discretize(::PDESystem, ::PhysicsInformedNN{FastChain{Tuple{FastDense{typeof(σ),DiffEqFlux.var"#initial_params#130"{typeof(Flux.glorot_uniform),typeof(Flux.zeros),Int64,Int64}},FastDense{typeof(σ),DiffEqFlux.var"#initial_params#130"{typeof(Flux.glorot_uniform),typeof(Flux.zeros),Int64,Int64}},FastDense{typeof(identity),DiffEqFlux.var"#initial_params#130"{typeof(Flux.glorot_uniform),typeof(Flux.zeros),Int64,Int64}}}},GridTraining,Array{Float32,1},NeuralPDE.var"#165#167"{Flux.var"#34#36"{GridTraining}},NeuralPDE.var"#168#169"{Float32},GridTraining,Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}}) at /home/suribe06/.julia/packages/NeuralPDE/7SDF6/src/pinns_pde_solve.jl:418 [8] top-level scope at /home/suribe06/github/Modeling-Simulation-2/Project/PINN.jl:28 [9] include(::Module, ::String) at ./Base.jl:377 [10] exec_options(::Base.JLOptions) at ./client.jl:288 [11] _start() at ./client.jl:484 in expression starting at /home/suribe06/github/Modeling-Simulation-2/Project/PINN.jl:28
解决方法
这个错误核心是版本不兼容,结合环境信息和报错内容,按以下步骤解决:
1. 升级Julia版本
当前使用的Julia 1.4.1过于老旧,NeuralPDE.jl的新版本依赖Julia 1.6及以上版本的特性。建议升级到Julia 1.8或更高稳定版本,这是解决此类兼容性问题的根本方案。
2. 重建依赖环境
在新的Julia环境中,重新安装所有依赖包,确保版本兼容:
using Pkg Pkg.add(["NeuralPDE", "Flux", "ModelingToolkit", "GalacticOptim", "Optim", "DiffEqFlux"])
如果仍有问题,可以尝试指定NeuralPDE的最新兼容版本:
Pkg.add("NeuralPDE@latest")
3. 代码细节优化(非必需,但可避免潜在问题)
将边界条件中的0.f0改为0.0,pi*1简化为pi,统一数值类型:
bcs = [u(0,y) ~ 0.0, u(1,y) ~ -sin(pi)*sin(pi*y), u(x,0) ~ 0.0, u(x,1) ~ -sin(pi*x)*sin(pi)]
内容的提问来源于stack exchange,提问作者suribe06
相关产品推荐
相关产品推荐

