2024.1.21周报

目录

摘要

ABSTRACT

一、文献阅读

一、题目

二、摘要

三、Introduction

四、模型

一、连续时间模型

二、离散时间模型

五、结论 

二、实验代码

总结

摘要

本周我阅读了一篇题目为Physics-informed neural networks: A deep learning framework for solving forward and inverse problems involving nonlinear partial differential equations的论文,文章中主要解决了两个问题,即数据驱动解决方案和偏微分方程的数据驱动发现。第一个问题是偏微分方程的解,在给定参数λ,求系统解u(t,x),第二个问题是已知系统u(t,x),求λ能描述观察数据。其次,跑了一下论文中的NS方程,对其两个偏微分方程公式进行了更进一步的理解。

ABSTRACT

This week I read a paper titled “Physics-informed neural networks: A deep learning framework for solving forward and inverse problems involving nonlinear partial differential equations”. The paper mainly solves two problems, namely data-driven solutions and data-driven discovery of partial differential equations. The first problem is the solution of partial differential equations, which is to find the system solution given the parameter λ. The second problem is to describe the observed data by knowing the system and finding λ. Secondly, I ran the NS equation in the paper and further understood the two partial differential equation formulas.

一、文献阅读

一、题目

1、题目:Physics-informed neural networks: A deep learning framework for solving forward and inverse problems involving nonlinear partial differential equations

2、期刊会议:Journal of Computational Physics

3、论文链接:https://www.sciencedirect.com/science/article/abs/pii/S0021999118307125

二、摘要

作者在本篇文章中引入了基于物理的神经网络(即经过训练来解决监督学习任务的神经网络),作者设计了两种不同类型的算法,即连续时间模型和离散时间模型,连续时间模型形成了新的数据高效时空函数逼近器,离散时间模型允许使用具有无限数量级的Runge–Kutta时间步进方案。

In this article, the author introduces physics-based neural networks, which are neural networks trained to solve supervised learning tasks. The author designs two different types of algorithms: continuous-time models and discrete-time models. The continuous-time models create a novel data-efficient spatiotemporal function approximator, while the discrete-time models allow the use of Runge-Kutta time-stepping schemes with an infinite number of levels.

三、Introduction

在分析复杂的物理、生物或工程系统时,数据采集成本通常不可承受,我们不可避免地面临在部分信息下得出结论和做出决策的挑战。在这小数据范畴中,大多数先进的机器学习技术(如深度/卷积/循环神经网络)缺乏鲁棒性,未提供任何收敛保证。本篇论文采用深度神经网络并利用其作为通用函数逼近器的能力,利用这种方法,研究者直接处理非线性问题,通过利用自动微分技术,对神经网络进行微分,文章引入了偏微分方程的新类数值解算器,以及用于模型反演和系统识别的新的数据驱动方法,文章分为两部分:数据驱动解决方案和偏微分方程的数据驱动发现。第一个问题是偏微分方程的解,在给定参数λ,求系统解u(t,x),第二个问题是已知系统u(t,x),求λ能描述观察数据。

四、模型

一、连续时间模型

对于上述两个损失函数:

第一项趋于0,说明神经网络,能很好求出PDE的解,很好拟合了微分方程;第二项趋于0,说明训练集上每个点都有u_{NN}(x,t)\approx u(x,t)

创新

所有之前内嵌物理知识的机器学习算法,例如支持向量机,随机森林,高斯过程以及前馈/卷积/递归神经网络,仅作为黑盒工具。这里是通过重新修改针对基础微分算子“自定义”激活和损失函数来进一步研究。本文通过将其导数相对于其输入坐标(即空间和时间)取导数,从而将物理信息嵌入神经网络,期中物理由偏微分方程描述。

薛定谔方程

求解:使用五层神经网络,每层有100个神经元,激活函数为tanh函数,来估计the latent functionh(t,x) = [u(t,x),v(t,x)]

结果如下:

图1的顶部面板显示了预测的时空解的幅度|h(t,x)| = \sqrt{u^{2}(t,x)+v^{2}(t,x)}以及初始和边界训练数据的位置。该问题的预测误差针对测试数据进行了验证,底部的图显示了我们在不同的时间瞬间t = 0.59、0.79、0.98处呈现了精确解和预测解之间的比较。仅使用少量初始数据,物理信息神经网络可以准确地捕捉薛定谔方程的复杂非线性行为。

二、离散时间模型

结果如下:

Burger’s equation 连续模型

