已知方程一阶导数公式和初始值,求方程的解
从当前点 出发,沿着当前的切线方向走一小步 ,就到达了下一点,该方法简单容易,但是精度较低,数值解容易爆炸。
用下一步的斜率来当作当前的切线方向,方程的右端包含待求解的 ,因此称为隐式欧拉,比较稳定,数值解不容易爆炸,但是计算量显著增加。
先用显式欧拉法计算一步
然后用两端的斜率均值作为当前切线方向
基于上述计算方法,因此该方法也叫预测-矫正法。精度高,且是显式的计算相对方便。
在 内取点 个点构成 级RK(龙格库塔)格式(精度阶数和级数并不总是相等),此时
当 的值由 对应点的斜率加权平均得到时,该公式称为显式RK法,当取 时,选取适当点的位置,比较典型的例子就是改进欧拉方法。
当 的值由 对应点的斜率加权平均得到时,该公式称为半隐式RK法。比较典型的例子就是梯形法则。
当 的值由 对应点的斜率加权平均得到时,该公式称为半隐式RK法。 记导数为 满足
其中
为一个单步的
基于系数表,当
将
得到
将公式移项,记作
此时可知
用神经网络预测以下结果
将预测的结果带入到移项后的公式计算得到
即可以对比误差获得损失函数。
def fwd_gradients(self, U, x, dummy):
# 第一次求导:U对x
grad = torch.autograd.grad(U, x,
grad_outputs=dummy,
create_graph=True,
retain_graph=True)[0]
# 第二次求导:结果对dummy
dummy_grad = torch.ones_like(grad)
grad_U_x = torch.autograd.grad(grad, dummy,
grad_outputs=dummy_grad,
create_graph=True,
retain_graph=True)[0]
return grad_U_x
前面与正问题类似,不同的是将公式移项后,记作
此时
同样的用神经网络预测以下结果
带入移项后的公式获得如下结果
对比精确值,即可获得损失函数。
q = int(np.ceil(0.5 * np.log(np.finfo(float).eps) / np.log(dt)))