首页 > 解决方案 > Matlab - 如何实现反向欧拉方法?

问题描述

我正在尝试实现这些公式:

正向欧拉法:

在此处输入图像描述

这是我尝试过的:

x_new = (speye(nv)+ dt * lambda * L) * x_old;

这有什么问题吗?如何使用稀疏运算来计算?

后向欧拉法:

在此处输入图像描述

我试过这个:

x_new = (speye(nv)- dt * lambda * L) \ x_old;

如何实现x基于新计算现有的落后部分x?可以使用除法吗?


L是一个像这样的稀疏矩阵:

full(L) =

   -1.0000    0.2500    0.2500    0.2500    0.2500
    0.3333   -1.0000    0.3333         0    0.3333
    0.3333    0.3333   -1.0000    0.3333         0
    0.3333         0    0.3333   -1.0000    0.3333
    0.3333    0.3333         0    0.3333   -1.0000

对于其他变量,我们也有这样的东西:

nv = 5;
dt = 0.01;
lambda = 0.5;

x_old =   [-4 0 5;
            1 -5 5;
            1 0 1;
            1 5 5;
            1 0 0]

标签: matlabiterationsparse-matrix

解决方案


我在这里看不到域,但反向欧拉法是一个基本的常微分方程求解器。

x_new当站在等式两边时,有两种方法可以解决这种情况。

1.定点迭代

您使用x_new_temp并设置x_new_tempx_old第一次迭代,并使用 Forward Euler 公式进行几次迭代。x_new_temp在迭代之后,可能会受到from 迭代i和之间的一些差异的限制i-1,您设置x_newx_new_temp从上次迭代开始。

2.用适当的方法求解非线性方程,例如Newton-Raphson法

后向欧拉公式规定:

y_new = y_old + k*f(t,y_old)

我们可以将其转化为:

y_old + k*f(t,y_old) - y_new = 0

这是一个基本的非线性函数,可以用任何旨在解决此类问题的数值方法来解决。

涉及矩阵的情况下,我将使用定点迭代。


推荐阅读