对比了N_{u},N_{f}取值与error关系,参与训练数据越多,得到的误差越小。(但是,训练数据相比于常见网络训练已经很少了)。同时也对比了不同网络层和神经元数目对error影响,网络越复杂相对来说还是error小一些的。
 

Burger’s equation 离散模型

影响离散模型算法的关键参数是q,\Delta t,测试了训练样本与error关系,训练样本越多,error越小。

五、结论 

这篇论文的结论指出了一种新的方法,即基于物理的神经网络,它是一类通用的函数逼近器。这种网络能够编码和控制给定数据集中的潜在物理定律,并使用偏微分方程来描述这些定律。在这项工作中,研究人员设计了数据驱动的算法,用于推断一般非线性偏微分方程的解,并构建了计算效率高的物理信息代理模型。这一方法为计算科学中的各种问题提供了有前途的结果,并为深度学习赋予了强大的数学物理能力,使其能够模拟我们周围的世界。

二、实验代码

1、定义class PhysicsInformedNN

Initialize the class:

    def __init__(self, x, y, t, u, v, layers):# 将输入的 x, y, t 沿第二个轴(axis=1)拼接成一个矩阵 X。X = np.concatenate([x, y, t], 1)# 计算矩阵 X 沿第 0 轴的最小值,得到一个包含每列最小值的向量,用于归一化。self.lb = X.min(0)# 计算矩阵 X 沿第 0 轴的最大值,得到一个包含每列最大值的向量,用于归一化。self.ub = X.max(0)# 将拼接后的矩阵 X 赋值给类属性 self.X。self.X = X# 从矩阵 X 中取出第一列,得到列向量 self.x。self.x = X[:,0:1]# 从矩阵 X 中取出第二列,得到列向量 self.y。self.y = X[:,1:2]# 从矩阵 X 中取出第三列,得到列向量 self.z。self.t = X[:,2:3]# 将输入的u和v赋值给类属性self.u和self.vself.u = uself.v = v# 将输入的layers给到self.layersself.layers = layers# Initialize NN# 用 initialize_NN 方法初始化神经网络的权重和偏置,并将结果赋值给类属性 self.weights 和 self.biases。self.weights, self.biases = self.initialize_NN(layers)        # Initialize parameters# 创建 TensorFlow 变量 lambda_1和2,初始化为0.0。self.lambda_1 = tf.Variable([0.0], dtype=tf.float32)self.lambda_2 = tf.Variable([0.0], dtype=tf.float32)# tf placeholders and graph# 创建 TensorFlow 会话 sess,配置允许软放置和设备日志。self.sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True,log_device_placement=True))# 创建 TensorFlow 占位符 ,用于输入 x,y,t,u,v 的数据。self.x_tf = tf.placeholder(tf.float32, shape=[None, self.x.shape[1]])self.y_tf = tf.placeholder(tf.float32, shape=[None, self.y.shape[1]])self.t_tf = tf.placeholder(tf.float32, shape=[None, self.t.shape[1]])self.u_tf = tf.placeholder(tf.float32, shape=[None, self.u.shape[1]])self.v_tf = tf.placeholder(tf.float32, shape=[None, self.v.shape[1]])# 调用 net_NS 方法,得到神经网络的预测值和方程残差。self.u_pred, self.v_pred, self.p_pred, self.f_u_pred, self.f_v_pred = self.net_NS(self.x_tf, self.y_tf, self.t_tf)# 计算损失函数,包括速度场预测误差、方程残差等。self.loss = tf.reduce_sum(tf.square(self.u_tf - self.u_pred)) + \tf.reduce_sum(tf.square(self.v_tf - self.v_pred)) + \tf.reduce_sum(tf.square(self.f_u_pred)) + \tf.reduce_sum(tf.square(self.f_v_pred))#创建 L-BFGS-B 优化器,用于最小化损失函数。self.optimizer = tf.contrib.opt.ScipyOptimizerInterface(self.loss, method = 'L-BFGS-B', options = {'maxiter': 50000,'maxfun': 50000,'maxcor': 50,'maxls': 50,'ftol' : 1.0 * np.finfo(float).eps})        # 创建 Adam 优化器self.optimizer_Adam = tf.train.AdamOptimizer()# 使用 Adam 优化器最小化损失函数self.train_op_Adam = self.optimizer_Adam.minimize(self.loss)                    # 创建 TensorFlow 初始化操作init = tf.global_variables_initializer()self.sess.run(init)

