神经网络求解二阶常微分方程

神经网络求解二阶常微分方程

最近课题组老师给出一篇文献,文件原文如链接一所示。需要让我使用深度神经网络求解偏微分方程。在相关调研过程中,CSDN上作者Trytobenice分享过相关的程序源码。基于相关程序源码,我将他的一阶常微分方程求解扩充到二阶常微分方程求解。并且按照此方法可以求解高阶常微分方程。

理论分析

对于任意一个微分方程,我们都可以用这个方程表示出
在这里插入图片描述
求解目的就是找出这样的一个方程:ψ(x),能够满足以上的G()函数。
对于计算机求解,第一步要将其离散化处理:
在这里插入图片描述
人工神经网络若要求解该方程,那就设方程ψ(x)函数如下形式:
在这里插入图片描述
将预设的ψ(x)带入原方程中,只需要让G()函数在定义范围内达到最小,那就求解出这个方程了。二次方项是为了将负数对结果的影响消除。
在这里插入图片描述
下面再来分析ψ(x)的内容:
在讲解这个解函数之前,需要给出一个补充知识。要求解出常微分方程,仅仅给出常微分方程表达式是不够的,还要给出常微分方程的初始条件和边界条件。这样才能保证解函数的唯一性。

ψ(x)函数中包含两项。第一项是A(x),这一项是为了满足初始条件或者边界条件。第二项F{x,N(x,p)},这一项是神经网络满足偏微分方程的部分,不考虑边界条件。【注:为什么F()项能够不考虑边界条件,文中例子会给出介绍】

继续看F{x,N(x,p)},这一项中包含N(x,p)。这个N()函数就是神经网络函数表达式形式。x表示输入数据,p表示神经网络中的参数。通过BP网络优化神经网络中的参数p,使神经网络能够达到最适,就能得到神经网络的解函数ψ(x)。

设出这个解函数之后,我们下一步要根据解函数表达出微分方程。微分方程中至少包含一个微分项,可能是一阶,也可能是二阶;可能是常微分,也可能是偏微分。论文中给出神经网络N(x,p)输出对输入x的微分公式。公式形式如下:在这里插入图片描述
式中k表示k阶导数,j表示对输入数据 xj(j是下角标) 的偏导。本文仅仅探讨常微分形式。

举例分析

这里给出一个一阶常微分方程表达式,用这个方程分析如何使用神经网络求解。方程入下:
在这里插入图片描述
并且给出边界条件,在这里插入图片描述
这个方程有很明确的解析解,解析解如下所示:
在这里插入图片描述
对于神经网络求解,我们可以设神经网络解ψ(x)形式为:
在这里插入图片描述
在这里,满足边界条件的A(x)直接为1。不需要考虑边界条件的项F{x,N(x,p)}设为x*N(x,p),那么在x=0的情况下,解第二项直接为0,仅仅保留A(x),这样就能解释前部分的【注】。

方法提升

以上分析全部针对论文1的内容,论文1出版年份为1998年,论文2于2019年提出了更进一步的方法,下面我们进一步分析论文2的内容:

论文2设计的神经网络与论文1,解析解设计过程中,直接设神经网络输出的结果为
在这里插入图片描述
在这里不考虑边界值,边界值在损失函数上体现。损失函数第一项如论文1相同,第二项体现边界值。损失函数通过以下函数给出:在这里插入图片描述
论文2设计的神经网络结构非常简单,中间只有一个隐藏层,隐藏层中只有10个神经元。

在这里插入图片描述

代码结果

在这里展示我使用Tensorflow设计的,求解二阶常微分方程的程序结果。二阶常微分方程式由以下方程给出:
在这里插入图片描述

二阶微分方程的初始值:
在这里插入图片描述

该微分方程的解析解:
在这里插入图片描述

使用设计的程序,仿真出的结果如图所示:
在这里插入图片描述
其中,解析解和神经网络解之间的差值用下图可以看出:
在这里插入图片描述
可以看到,这个拟合结果还是非常不错的,误差数量级控制在10^-4以下。

有时间会在github上开源代码,到时候下载别忘了给我点一个star。

论文1: Artificial neural networks for solving ordinary and partial differential equations
论文2: Solving differential equations with neural networks: Applications to the calculation of cosmological phase transitions.

