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

时间:2016-05-28 17:33:19

标签: fortran differential-equations

我有一个由

给出的离散化微分方程的解决方案
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

我可以通过以下代码在每个时间步f(i)打印解决方案k

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语句或任何需要执行此操作的代码来执行此操作。感谢

2 个答案:

答案 0 :(得分:1)

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

所以你有

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

其中f0是先前的值

你迭代你的Jacobi或Gauss-Seidel离散化:

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

答案 1 :(得分:0)

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

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

我是空间索引; j是暂时的。