使用Julia NeuralPDE求解积分微分PDE出现KeyError: key * 报错如何解决?
报错原因
- 积分哑变量与全局独立变量重名:定义积分算子时使用的变量名
E已经被声明为PDE的全局独立变量,ModelingToolkit在符号运算阶段无法区分全局变量和积分哑变量,解析乘法运算时触发KeyError: key * not found。 - 神经网络输入维度不匹配:PDE输入包含
t、E两个变量,但定义的神经网络第一层输入维度为1,维度不匹配会导致后续运行报错。 - 积分域与全局变量定义域冲突:积分算子设置的积分域为
(0, Inf),但全局E的定义域被限制为(0.0, 10.0),有限训练域内无法计算到无穷的积分项。
解决方案
调整代码中三处错误即可正常运行:
- 新增独立的积分哑变量,避免和全局
E重名 - 将积分域调整为和
E的全局定义域一致的有限区间 - 修改神经网络第一层输入维度为2,匹配两个输入变量
修改后的完整代码如下:
using NeuralPDE, Flux, ModelingToolkit, GalacticOptim, Optim, DiffEqFlux, DomainSets import ModelingToolkit: Interval, infimum, supremum @parameters t E @variables i(..) # 新增专属积分哑变量,不和全局变量重名 @parameters E_int Dt = Differential(t) # 积分域调整为和E的全局定义域一致 IE = Integral(E_int in Interval(0.0,10.0)) beta = 2.0 # 积分项内的变量替换为积分哑变量 eq = Dt(i(t, E)) + exp(-beta*E)*i(t, E) - IE(i(t,E_int)*exp(-beta*E_int))*exp(-E) ~ 0 bcs = [i(0., E) ~ exp(-E)] domains = [t ∈ Interval(0.0,100.0), E ∈ Interval(0.0, 10.0)] # 神经网络输入维度改为2,匹配t、E两个输入 chain = Chain(Dense(2,15,Flux.σ),Dense(15,1)) initθ = Float64.(DiffEqFlux.initial_params(chain)) strategy_ = GridTraining(0.05) discretization = PhysicsInformedNN(chain, strategy_; init_params = initθ, phi = nothing, derivative = nothing) @named pde_system = PDESystem(eq,bcs,domains,[t, E],[i(t, E)]) prob = NeuralPDE.discretize(pde_system,discretization)
内容的提问来源于stack exchange,提问作者dapias
相关产品推荐
相关产品推荐

