我有一个由
给出的离散化微分方程的解决方案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+1
,k
。我将此值存储在一个新数组g
中,该数组的维度由
real,dimension(0:10) :: g
所以我想找到
!g(i)=abs(f(i;k+1)-f(i;k))...Not correct code.
我该怎么做?实现此代码的方法是什么?我不知道如何使用if / then语句或任何需要执行此操作的代码来执行此操作。感谢
答案 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是暂时的。