两个时间步之间的有限差分解的差异

Difference of finite difference solution between two timesteps

我有一个离散微分方程的解

f(i)  

其中 i 是空间索引。如何找到每个相邻时间步的解之间的差异?更清楚:

解决方案由数组定义

real,dimension(0:10) :: f

我把微分方程离散化,按时间向前一步求解。如果时间索引是k,我的一部分代码是

do k=1,25
   do i = 1,10
      f(i) = f(i+1)+f(i-1)+f(i)
   end do
end do

我可以通过以下代码

在每个时间步 k 打印解决方案 f(i)
print*, "print f(i) for k=, k
print "(//(5(5x,e22.14)))", f

如何找到每个相邻时间步的解之间的差异?即,时间步长k+1k。我将把这个值存储在一个新数组 g 中,它的维度由

给出
real,dimension(0:10) :: g  

所以我想找到

!g(i)=abs(f(i;k+1)-f(i;k))...Not correct code.

我该怎么做?这段代码的实现方式是什么?我不确定如何使用 if /then 语句或执行此操作所需的任何代码来执行此操作。谢谢

您在每个时间点都有一个空间网格。瞬态问题要求您根据开始时的值计算时间步长结束时的值:

f(i, j+1) = f(i, j) + f(dot)(i, j)*dt  // Euler integration where f(dot) = df/dt derivative

i是空间索引; j 是时间。

通常,在显式时间积分方法或迭代方法中,您必须保存最后一个时间步的最后解、当前时间步的解,甚至可能更多。

所以你有

  real,dimension(0:10) :: f0, f

其中 f0 是之前的值

您迭代雅可比或高斯-赛德尔离散化:

f = f0

do k=1,25

   do i = 1,9
      f(i) = f(i+1)+f(i-1)+f(i)
   end do

   max_diff = maxval(abs(f-f0))

   if (diff small enough) exit

   f0 = f 
end do

如果您有像热方程这样的时间演化问题:

f = f0

do k=1,25

   do i = 1,9
      f(i) = f0(i) + dt * viscosity * (f0(i+1)+f0(i-1)+f0(i))
   end do

   max_diff = maxval(abs(f-f0))

   f0 = f 
end do