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.v
        self.u = u
        self.v = v
        # 将输入的layers给到self.layers
        self.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.0
        for 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_1
        lambda_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)
            
            # Print
            if it % 10 == 0:
                elapsed = time.time() - start_time
                loss_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 = 200
    x = 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/4
    for ctr, dim in zip(centers, 'xyz'):
        getattr(ax, 'set_{}lim'.format(dim))(ctr - r, ctr + r)

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IDEA2023.2 将普通项目转Maven项目

1、选中一个普通工程: 2、快捷键:ctrlshift a,搜索:Add Framework Support… 3、勾选maven,点击ok。

信息安全概述

信息安全:防止任何对数据进行未授权访问的措施,或者防止造成信息有意无意泄漏、破坏、丢失等问题的发生,让数据处于远离危险、免于威胁的状态或特性。 网络安全:计算机网络环境下的信息安全。 信息安全现状及挑战 数字化时代威…

分布式 session

分布式 session 种 session 的时候需要注意范围,也就是 cookie.domain。 比如两个域名:a.heo.com,b.heo.com。如果要共享 cookie,可以种一个更高层的公共域名,比如 heo.com。 当服务器 A (localhost:808…

构建高可用消息队列系统 01

构建高可用消息队列系统 01 引言1. RabbitMQ简介介绍1.1 什么是RabbitMQ1.2 RabbitMQ的核心特性1.3 RabbitMQ与AMQP 2.安装RabbitMQ3.消息队列实践总结 引言 在当今互联网时代,消息队列系统扮演着至关重要的角色,它们被广泛应用于分布式系统、微服务架构…

黑马Java——ArrayList集合

目录 1.ArrayList 集合和数组的优势对比: 1.1 ArrayList类概述 1.2 ArrayList类常用方法 1.2.1 构造方法 1.2.2 成员方法 2.练习 2.1添加字符串和数组并遍历 2.1.1添加字符串 2.1.2添加数字 2.2添加学生对象并遍历 2.2.1直接给字符串赋值 2.2.2对象的数…

【Unity学习笔记】Unity TestRunner使用

转载请注明出处:🔗https://blog.csdn.net/weixin_44013533/article/details/135733479 作者:CSDN|Ringleader| 参考: Input testingGetting started with Unity Test FrameworkHowToRunUnityUnitTest如果对Unity的newInputSystem感…

STM32 Hal库FreeRtos查看所有任务的内存栈信息使用情况剩余空间 仅需一个函数搞定 超简单

STM32F103 基于Hal库跑FreeRtos,查看所有任务的栈的信息,包括任务名,任务状态,任务优先级,空闲栈,任务号。 运行结果如下 只需要使用一个函数vTaskList :获得任务的统计信息,形式为…

2024年,给程序员的六点建议

作为程序员,持续进步和发展是至关重要的。除了技术能力的提升,还有一些关键的行为和思维方式可以帮助工程师在职业生涯中取得更大的成功。本文将提供六个重要的建议,这些建议将帮助程序员在职业生涯中迈出成功的步伐。 走出舒适区 走出舒适区…

HarmonyOS【应用服务开发】在模块中添加Ability

Ability是应用/服务所具备的能力的抽象,一个Module可以包含一个或多个Ability。应用/服务先后提供了两种应用模型: FA(Feature Ability)模型: API 7开始支持的模型,已经不再主推。Stage模型:AP…

CMU15-445-Spring-2023-分布式DBMS初探(lec21-24)

Lecture #21_ Introduction to Distributed Databases Distributed DBMSs 分布式 DBMS 将单个逻辑数据库划分为多个物理资源。应用程序(通常)并不知道数据被分割在不同的硬件上。系统依靠单节点 DBMS 的技术和算法来支持分布式环境中的事务处理和查询执…

企业SRC挖掘个人看法

昨晚上课网安的老师带我们现场挖掘漏洞&#xff0c;可谓是一场视觉盛宴&#xff01;&#xff01;&#xff01; <---老师 我--> 真的没有对比就没有伤害&#x1f62d;&#x1f62d;&#x1f62d;&#xff0c;其间他也分享了一些漏洞挖掘的思路&#xff0c;让我来回顾…

Mysql-全局锁、表锁、行锁

本文已收录于专栏 《数据库》 目录 全局锁概述说明开启方式应用场景 表锁概念说明实现方式意向锁 开启方式 行锁概念说明实现方式记录锁&#xff1a;间隙锁临键锁 总结提升 全局锁 概述说明 全局锁是是对整个数据库实例加锁&#xff0c;加锁后整个实例就处于只读状态&#xff…

智慧文旅运营综合平台:重塑文化旅游产业的新引擎

目录 一、建设意义 二、包含内容 三、功能架构 四、典型案例 五、智慧文旅全套解决方案 - 210份下载 在数字化浪潮席卷全球的今天&#xff0c;智慧文旅运营综合平台作为文化旅游产业与信息技术深度融合的产物&#xff0c;正逐渐显现出其强大的生命力和广阔的发展前景。 该…

Java--类继承

文章目录 主要内容一.学生类1.源代码代码如下&#xff08;示例&#xff09;: 2.结果 二.交通工具类1.源代码代码如下&#xff08;示例&#xff09;: 2.结果 三.圆类1.源代码代码如下&#xff08;示例&#xff09;: 2.结果 总结 主要内容 学生类交通工具类圆类 一.学生类 具有…

幻兽帕鲁开服教程——游戏

幻兽帕鲁开服教程——游戏 1. 安装服务器2. 服务器配置调整3. 运行环境Microsoft Visual C Runtime4. 加入服务器 这是研究开服时顺手写的笔记&#xff0c;也方便后来者。 如果你熟悉你所使用的操作系统的话&#xff0c;windows和linux应该区别不大。 1. 安装服务器 1.安装ste…

计算机组成原理 指令流水线

文章目录 指令流水线指令流水线的概念流水线性能分析流水线的吞吐率流水线的加速比流水线的效率 影响流水线的因素结构相关 (资源冲突)数据相关 (数据冲突)控制相关 (控制冲突) 流水线分类超量流水线 指令流水线 #mermaid-svg-sWaRASMFAvh8sLJk {font-family:"trebuchet m…

[小程序]页面事件

一、下拉刷新 1.开启和配置 小程序中开启下拉刷新的方式有两种&#xff1a; ①全局开启下来刷新 在app.json的window节点中&#xff0c;设置enablePullDownRefresh设为ture。 ②局部开启下来刷新 在页面对应的json文件的的window节点中&#xff0c;设置enablePullDownRefresh设…

服务器反复自动重启/死机的原因

服务器需要全年不间断地运行&#xff0c;而且它还承载各种应用程序。很多用户在租用服务器的时候会遇到各类问题&#xff0c;本文写的是服务器自动重启/死机可能会出现的原因及解决办法~ 1.电源是否接触不良 首先&#xff0c;第一步就是检查插头是否插紧&#xff0c;检查电源插…

flink基础概念之什么是时间语义

什么是时间语义 Flink支持三种不同的时间语义&#xff0c;以便处理流式数据中的事件时间、处理时间和摄入时间。 1. 处理时间&#xff08;Processing Time&#xff09; 处理时间的概念非常简单&#xff0c;就是指执行处理操作的机器的系统时间。 在这种时间语义下处理窗口非…

C++——数组、多维数组、简单排序、模板类vector

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…