DeepXDE学习笔记【1】——简单ODE方程求解

DeepXDE学习笔记【1】——简单ODE方程求解

1、背景

物理信息神经网络(PINN)自从2017年被提出,其应用范围在近两年也被挖掘的越来越广泛,除了可以解决物理方面的问题,信号处理、工程评估等等方向也开始有所涉及,所谓“物理数据双驱动”的噱头还是蛮足的,所以也算是一个比较好写论文,出成果的方向。

DeepXDE 是一个基于 Python 库开发的 PINN 框架,主要用于利用神经网络方法求解各种微分方程问题,是快速搭建物理信息神经网络的利器。

考虑到当前网络上对DeepXDE的代码讲解教程过少,毕竟没有形成诸如CNN,GAN那些主流神经网络模型的生态,官方文档也不是很完善,因此,在本系列博客将主要讲解 DeepXDE的代码,后边会包含在科研和大数据竞赛中的一些应用案例。

第一篇就还是从最简单的ODE方程求解案例开始。

2、问题提出

设有常微分方程方程组:
d y 1 d t = y 2 , d y 2 d t = − y 1 , 其中 t ∈ [ 0 , 10 ] , \frac{dy_1}{dt} = y_2, \qquad \frac{dy_2}{dt} = - y_1, \qquad \text{其中} \quad t \in [0,10], dtdy1=y2,dtdy2=y1,其中t[0,10],

有初始边界条件:
y 1 ( 0 ) = 0 , y 2 ( 0 ) = 1. y_1(0) = 0, \quad y_2(0) = 1. y1(0)=0,y2(0)=1.

很显然,该问题的解应为:
y 1 = sin ⁡ ( t ) , y 2 = cos ⁡ ( t ) y_1 = \sin(t), \quad y_2 = \cos(t) y1=sin(t),y2=cos(t)

下面使用DeepXDE来求解该问题。

3、代码部分

代码完整链接见DeepXDE官方github案例: https://github.com/lululxvi/deepxde/blob/master/examples/pinn_forward/ode_system.py

3.1 引入相关库

import deepxde as dde
import numpy as np

安装命令:pip install deepxde

3.2 定义时间域

geom = dde.geometry.TimeDomain(0, 10)

dde.geometry.TimeDomain(t0, t1)用于定义时间域的类,用于指定微分方程求解的时间范围。

此处指定了一个从 t 0 = 0 t_{0}=0 t0=0 t 1 = 10 t_{1}=10 t1=10 的时间区间。

3.3 ODE 方程组定义

def ode_system(t, y):y1, y2 = y[:, 0:1], y[:, 1:]  # y1 与 y2dy1_dt = dde.gradients.jacobian(y, t, i=0) # 计算y1相对于t的偏导dy2_dt = dde.gradients.jacobian(y, t, i=1) # 计算y2相对于t的偏导return [dy1_dt - y2, dy2_dt + y1]  # 微分方程组的右端项

dde.gradients.jacobian(y, t, i)用于 y 对 t 求导,参数 i 表示要对第几个分量进行操作。

3.4 边界条件判断

def boundary(t, on_initial):return np.isclose(t[0], 0)

t: 时空点坐标
on_initial: 指示当前时空点是否位于初始时刻。
np.isclose(a, b)用于判断 a, b两个浮点数是否相等。

该函数意义为,首先通过 t[0] 访问时空点的第一个分量,即空间坐标,然后使用 np.isclose() 函数检查该坐标是否等于 0。如果该坐标等于 0,则认为当前时空点处于时空边界上,并返回为 True ,表示边界条件得到满足;否则返回 False,表示边界条件未得到满足。

3.5 定义初值条件

ic1 = dde.icbc.IC(geom, lambda x: 0, boundary, component=0)
ic2 = dde.icbc.IC(geom, lambda x: 1, boundary, component=1)

dde.icbc.IC(geom,function,boundary,component)用于指定微分方程组在初始时刻的状态,参数:

geom:方程组的时空范围;
function:方程组在初始时刻状态的函数;
boundary:方程组在时空边界处的边界条件;
component:分量编号,表示对第几个分量进行初值条件的指定。

在边界时空点上, y1 分量的值为 0, y2 分量的值为 1。

3.6 定义对比函数

def func(x):return np.hstack((np.sin(x), np.cos(x)))

为OED方程求解出的真值,用于测试模型性能。

3.7 代入求解器

data = dde.data.PDE(geom, ode_system, [ic1, ic2],35, 2, solution=func, num_test=100)

dde.data.PDE(geom, eqn, ic, num_domain, num_boundary, solution, num_test)用PDE求解器解决OED问题,参数:

