两个时间步之间的有限差分解的差异
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+1
,k
。我将把这个值存储在一个新数组 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
我有一个离散微分方程的解
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+1
,k
。我将把这个值存储在一个新数组 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