PDE+PINN+DFSNet

知识基础补充

在这里插入图片描述
PINN的原理就是通过训练神经网络,来最小化损失函数,使得神经网络接近于偏微分方程的解
损失函数是初始边界条件的残差项,以及求解域内部偏微分方程的残差.
在这里插入图片描述
训练完成后进行推断就可以得到时空上的解了.

首先我们构建一个神经网络来作为方程的解
给定对应的时空变量x,t,神经网络可以给出对应的数值解u
(注意真实解u帽和u有一定距离)
在这里插入图片描述
损失函数Lb主要使得u帽满足边界条件;
Lf用于构建域内部解的损失Lf(主要使得u帽满足BG方程本身),需要按照BG方程的结构求解u帽对于时空变量xt的梯度,并带入方程,使得方程此处等于0。

下面把两部分进行加权求和,得到总损失L
训练的过程就是不断优化cita,使得总损失最小(也就是u帽满足BG方程的边界条件以及方程本身)

背景

机器学习技术的逼近能力有限,这些模型可能无法保证期望的预测结果,并且对于复杂的非线性PDE系统,往往会产生不准确的解。
提出DNN解决->PINN解决(PINN的问题):尽管基于PINN的方法看起来很简单,但这些方法在满足所有方程残差(特别是边界条件)方面通常会遇到困难,导致一些局部解的收敛速度慢或近似结果不稳定。->其他人的改进是有监督学习->提出无监督的学习

Methodology

介绍了 PINN的过程与不足

模型的输入是什么:DFS-Net 使用随机时空点坐标作为代理方法的输入
损失函数:由控制方程残差和边界 / 初始条件项构成

加权思想:中心点比边缘点更富有信息(中间的点加权大)
在这里插入图片描述
数据增强:
引入线性扩展层作为DFS网络中的数据增强
在这里插入图片描述
我的理解(增加了非线性性?)

激励块:以进一步提高DFS网的逼近能力。激励块是建立在两个层之间的变换上的计算单元。它将最后一个隐藏层的输出作为输入,并生成每个信道调制权重的集合,这可以看作是一种简单的自选通机制。

(1)固定激励模式和(2)非固定激励模式。

整体结构:

为了缓解代理求解方法在不同子域(例如,计算域内部或近壁区域)上的预测结果不稳定问题,DFS-Net使用了一种点加权机制来校准随机采样训练点的权重
此外,方法还引入了基于注意力的激励块**(excitation block)**来提高方法的拟合精度并加速训练。
在这里插入图片描述

### 关于 PINN 的实现与应用 PINN 是一种结合了神经网络和物理约束的方法,用于求解偏微分方程 (PDE)[^2]。通过将物理定律作为额外的损失项加入到训练过程中,PINN 能够显著提高模型在科学计算中的表现[^1]。 以下是基于 Python 和 TensorFlow/Keras 的简单 PINN 示例代码,展示如何利用神经网络解决一维热传导方程: ```python import numpy as np import tensorflow as tf from tensorflow.keras import layers, models # 定义神经网络架构 def create_pinn(input_dim=1): model = models.Sequential() model.add(layers.InputLayer(input_shape=(input_dim,))) model.add(layers.Dense(32, activation='tanh')) model.add(layers.Dense(32, activation='tanh')) model.add(layers.Dense(1)) return model # 构建 PDE 损失函数 @tf.function def pde_loss(model, x, t): with tf.GradientTape(persistent=True) as tape: tape.watch(x) tape.watch(t) X = tf.concat([x, t], axis=1) u_pred = model(X) u_x = tape.gradient(u_pred, x) u_t = tape.gradient(u_pred, t) del tape # 假设 PDE 形式为 ∂u/∂t - α * ∂²u/∂x² = 0 alpha = 0.1 u_xx = tape.gradient(u_x, x) residual = u_t - alpha * u_xx return tf.reduce_mean(tf.square(residual)) # 训练过程 model = create_pinn(input_dim=2) optimizer = tf.optimizers.Adam() for epoch in range(1000): x_train = tf.random.uniform((100, 1), minval=-1, maxval=1) t_train = tf.random.uniform((100, 1), minval=0, maxval=1) with tf.GradientTape() as tape: loss = pde_loss(model, x_train, t_train) grads = tape.gradient(loss, model.trainable_variables) optimizer.apply_gradients(zip(grads, model.trainable_variables)) if epoch % 100 == 0: print(f'Epoch {epoch}, Loss: {loss.numpy()}') print("Training completed.") ``` 上述代码展示了如何构建一个简单的 PINN 来近似满足给定的偏微分方程。该方法的核心在于定义了一个自定义的损失函数 `pde_loss`,它不仅考虑数据拟合误差,还加入了由 PDE 导致的残差项。 #### MATLAB 中的 PINN 实现思路 虽然 MATLAB 并不是主流的深度学习框架之一,但仍可以通过其工具箱(如 Deep Learning Toolbox)实现类似的 PINN 方法。MATLAB 提供的功能可以用来创建前馈神经网络并手动设置梯度计算逻辑。然而,由于缺乏自动微分支持,这可能需要更多手工推导的工作量。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值