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

这篇具有很好参考价值的文章主要介绍了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 与 y2
    dy1_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:表示测试集上的评估指标。

输出结果:
DeepXDE学习笔记【1】——简单ODE方程求解

3.10 绘图展示性能

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

损失函数及其性能评估得分变化图:
DeepXDE学习笔记【1】——简单ODE方程求解
求解结果与预期结果对比图:
DeepXDE学习笔记【1】——简单ODE方程求解文章来源地址https://www.toymoban.com/news/detail-475598.html

到了这里,关于DeepXDE学习笔记【1】——简单ODE方程求解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MATLAB数值分析学习笔记:线性代数方程组的求解和高斯-赛德尔方法

    迭代法是前面介绍的消元法的有效替代,线性代数方程组常用的迭代法有 高斯-赛德尔方法 和 雅克比迭代法, 下面会讲到二者的不同之处,大家会发现两者的实现原理其实类似,只是方法不同,本篇只重点介绍高斯-赛德尔方法。 看了我之前的笔记的同学应该已经对迭代法不

    2024年02月05日
    浏览(58)
  • Python求解二元一次方程:简单、快速、准确

    Python求解二元一次方程:简单、快速、准确! 你是否曾经在数学课上为解二元一次方程而苦恼?那些复杂的公式和冗长的计算过程是否让你头疼不已?现在,有了Python,一切变得简单多了!让我们一起探索如何使用Python快速、准确地求解二元一次方程。 一、什么是二元一次

    2024年03月23日
    浏览(33)
  • 【Matlab】一、解常微分方程ODE

    ​ 在matlab中,我们可以求解常微分方程的 解析解 ,和 数值解 ,一般使用 dsolve 来求解常微分方程的解析解,使用类似于 ode45 的求解器来求解常微分方程的数值解。 求解解析解 ,例如求解该方程的解析解 d y d x = 3 x 2 + 1 frac{dy}{dx}=3x^2 + 1 d x d y ​ = 3 x 2 + 1 只需要在命令行中

    2024年02月07日
    浏览(45)
  • matlab使用教程(25)—常微分方程(ODE)选项

            解算 ODE 经常要求微调参数、调整误差容限或向求解器传递附加信息。本主题说明如何指定选项以及每个选项与哪些微分方程求解器兼容。         使用 odeset 函数创建 options 结构体,然后将其作为第四个输入参数传递给求解器。例如,要调整相对和绝对误差容

    2024年02月11日
    浏览(57)
  • 算法学习 | 递归方程求解

    目录 一、特征方程 2.1 线性齐次递推式的求解 2.1.1 对于一阶齐次递推关系 2.1.2 对于二阶齐次递推关系  2.2 非齐次递推式的求解 2.2.1 常用的非齐次递推式的求解1(ing) 2.2.2 常用的非齐次递推式的求解2(ing) 二、递归树 三、主方法 3.1 主定理 3.2 应用实例 用来代替该等式中的

    2024年02月09日
    浏览(45)
  • PINN深度学习求解微分方程系列一:求解框架

    下面我将介绍内嵌物理知识神经网络(PINN)求解微分方程。首先介绍PINN基本方法,并基于Pytorch框架实现求解一维Poisson方程。 内嵌物理知识神经网络(PINN)入门及相关论文 深度学习求解微分方程系列一:PINN求解框架(Poisson 1d) 深度学习求解微分方程系列二:PINN求解burg

    2023年04月16日
    浏览(41)
  • 线性代数的学习和整理14: 线性方程组求解的3种方法,重点讲矩阵函数求解

    目录 0 写在前面的一些内容 0.1 学习心得: 0.2 参考其他书籍总结的知识点,对照学习 1 线性方程组求解 1.1 常见的线性方程组如下 1.2 记住常见的 矩阵函数的维数的关系 1.3  需要求解的方程组和矩阵的对应关系,需要先厘清 1.3.1 如果只需要求解x,是类 Ax=b的形式 1.3.2   如

    2024年02月05日
    浏览(56)
  • 数值分析·学习 | 解线性方程组的直接方法(高斯消去法以及LU求解)matlab实现

    目录 一、前言: 二、算法描述: 三、实现代码: 1、高斯消去法: 2、高斯消去法-列主元消去法: 3、LU分解: 4、求逆矩阵: 四、总结: 个人学习内容分享 1、高斯消去法:         设有线性方程组         或写为矩阵形式

    2024年02月05日
    浏览(68)
  • MATLAB 之 非线性方程数值求解、最优化问题求解和常微分方程初值问题的数值求解

    非线性方程的求根方法很多,常用的有牛顿迭代法,但该方法需要求原方程的导数,而在实际运算中这一条件有时 是不能满足的,所以又出现了弦截法、二分法等其他方法。 在 MATLAB 中,非线性方程的求解和最优化问题往往需要调用最优化工具箱来解决。优化工具箱提供了一

    2024年02月08日
    浏览(54)
  • 【矩阵论】6. 正规方程与矩阵方程求解

    矩阵论的所有文章,主要内容参考北航赵迪老师的课件 [注]由于矩阵论对计算机比较重要,所以选修了这门课,但不是专业搞数学的,所以存在很多口语化描述,而且对很多东西理解不是很正确与透彻,欢迎大家指正。我可能间歇性忙,但有空一定会回复修改的。 矩阵论 1

    2024年02月02日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包