2、 该方法通过 Xavier 初始化方法初始化权重,而偏置初始化为零向量。

    def initialize_NN(self, layers):        weights = []biases = []num_layers = len(layers) for l in range(0,num_layers-1):W = self.xavier_init(size=[layers[l], layers[l+1]])b = tf.Variable(tf.zeros([1,layers[l+1]], dtype=tf.float32), dtype=tf.float32)weights.append(W)biases.append(b)        return weights, biases

3、通过使用 Xavier 初始化,该方法旨在为神经网络的权重提供合适的初始值,有助于提高训练效果。

 def xavier_init(self, size):# 获取输入维度,即权重矩阵的行数。in_dim = size[0]# 获取输出维度,即权重矩阵的列数。out_dim = size[1]# 计算 Xavier 初始化中使用的标准差。Xavier 初始化的标准差通常取决于输入和输出维度,xavier_stddev = np.sqrt(2/(in_dim + out_dim))return tf.Variable(tf.compat.v1.random.truncated_normal([in_dim, out_dim], stddev=xavier_stddev), dtype=tf.float32)# 定义了一个类方法 neural_net,用于进行神经网络的前向传播。# 接受输入 X、权重 weights 和偏置 biases 作为参数。

4、 定义了一个类方法 neural_net,用于进行神经网络的前向传播。

    def neural_net(self, X, weights, biases):num_layers = len(weights) + 1# 对输入 X 进行归一化,将其映射到范围 [-1, 1]。这里使用线性变换将输入特征归一化。H = 2.0*(X - self.lb)/(self.ub - self.lb) - 1.0for l in range(0,num_layers-2):W = weights[l]b = biases[l]H = tf.tanh(tf.add(tf.matmul(H, W), b))W = weights[-1]b = biases[-1]# 计算神经网络的输出,即最后一层隐藏层的输出乘以输出层的权重加上输出层的偏置。Y = tf.add(tf.matmul(H, W), b)return Y

5、定义NS方程

 def net_NS(self, x, y, t):# 接受三个输入变量 x、y、t,分别表示空间坐标(二维平面上的 x 和 y)和时间坐标。# 从模型的实例中获取两个超参数 lambda_1 和 lambda_2。lambda_1 = self.lambda_1lambda_2 = self.lambda_2# 将输入 x、y、t 连接成一个输入向量,传递给神经网络模型 neural_net,得到包含流函数 psi 和压力 p 的输出。psi_and_p = self.neural_net(tf.concat([x,y,t], 1), self.weights, self.biases)psi = psi_and_p[:,0:1]p = psi_and_p[:,1:2]# 通过对流函数求关于空间坐标 y 的梯度得到水平方向速度 u。# 通过对流函数求关于空间坐标 x 的梯度得到垂直方向速度 v。u = tf.gradients(psi, y)[0]v = -tf.gradients(psi, x)[0]  u_t = tf.gradients(u, t)[0]u_x = tf.gradients(u, x)[0]u_y = tf.gradients(u, y)[0]u_xx = tf.gradients(u_x, x)[0]u_yy = tf.gradients(u_y, y)[0]v_t = tf.gradients(v, t)[0]v_x = tf.gradients(v, x)[0]v_y = tf.gradients(v, y)[0]v_xx = tf.gradients(v_x, x)[0]v_yy = tf.gradients(v_y, y)[0]# 对流函数 psi 和压力 p 关于空间坐标 x 和 y 求梯度,得到压力梯度 p_x 和 p_y。p_x = tf.gradients(p, x)[0]p_y = tf.gradients(p, y)[0]# 类似地,计算速度场 v 关于时间 t 的导数 v_t,以及关于空间坐标 x 和 y 的一阶和二阶导数。f_u = u_t + lambda_1*(u*u_x + v*u_y) + p_x - lambda_2*(u_xx + u_yy) f_v = v_t + lambda_1*(u*v_x + v*v_y) + p_y - lambda_2*(v_xx + v_yy)return u, v, p, f_u, f_v

6、定义打印输出函数

    def callback(self, loss, lambda_1, lambda_2):print('Loss: %.3e, l1: %.3f, l2: %.5f' % (loss, lambda_1, lambda_2))

