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

使用Julia NeuralPDE求解积分微分PDE出现KeyError: key * 报错如何解决?

报错原因

  • 积分哑变量与全局独立变量重名:定义积分算子时使用的变量名E已经被声明为PDE的全局独立变量,ModelingToolkit在符号运算阶段无法区分全局变量和积分哑变量,解析乘法运算时触发KeyError: key * not found。
  • 神经网络输入维度不匹配:PDE输入包含t、E两个变量,但定义的神经网络第一层输入维度为1,维度不匹配会导致后续运行报错。
  • 积分域与全局变量定义域冲突:积分算子设置的积分域为(0, Inf),但全局E的定义域被限制为(0.0, 10.0),有限训练域内无法计算到无穷的积分项。

解决方案

调整代码中三处错误即可正常运行:

  1. 新增独立的积分哑变量,避免和全局E重名
  2. 将积分域调整为和E的全局定义域一致的有限区间
  3. 修改神经网络第一层输入维度为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 16:45:03