geom:时空范围;
eqn:方程组的数学表达式;
ic:初值条件,可以是一个 IC 对象或一个包含多个 IC 对象的列表;
num_domain:将时空范围分成多少个小块进行求解;
num_boundary:在时空范围的边界处采样多少个点作为边界条件;
solution:微分方程组的解析解,用于测试求解结果的准确性;
num_test:在测试求解结果准确性时采样多少个点。

3.8 定义网络结构

layer_size = [1] + [50] * 3 + [2]
activation = "tanh"
initializer = "Glorot uniform"
net = dde.nn.FNN(layer_size, activation, initializer)

dde.nn.FNN(layer_size, activation, initializer)使用前馈神经网络,参数:

layer_size:用list表示神经网络每层的神经元数量,包括输入层、隐藏层和输出层;
activation:神经网络的激活函数类型;
initializer:神经网络的权重初始化方式。

3.9 模型编译

model = dde.Model(data, net)
model.compile(optimizer = "adam", lr=0.001, metrics=["l2 relative error"])

自定义模型优化器,学习率,损失函数,以及评价方法。

3.9 开启训练

losshistory, train_state = model.train(iterations=20000)

自定义迭代次数。
在使用 DeepXDE 训练 PINN 模型时,输出结果一般包括以下几个部分:

Step:表示当前训练的步数;
Train loss:表示训练集上的损失值,是一个长度为 4 的列表,包括四个部分:总损失、PDE 部分的损失、初始条件部分的损失和边界条件部分的损失;
Test loss:表示测试集上的损失值,含义与训练集相同;
Test metric:表示测试集上的评估指标。

输出结果:

3.10 绘图展示性能

dde.saveplot(losshistory, train_state, issave=False, isplot=True)

损失函数及其性能评估得分变化图:
损失函数及其性能评估得分变化
求解结果与预期结果对比图:
求解结果与预期结果对比

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

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

相关文章

【软考】14.3 设计模式

