用神经网络来求解ODE和PDE

您所在的位置:网站首页 神经ode图像 用神经网络来求解ODE和PDE

用神经网络来求解ODE和PDE

2024-05-30 13:33| 来源: 网络整理| 查看: 265

最近看了一篇文章:Artificial Neural Networks for Solving Ordinary and Partial Differential Equations。感觉发现了片新大陆。深度学习还能有这种应用,且98年的时候人们就已经探索到这个方向了。这里对这种思想简单做个介绍,并实操一个例子。

什么是ODE(ordinary differential equation)

简单说就是线性的微分的方程,为什么大家要研究它呢,一个我知道的原因是物理中很多对描述物体动力学的方程就是这一类。比如说最典型的牛顿第二定律:

F(x) = m \frac{d^2 x}{dt^2} ,

在 F(x) 已知的情况下,就可以求解这个方程来得到 x(t) ,从而描述物体的运动。牛顿第二定律看的是时间 t 关于 x 的二阶导数。不失一般性的,更通用的一个是考虑对时间的多阶导数,表达式如下:

\frac{d^n x}{dt^n} = f(t, x, x' ... , x^{n - 1}(t))

求解ODE的常规做法

然而不是所有已知的动力学方程都能解析求解,一种常用的数值分析是欧拉方法(Euler’s method)。基本思想是将时间在一定区间内离散化 [a=t_0, t_1, t_2, t_3, … t_N=b] ,然后根据欧拉给出的公式

x_{n + 1} = x_{n} + hf(t_n, x_n)

通过迭代的方式数值逼近真实解。以文章中提到的方程为例

\frac{dy}{dt} = \frac{1}{5}y + e^{-\frac{t}{5}}cos(t) ,

通过简单推导可以得到

y_{n + 1} = y_n + h(-\frac{1}{5}y_n + e^{-\frac{t_n}{5}}cos(t_n)) 。

然后结合初始条件( y_0 = y(t_0) = 0 )就可以求解了。并可以通过对比这个方程的解析解 y(t) = e^{-\frac{a}{b}} sin(t) 来验证数值分析的效果

import numpy as np import matplotlib.pyplot as plt a = 0 b = 5 N = 100 y_euler = np.zeros(N) y_euler[0] = 0 t = np.linspace(a, b, 100) h = (b - a)/ N for i in range(N - 1): y_euler[i + 1] = y_euler[i] + h * ((-1/5) * y_euler[i] + np.exp(-t[i]/5) * np.cos(t[i])) y = np.exp(-(t/5)) * np.sin(t) fig, ax = plt.subplots() ax.plot(t, y_euler, 'red', label="Euler result") ax.plot(t, y, 'g--', label='analytical result') plt.legend()神经网络来求解ode

下面到了这篇文章的干货,对于这样的一个一阶的ODE

\frac{d\Psi(x)}{dx} = f(x, \Psi) \\ x \in [0, 1] \\ \Psi(0) = A\\ 作者假设了这样一个 trial solution

\Psi(x) = A = x N(x, \theta)

这里的 N(x, \theta) 就是一个神经网络。对这个式子关于 x 求导就可以把ODE方程的左边部分用神经网络和它的一阶导数来表示。

\frac{d\Psi(x)}{dx} = N(x, \theta) + x \frac{dN(x, \theta)}{dx}

问题就转化成为找到一组参数 \theta ,使得 \frac{d\Psi(x)}{dx} 逼近 f(x, \Psi) 。相当于用这样的一个基于神经网络的表达式 N(x, \theta) + x \frac{dN(x, \theta)}{dx} 来拟合等式右边。因此可以定义损失函数来做最小化

Loss = \sum_{i} (\frac{d\Psi(x_i)}{dx_i} - f(x_i, \Psi(x_i)))^2 = \sum_{i} (N(x_i, \theta) + x_i \frac{dN(x_i, \theta)}{dx_i} - f(x_i, \Psi(x_i)))^2

这里用pytorch实现了下上面同样的方程,效果如下:

import torch import numpy as np import matplotlib.pyplot as plt def sigmoid(x): return 1 / (1 + torch.exp(-x)) def dsi


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3