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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 04:30:10