7、train 

 def train(self, nIter): tf_dict = {self.x_tf: self.x, self.y_tf: self.y, self.t_tf: self.t,self.u_tf: self.u, self.v_tf: self.v}start_time = time.time()for it in range(nIter):self.sess.run(self.train_op_Adam, tf_dict)# Printif it % 10 == 0:elapsed = time.time() - start_timeloss_value = self.sess.run(self.loss, tf_dict)lambda_1_value = self.sess.run(self.lambda_1)lambda_2_value = self.sess.run(self.lambda_2)print('It: %d, Loss: %.3e, l1: %.3f, l2: %.5f, Time: %.2f' % (it, loss_value, lambda_1_value, lambda_2_value, elapsed))start_time = time.time()self.optimizer.minimize(self.sess,feed_dict = tf_dict,fetches = [self.loss, self.lambda_1, self.lambda_2],loss_callback = self.callback)

8、predict

    def predict(self, x_star, y_star, t_star):tf_dict = {self.x_tf: x_star, self.y_tf: y_star, self.t_tf: t_star}u_star = self.sess.run(self.u_pred, tf_dict)v_star = self.sess.run(self.v_pred, tf_dict)p_star = self.sess.run(self.p_pred, tf_dict)return u_star, v_star, p_star

9、绘图函数 

def plot_solution(X_star, u_star, index):lb = X_star.min(0)ub = X_star.max(0)nn = 200x = np.linspace(lb[0], ub[0], nn)y = np.linspace(lb[1], ub[1], nn)X, Y = np.meshgrid(x,y)U_star = griddata(X_star, u_star.flatten(), (X, Y), method='cubic')plt.figure(index)plt.pcolor(X,Y,U_star, cmap = 'jet')plt.colorbar()

10、调整3D坐标轴,使其在三个维度上具有相同的比例,从而保持数据的等比例缩放

def axisEqual3D(ax):extents = np.array([getattr(ax, 'get_{}lim'.format(dim))() for dim in 'xyz'])sz = extents[:,1] - extents[:,0]centers = np.mean(extents, axis=1)maxsize = max(abs(sz))r = maxsize/4for ctr, dim in zip(centers, 'xyz'):getattr(ax, 'set_{}lim'.format(dim))(ctr - r, ctr + r)

总结

深度学习神经网络求解偏微分方程可以大幅度提高效率,比传统的偏微分方程求解器更快地求出近似解。目前该方向主要分为 3 大类:数据驱动、物理约束、物理驱动。下周继续学习PINN的内容,多了解一些偏微分方程,补一些知识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/639777.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

快速傅立叶变换FFT学习笔记

什么是FFT? FFT(Fast Fourier Transformation) 是离散傅氏变换(DFT)的快速算法,即快速傅氏变换。FFT使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多&#x…

图像数据增广

目录 一、常用的图像增广方法 1、随机翻转 2、随机裁剪 3、随机颜色变换 二、图像代码实现 1、定义图像显示辅助函数 2、随机翻转 3、随机裁剪 4、随机颜色变换 5、结合多种图像增广方法 三、使用图像增广进行训练 1、下载数据集 2、读取图像并增广 3、多GPU训练 …

ctfshow-反序列化(web271-web276)

目录 web271 web272-273 web274 web275 web276 为什么不用分析具体为什么能成功 ,后面会有几个专题 会对php框架进行更深入的了解 这里面会专门的研究 为什么能够实现RCE 前面作为初步的熟悉 首先知道一下他的框架 知道框架的风格 知道啥版本可以用什么来打 首先先不用太研…

2024最新软件测试面试题合集

1、前端和后端有什么区别 前端能够从 App 屏幕和浏览器上看到的东西。例如,你所看到的内容、按钮、图片,它们都属于前端。 后端就是那些你在屏幕上看不到但又被用来为前端提供支持的东西。网站的后端涉及搭建服务器、保存和获取数据,以及用于…

自定义注解与拦截器实现不规范sql拦截(自定义注解填充插件篇)

在自定义注解与拦截器实现不规范sql拦截(拦截器实现篇)中提到过,写了一个idea插件来辅助对Mapper接口中的方法添加自定义注解,这边记录一下插件的实现。 需求简介 在上一篇中,定义了一个自定义注解对需要经过where判…

[足式机器人]Part2 Dr. CAN学习笔记- Kalman Filter卡尔曼滤波器Ch05

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记 - Kalman Filter卡尔曼滤波器 Ch05 1. Recursive Algirithm 递归算法2. Data Fusion 数据融合Covarince Matrix协方差矩阵State Space状态空间方程 Observation观测器3. Step by step : Deriatio…

【Java】面向对象之继承超级详解!!