相关推荐
matlab中的微分方程-matlab中的微分方程.doc 1510 matlab中的微分方程 第1节  Matlab能够处理什么样的微分方程? Matlab提供了解决包括解微分方程在内的各种类型问题的函数: 1. 微分方程(ODEs)的初始值问题 初值问题是用MATLAB ODE求解器解决的最普遍的问题。初始值问题最典型的是对非刚性度(?nonstiff)问题应用ODE45,对刚性度(?stiff)问题采用ODE15S。(对于stiffness的解释,请参照“什么是Stiffness”一节。) 2. 微分-代数方程(DAEs)的初值问题 在那些守恒定律规定一些变量之间满足数关系领域经遇到这类问题。Matlab 可以用ODE15S 或者 ODE23T解决索引(index)为1的DAEs。(对于索引的解释,请参阅“DAEs与他们的索引”一章。) 3. 边界值问题(BVPs) 这种通要求微分方程在两边都具有特殊的条件组成。尽管他们通不象IVPs那样经遇到,但是他们也是工程应用中比较见的问题。可以利用函数BVP4C来解决这类问题。 4. 时延微分方程(DDEs) 这类微分方程包含了独立变量的延迟。他们在生物与化学模型这类大量的应用中遇到,可以通过DDE23来解决这类问题。 5. 微分方程(PDEs) 采用PDEPE可以解决一维时空的抛物面与椭圆方程的初值、边界值的问题。而那些对更加多的一般的微分方程感兴趣的可以利用PDE工具箱。 更多的matlab的综合应用技术的信息请参阅Solution8314。 更多的有关matlab采用的各种求解器的算法的信息请查看下面的URLs: ● ODE 函数 ● BVP 函数 ● DDE 函数 ● PDE 函数 第2节 可以从什么地方获得更多的指导与附加信息?    可以从MATLAB Center、网站的新闻组、文件交换点可以获得一系列资料,可以进一步解释MATLAB解决各种方程(ODE,DAE,BVP,DDE)的求解器的算法和使用。你可以下载各种方程的文章与手册,他们通带有大量的实例。   可以从 matlab自带的帮助文件的 Mathematics|Differential Equations下找到使用指导。   Cleve Moler的《Numerical Computing with MATLAB》的第七章详细讨论了OEDs的解法,并附带有大量的实例与简单的问题练习。    第3节 对ODE求解器的语法存在有些什么变化? 在MATLAB6.5(R13)中应用ODE求解求解的首选语法是: [t,y]=odesolver(odefun,tspan,y0,options,parameter1,parameter2,…,parameterN); odesolver 是你采用的求解器,例如ODE45或者ODE15S。odefun是微分方程的定义函数,所以odefun定义独立参数(典型的是时间t)的导数y‘ 以及y和其他的参数。在MATLAB6.5(R13)中,推荐使用函数句柄作为odefun。 例如,ode45(@xdot,tspan,y0),而不是用 ode45('xdot',tspan,y0)。 请看采用函数句柄的好处的文档: 采用函数句柄传递你定义MATLAB求解器计算的量、例如大规模矩阵或者Jacobian模式的函数。 如果你喜好采用字符串儿传递你的函数,matlab求解器将回溯匹配。 在老的matlab版本里,通过传递标志来规定求解器的状态和恰当的计算。在MATALB6.0以及其后的版本中,这就没有必要了,可以从matlab自带的文档中发现这个差别。 如果里采用的matlab的ODE求解器的老的语法,你可以看看我们FTP站点上的各种求解器的老的实例: ftp://ftp.mathworks.com/pub/doc/papers/ 前面的站点包含了BVP,DAE与DDE这三个方向的采用老的语法的实例。你可以在下面的站点中找到应用ODE45与ODE23的实例: ftp://ftp.mathworks.com/pub.mathworks/toolbox/matlab/funfun 你可以在MATLAB Center的文件交换站点查看这些例子的更新版本。 第4节  如何减小ODE的阶次? 求解一阶ODE的代码是很直接的。然而,二阶或者三阶的ODE不能够直接应用求解。你必须先将高阶的ODE改写成一阶的ODEs系统,使得它可以采用MATLAB ODE求解器。 这是一个如何将二阶微分方程改写成两个一阶微分
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页