使用COMSOL生成数据与DeepONet学习静电场电势分布
使用COMSOL生成数据与DeepONet学习静电场电势分布
1 引言
静电场仿真在电容式传感器、静电驱动MEMS、高压绝缘设计等领域具有重要应用价值。传统数值方法(如有限元法)虽精度高,但反复求解复杂边界条件或几何变化问题时计算成本巨大。近年来,算子学习框架的兴起为物理场快速预测提供了新范式。DeepONet作为代表性架构,能够学习从函数空间到函数空间的映射关系。本文将详细介绍如何利用COMSOL Multiphysics生成静电场仿真数据,并构建DeepONet模型学习边界电势函数到全场电势分布的映射关系,实现接近实时的静电场预测。
2 理论基础
2.1 静电场问题描述
静电场满足拉普拉斯方程或泊松方程:
\nabla \cdot (\epsilon \nabla \phi) = -\rho
其中:
\(\phi\)
为电势 (V)\(\epsilon\)
为介电常数 (F/m)\(\rho\)
为电荷密度 (C/m³)
在无源区域简化为:
\nabla^2 \phi = 0
边界条件通常包括:
- 狄利克雷边界:
\(\phi|_{\Gamma_D} = g_D\)
- 诺依曼边界:
\(\left. \frac{\partial \phi}{\partial n} \right|_{\Gamma_N} = g_N\)
2.2 DeepONet 架构原理
DeepONet的核心思想是将算子 \(\mathcal{G}: u \rightarrow s\)
分解为两个子网络:
\mathcal{G}(u)(y) \approx \sum_{k=1}^{p} \underbrace{b_k(u)}_{\text{Branch Net}} \cdot \underbrace{t_k(y)}_{\text{Trunk Net}}
- Branch Net:以输入函数
\(u\)
的离散采样\([u(x_1), ..., u(x_m)]\)
为输入,输出特征向量\(b \in \mathbb{R}^p\)
- Trunk Net:以空间坐标
\(y\)
为输入,输出特征向量\(t \in \mathbb{R}^p\)
- 输出:两个特征向量的点积作为预测值
\(\mathcal{G}(u)(y)\)

3 数据生成:基于COMSOL的静电场仿真
3.1 模型构建与参数化
几何模型:长方体域 \(\Omega = [0, 1] \times [0, 1] \times [0, 0.5] \, \text{m}^3\)
,中心放置 \(\epsilon_r = 2.3\)
的介质板。
边界条件参数化:
- 底面 (
z=0
):施加随机狄利克雷边界\(\phi_{\text{bottom}} \sim \mathcal{U}(0, 100)\)
- 顶面 (
z=0.5
):固定\(\phi_{\text{top}} = 0\)
- 侧面:诺依曼边界
\(\frac{\partial \phi}{\partial n} = 0\)
import numpy as np
import comsoldef generate_random_bc():"""生成随机边界条件函数"""bc_func = lambda x, y: np.random.uniform(0, 100) # 均匀分布随机电势return bc_funcdef run_comsol_simulation(bc_func, mesh_density=0.02):"""在COMSOL中执行静电场仿真"""model = comsol.load('electrostatics_base.mph')model.parameter('phi_bottom', str(bc_func)) # 传入边界函数model.mesh.settings('custom', element_size=mesh_density)model.solve('stationary')return model
3.2 数据采样策略
数据类型 | 采样位置 | 样本数量 | 用途 |
---|---|---|---|
输入函数 u | 底面网格节点 | 200点 | Branch Net输入 |
输出场 s | 全域规则网格 | 50×50×25=62,500点 | 训练目标值 |
坐标 y | 同输出场 | 62,500点 | Trunk Net输入 |
3.3 大规模数据生成流程
graph TDA[生成随机边界函数 u_i] --> B[COMSOL求解静电场]B --> C[提取底面采样 u_i(x_j)]B --> D[提取全场电势 φ_i(y_k)]C --> E[存储为输入数据]D --> F[存储为输出数据]E --> G[数据集D = {u_i, φ_i}]F --> G
4 DeepONet 模型实现
4.1 网络架构细节
Branch Net (处理边界条件):
- 输入层:200个边界采样点
- 隐藏层:4层全连接,每层128个神经元,ReLU激活
- 输出层:128维特征向量
\(b\)
Trunk Net (处理空间坐标):
- 输入层:3维坐标
(x, y, z)
- 隐藏层:3层全连接,每层128个神经元,ReLU + BatchNorm
- 输出层:128维特征向量
\(t\)
合并与输出:
\hat{\phi}(y) = \sum_{k=1}^{128} b_k \cdot t_k + b_0
4.2 损失函数与优化
import torch
import torch.nn as nnclass DeepONet(nn.Module):def __init__(self, branch_in=200, trunk_in=3, p=128):super().__init__()self.branch = nn.Sequential(nn.Linear(branch_in, 128), nn.ReLU(),nn.Linear(128, 128), nn.ReLU(),nn.Linear(128, p)self.trunk = nn.Sequential(nn.Linear(trunk_in, 128), nn.BatchNorm1d(128), nn.ReLU(),nn.Linear(128, 128), nn.BatchNorm1d(128), nn.ReLU(),nn.Linear(128, p))