文章目录 前言一、继承1.1 继承的概念1.1.1继承的语法 1.2 父类成员访问1.2.1 子类中访问父类的成员变量1.子类和父类中没有同名的成员变量2.子类和父类中有同名的成员变量 1.2.2子类中访问父类的成员方法成员方法名不同成员方法名字相同 1.3 super关键字1.4 子类构造方法1.5 继…

Python零基础教程5.1——Python官方自带Turtle.demo

官方装13最为致命 牛!Python自带画图demo引言DEMO有什么?总结 牛!Python自带画图demo 引言 我的电脑不是换新了嘛 所以 不得不重新下载Python 这一下 不得了 我下载了Python3.11.7这个版本 然后按照惯例 打开IDEL 平平无奇 但 我一不小心…

特斯拉开年再降价,2024年的汽车市场还会好吗?

“等等派”再度胜利!1月12日,特斯拉中国官宣Model 3和Model Y降价。其中,Model 3焕新版下降15500元,Model 3长续航焕新版下调11500元;特斯拉Model Y后轮驱动版售价下调7500元,特斯拉Model Y长续航版售价下调…

《GitHub Copilot 操作指南》课程介绍

第1节:GitHub Copilot 概述 一、什么是 GitHub Copilot 什么是 GitHub Copilot GitHub Copilot是GitHub与OpenAI合作开发的编程助手工具,利用机器学习模型生成代码建议。它集成在开发者的集成开发环境(IDE)中,可以根…

Excel象限图

Excel象限图 1、背景描述2、象限图(散点图)3、象限图(气泡图) 1、背景描述 平常我们在工作中做图表时,使用最多的就是柱状形、折线图、饼图,这些图表主要为了展示趋势、对比和构成,但有时候我们…

文本生成中的解码器方法

一.解码器的基本介绍 在文本生成任务中,解码器是生成序列的关键组件。解码器的目标是从先前生成的标记或隐藏状态中生成下一个标记。有几种方法用于设计文本生成中的解码器,以下是一些常见的解码器方法: Teacher Forcing(教师强…

自己动手造一个状态机

自己动手造一个状态机 引言有限自动状态机 (FSM)五要素应用场景优势 开源产品造个轮子改造点Looplab fsm示例演示实现解析 改造过程 引言 有限自动状态机 (Finite-state machine , FSM) 通常用来描述某个具有有限个状态的对象,并且在对象的生命周期中组成了一个状态…

flink基本概念

1. Flink关键组件: 这里首先要说明一下“客户端”。其实客户端并不是处理系统的一部分,它只负责作业的提交。具体来说,就是调用程序的 main 方法,将代码转换成“数据流图”(Dataflow Graph),并最终生成作业…

堆详解与优先级队列

导言: 我们知道队列是一种先进先出(FIFO)的数据结构,但是现实情况中,操作的数据有可能会有优先级,优先级高的数据要先出队。例如,医院的军人优先等等。而为此应运而生的就是优先级队列,java中可以使用Prio…

力扣hot100 相交链表 超全注释 满级表达

Problem: 160. 相交链表 文章目录 思路复杂度💖 Ac Code 思路 👨‍🏫 参考题解 👩‍🏫 参考图解 复杂度 时间复杂度: O ( n m ) O(nm) O(nm) 空间复杂度: 添加空间复杂度, 示例: O ( 1 ) O(1) O(…

详谈c++智能指针!!!

文章目录 前言一、智能指针的发展历史1.C 98/03 的尝试——std::auto_ptr2.std::unique_ptr3.std::shared_ptr4.std::weak_ptr5.智能指针的大小6.智能指针使用注意事项 二、智能指针的模拟实现三、C11和boost中智能指针的关系 前言 C/C 语言最为人所诟病的特性之一就是存在内存…

Docker是什么

docker本质 Docker 本质其实是 LXC 之类的增强版,它本身不是容器,而是容器的易用工具。容器是 linux 内核中的技术,Docker 只是把这种技术在使用上简易普及了。Docker 在早期的版本其核心就是 LXC 的二次封装发行版。 Docker 作为容器技术的…

开发第一个Flutter App需要注意什么

Flutter这些年发展的很快,特别是在 Google 持续的加持下,Flutter SDK 的版本号已经来到了 3开头,也正式开始对 Windows、macOS 和 Linux 桌面环境提供支持。如果从 Flutter 特有的优势来看,我个人认为主要是它已经几乎和原生的性能…