《设计模式》 有下划线:类模式 / 对象模式无下划线:对象模式 创建型 设计模式 创建对象 构建器(Builder):类和构造分离抽象工厂(Abstract Factory):抽象接口工厂(Factor…

MongoDB系例全教程

一、系列文章目录 一、MongoDB安装教程—官方原版 二、MongoDB 使用教程(配置、管理、监控)_linux mongodb 监控 三、MongoDB 基于角色的访问控制 四、MongoDB用户管理 五、MongoDB基础知识详解 六、MongoDB—Indexs 七、MongoDB事务详解 八、MongoDB分片教程 九、Mo…

如何在MacOS使用homebrew安装Nginx

文章目录 Homebrew安装nginxbrew启动Nginxbrew关闭Nginx 参考文章地址 Homebrew安装nginx 在确保MacOS 安装Homebrew成功以后,执行如下命令 brew install nginx注意:Nginx安装成功后会提示目录位置;每个人的系统可能因为Homebrew的安装位置…

【Linux学习笔记】进程概念(下)

进程地址空间1. 虚拟地址2. 什么是进程地址空间3. 进程地址空间的映射。4. 地址空间存在的意义5. 写时拷贝 进程地址空间 1. 虚拟地址 来看这样一段代码。 #include <stdio.h> #include <unistd.h>int global_value 100;int main() {pid_t id fork();if(id &l…

前端CSS

文章目录 引入标签的两大重要属性&#xff1a;区分标签class属性id属性学习CSS流程 CSS前言CSS层叠样式表1.CSS组成2.css语法结构3.注释语法4.引入css的多种方式 CSS选择器1.CSS基本选择器2.CSS组成选择器3.分组与嵌套4.属性选择器5.伪类选择器6.伪元素选择器 选择器优先级CSS继…

基于深度学习的水果识别 计算机竞赛

1 前言 Hi&#xff0c;大家好&#xff0c;这里是丹成学长&#xff0c;今天做一个 基于深度学习的水果识别demo 这是一个较为新颖的竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/pos…

什么情况会造成电表不走数?

电表是衡量用电量的重要设备&#xff0c;一旦出现不走数的情况&#xff0c;不仅会影响用户对用电量的准确计算&#xff0c;还可能造成电费纠纷。那么&#xff0c;究竟什么情况下会造成电表不走数呢&#xff1f;接下来&#xff0c;小编来为大家介绍下&#xff0c;一起来看下吧&a…

傅里叶分析和小波分析

从傅里叶变换到小波变换&#xff0c;并不是一个完全抽象的东西&#xff0c;可以讲得很形象。小波变换有着明确的物理意义&#xff0c;如果我们从它的提出时所面对的问题看起&#xff0c;可以整理出非常清晰的思路。 下面我就按照傅里叶-->短时傅里叶变换-->小波变换的顺…

Python---字符串切片-----序列名称[开始位置下标 : 结束位置下标 : 步长]

字符串切片&#xff1a;是指对操作的对象截取其中一部分的操作。字符串、列表、元组都支持切片操作。 本文以字符串为例。 基本语法&#xff1a; 顾头不顾尾&#xff1a; ----------类似range&#xff08;&#xff09; 范围&#xff0c;顾头不顾尾 相关链接Python----ran…

python使用ffmpeg来制作音频格式转换工具(优化版)

简介:一个使用python加上ffmpeg模块来进行音频格式转换的工具。 日志: 20231030:第一版,设置了简单的UI布局和配色,实现音频转为Mp3、AAC、wav、flac四种格式。可解析音频并显示信息,可设置转换后的保存路径 UI界面: 编程平台:visual studio code 编程语言:python 3…

SuperMap iServer 11i(2023)安全性提升汇总

作者&#xff1a;lisong 目录 账户信息合规度校验规则扩展功能图片验证码登录功能Web服务提供者密码加密数据库密码加密漏洞修复 SuperMap iServer 11i&#xff08;2023&#xff09;产品安全性相关的提升众多&#xff0c;涵盖账户安全、服务安全以及漏洞修复等方面&#xff0c;…

dockefile

文章目录 应用的部署MySql的部署Tomcat的部署 dockerfileDocker原理镜像的制作容器转镜像Dockerfile 服务编排Docker Compose Docker 私有仓库 应用的部署 搜索app的镜像拉去app的镜像创建容器操作容器中的app MySql的部署 容器内的网络服务和外部机器无法直接通信外部机器和…

Jenkins中解决下载maven包巨慢的问题

背景介绍 我们在使用jenkins构建maven项目时由于依赖很多第三方jar包&#xff0c;默认会从maven中央仓库下载&#xff0c;由于maven中央仓库服务器是国外的&#xff0c;所以下载很慢&#xff0c;甚至会超时 解决办法 增加jenkins maven 源配置 如下图所示&#xff0c;增加m…

Apache ActiveMQ (版本 < 5.18.3) (CNVD-2023-69477)RCE修复方案/缓解方案

一、漏洞描述 Apache ActiveMQ 是美国阿帕奇&#xff08;Apache&#xff09;基金会的一套开源的消息中间件&#xff0c;它支持 Java 消息服务、集群、Spring Framework 等。 二、漏洞成因 ActiveMQ 默认开放了 61616 端口用于接收 OpenWire 协议消息&#xff0c;由于针对异常…

店铺消费短信通知模板,可以自定义编辑内容群发

店铺消费短信通知模板&#xff0c;可以自定义编辑内容群发 上图可以对短信的发送情况进行查询&#xff0c;可以通过该软件群发短信。 下图为 佳易王 会员管理系统软件&#xff0c;在会员充值或消费的时候&#xff0c;可以设置自动发送短信通知信息。 可以自由设置&#xff0c;…

OpenFeign的简单介绍和功能实操

前言 本文主要做一下OpenFeign的简单介绍和功能实操&#xff0c;实操主要是OpenFeign的超时和重试&#xff0c;在阅读本文章前&#xff0c;请完成《Nacos 注册中心介绍与实操》内的Nacos多模块生产消费者项目 什么是OpenFeign OpenFeign全名Spring Cloud OpenFeign&#xff…

【计算机网络】路由器的工作原理

文章目录 输入端口处理和基于目的地转发交换结构输出端口处理排队问题参考资料 路由器的四个组件 输入端口(input port)&#xff1a;执行物理层功能&#xff08;input port 左边方框、output port 右边方框&#xff09;、数据链路层功能&#xff08;input/output port 中间方框…

043-第三代软件开发-第三方串口库使用

第三代软件开发-第三方串口库使用 文章目录 第三代软件开发-第三方串口库使用项目介绍第三方串口库使用示例代码 关键字&#xff1a; Qt、 Qml、 QextSerialPort、 QThread、 高频 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt…

多输入多输出 | Matlab实现k-means-LSTM(k均值聚类结合长短期记忆神经网络)多输入多输出组合预测

多输入多输出 | Matlab实现k-means-LSTM&#xff08;k均值聚类结合长短期记忆神经网络&#xff09;多输入多输出组合预测 目录 多输入多输出 | Matlab实现k-means-LSTM&#xff08;k均值聚类结合长短期记忆神经网络&#xff09;多输入多输出组合预测预测效果基本描述程序设计参…

[云原生1. ] 使用Docker-compose一键部署Wordpress平台

文章目录 1. Docker-compose概述1.1 简介1.2 docker-compose 的三大概念1.3 docker-compose配置模板文件常用的字段1.4 docker-compose 常用命令及格式 2. YAML 文件的详细介绍及编写注意事项2.1 简介2.2 yaml的特性2.2.1 语法特点2.2.2 数据结构2.2.3 引号的区别2.2.4 内置类型…