# 神经网络数值求解微分方程

求解微分方程有很多种方法,对于简单的微分方程我们可以推导出它的解析解。而对很大一部分微分方程我们 是不能够得到解析解的,因此我们常常采用数值求解的方法得到微分方程的数值解。

# 求解目标

我们要求解的一个微分方程, 其中 x,t[0,1]x, t\in[0,1],

{ut(x,t)=uxx(x,t)csin(2πx)u(x,t)u(x,t)=u(x+1,t)u(x,0)=1(1)\left\{ \begin{aligned} u_t(x,t) &= \ u_{xx}(x,t) -c*sin(2\pi x)*u(x,t) \\ u(x,t)& = \ u(x+1,t) \\ u(x,0) & = 1 \end{aligned} \right. (1)

定义f(x,t)f(x,t) , g(x,t)g(x,t) , h(x)h(x)分别为:

{f:=ut(x,t)uxx(x,t)+csin(2πx)u(x,t)g:=u(x,t)u(x+1,t)h:=u(x,0)1(2)\left\{ \begin{aligned} f: &=u_t(x,t) - \ u_{xx}(x,t) +c*sin(2\pi x)*u(x,t) \\ g :&= u(x,t) - u(x+1,t) \\ h :&= u(x,0) - 1 \end{aligned} \right. (2)

那么:

{lossf=1Nfi=1Nff(xfi,tfi)2lossg=1Ngi=1Ngg(xgi,tgi)2lossh=1Nhi=1Nhh(xhi)2(3)\left\{ \begin{aligned}\text{loss}_f &=\frac{1}{N_f} \sum_{i=1}^{N_f}|f(x_f^i,t_f^i)|^2 \\ \text{loss}_g &= \frac{1}{N_g}\sum_{i=1}^{N_g} |g(x_g^i,t_g^i)|^2 \\ \text{loss}_h &= \frac{1}{N_h}\sum_{i=1}^{N_h}|h(x_h^i)|^2 \end{aligned} \right. (3)

得出总的价值函数:

loss=αlossf+β1lossg+β2lossh\text{loss} = \alpha*\text{loss}_f + \beta_1*\text{loss}_g + \beta_2*\text{loss}_h

因此我们的目标是找到一个函数u(x,t)u(x,t)使式(1)成立,也就是使loss的值趋近于0。

提示

在实际操作的时候,我们把(2)中的2式,即周期边界条件做了扩展。有周期边界性可以推导出u(x,t)=u(x+1,t)u(x,t) = u(x+1,t), u(x,t)=u(x1,t)u(x,t) = u(x-1,t). 于是定义g1=u(x,t)u(x+1,t)g_1 = u(x,t) - u(x+1,t)g2=u(x,t)u(x1,t)g_2 = u(x,t) - u(x-1,t), 那么周期边界条件对应的价值函数为

lossg=lossg1+lossg2=1Ng1i=1Ng1g1(xg1i,tg1i)2+1Ng2i=1Ng2g2(xg2i,tg2i)2\text{loss}_g = \text{loss}_{g_1} + \text{loss}_{g_2} = \frac{1}{N_{g_1}}\sum_{i=1}^{N_{g_1}} |g_1(x_{g_1}^i,t_{g_1}^i)|^2 + \frac{1}{N_{g_2}}\sum_{i=1}^{N_{g_2}} |g_2(x_{g_2}^i,t_{g_2}^i)|^2

# 网络结构

如图,这里我使用的是最基本的全联接人工神经网络,输入神经元的个数是2个,分别代表的是xx, tt; 输出神 经元的个数1个,代表u(x,t)u(x,t)。即神经网络的角色就是我们待求解的函数。

图1: 人工神经网络的结构采用了全联接网络。如图展示的神经网络的隐藏层的个数 是三层,但在实际构造神经网络的时候,网络的层数是作为一个可调参数。

隐藏层神经元的运算规则如图2:

图2: 隐藏层神经元的运算规则
其输出值(激活值) aja_j 可以表达为 aj=g(inj)=g(i=0nwi,jai)a_j = g(in_j) = g\left( \sum_{i=0}^nw_{i,j}a_i \right); 这里使用的激活函数是sigmoid g(z)=11+ezg(z)=\frac{1}{1+e^{-z}}.

提示

输入层神经元(图1蓝色)是不进行运算的;输出层神经元的输出不通过激活函数直接输出。

# 参数调整

在实际操作过程中发现,求解方程的精确度受到神经网络各种参数的影响。因此,如何科学地确定网络的参数就变得尤其重要。首先,我们要大致判断出影响网络最重要的几个参数。对于我们研究的问题,以下这几个参数对结果的影响是很大的:

  • 网络的层数 α\alpha
  • 每层网络节点个数 β\beta
  • 训练的样本个数 γm,γbc\gamma_m, \gamma_{bc} (这里 m,bcm,bc 分别代表主方程,边界条件) 其次,执行下面的操作:
  1. [α1,α2]=[2,100][\alpha_1,\alpha_2] = [2,100], [β1,β2]=[2,100][\beta_1,\beta_2] = [2,100], [γ1,γ2]=[20,2000][\gamma_1,\gamma_2] = [20,2000]
  2. 每次随机取 α,β,γ\alpha, \beta, \gamma分别为 α[α1,α2]\alpha \in [\alpha_1,\alpha_2]β[β1,β2]\beta \in[\beta_1,\beta_2]γm,γbc[γ1,γ2]\gamma_m, \gamma_{bc} \in[\gamma_1,\gamma_2]的任意整数,得到一个独立的网络,训练,保存网络训练结果。
  3. 重复上一个步骤N次,得到N个不同的结果。
  4. 对比上一个步骤的结果和参考的解的差异,缩小 α,β,γ\alpha, \beta,\gamma 随机取数的范围。
  5. 重复2,3,4,直到α,β,γ\alpha, \beta,\gamma的取数范围足够小,结束。

最后,我们便找到较优的 α,β,γm,γbc\alpha, \beta, \gamma_m, \gamma_{bc} 组合:

{α[5,7]β[20,30]γm[300,1000]γbc[100,300](4)\left\{ \begin{aligned} \alpha &\in [5,7] \\ \beta& \in [20,30] \\ \gamma_m &\in [300,1000] \\ \gamma_{bc}& \in [100,300] \end{aligned} \right. \ \ \ \ \ \ \ \ \ (4)

# 求解结果

Distro: Linux Mint 18.3 Sylvia Kernel: 4.13.0-41-generic x86_64 (64 bit) CPU: Quad core Intel Core i7-7700HQ (-HT-MCP-) GPU: GeForce GTX 1050 Ti Python: 3.6.4 Anaconda, Inc. Tensorflow: tensorflow-gpu '1.0.1'

[α,β,γm,γbc\alpha, \beta, \gamma_m, \gamma_{bc}] = [5, 21, 1424, 233], Time: 7m8s

图3. 结果对比。实线为神经网络给出的结果,虚线是使用Crank Nicolson方法得到数值结果

提示

所有的代码放在了PINN-Practice

# 参考文献

[1] Raissi, Maziar, Paris Perdikaris, and George E. Karniadakis. "Physics-informed neural networks: A deep learning framework for solving forward and inverse problems involving nonlinear partial differential equations." Journal of Computational Physics 378 (2019): 686-707.

[2] Jie Huang, Shiben Li, Xinghua Zhang, and Gang Huang , "Neural network model for structure factor of polymer systems", The Journal of Chemical Physics 153, 124902 (2020) https://doi.org/10.1063/5.0022464

[3] 封面图片 https://www.itpro.co.uk/network-internet/29791/what-is-an-artificial-neural-network

上次更新: 9/7/2021, 7:27:31 PM