Matlab-如何实现向后Euler';什么方法?
我正在尝试实现这些公式: 正向欧拉法: 这就是我尝试过的:Matlab-如何实现向后Euler';什么方法?,matlab,iteration,sparse-matrix,Matlab,Iteration,Sparse Matrix,我正在尝试实现这些公式: 正向欧拉法: 这就是我尝试过的: 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
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;
λ=0.5;
x_old=[-4 0 5;
1 -5 5;
1 0 1;
1 5 5;
1 0 0]
我在这里看不到域,但向后Euler方法是一种基本的常微分方程求解器
当x_new
站在方程两边时,有两种方法可以解决这种情况
1.
第一次迭代使用x_new_temp
,将x_new_temp
设置为x_old
,并使用正向欧拉公式进行少量迭代。在迭代之后,可能由于迭代i
中的x_new_temp
和i-1
之间的一些差异,您将x_new
设置为上次迭代中的x_new_temp
2.用适当的方法求解非线性方程,例如。
反向欧拉公式规定:
y\u new=y\u old+k*f(t,y\u old)
我们可以将其转化为:
y_old+k*f(t,y_old)-y_new=0
这是一个基本的非线性函数,可以用任何数值方法来解决这类问题
在你的例子中当涉及到矩阵时,我会使用定点迭代。Re:“使用除法可以吗?”-你肯定有一些测试问题,可以比较结果,对吗?是的,结果看起来不错,除了分母中的零元素。另外,我的问题是:是否允许在Euler的前进法中使用除法,或者是否有一种方法可以保持公式不变,而不将
(speye(nv)-dt*lambda*L)
移动到另一侧?我需要在任何地方使用*
而不是*
吗?在我看来,你做得不错。任何隐式程度的数值方法(即,计算新值需要方程组的解)都需要计算。代码x_new=A\x_old
实际上是求解x_new
的线性系统,而不仅仅是简单的除法运算。