我正在尝试使用数组的衍生物,但遇到了麻烦。该数组是二维,x
和y
方向。我希望使用x
和y
沿着u
使用中心差分离散来得到导数。该数组具有随机数字值,没有值是NaN。我将提供下面代码的基本部分来说明我的观点(假设已定义数组integer :: i,j
integer, parameter :: nx=10, ny=10
real, dimension(-nx:nx, -ny:ny) :: u,v,w
real, parameter :: h
do i=-nx,nx
do j=-ny,ny
v = (u(i+1,j)-u(i-1,j))/(2*h)
w = (u(i,j+1)-u(i,j-1))/(2*h)
end do
end do
并且已经输入了一些初始值)
u
注意,假设在找到v
,w
之前定义并填充了数组v
。 w
,u
应该分别是x
和y
的数组 RIGHT(CONCAT('0', expr ),2)
的衍生物。这是采用数组导数的正确方法吗?
答案 0 :(得分:2)
我可以在您的代码中看到几个问题。
1.你必须小心左手边的东西。
v
表示整个数组v(i,j) = (u(i+1,j)-u(i-1,j)) / (2*h)
将在任何地方设置为相同的数字。你不想在循环中想要这个。在循环中,您希望一次只设置一个点
-nx
和2)您正在访问数组越界。你可以保持简单的循环,但你必须使用边界点作为"鬼点"它存储边界值。如果我假设点nx,
,and
- ny do i=-nx+1,nx-1
do j=-ny+1,ny-1
v(i,j) = (u(i+1,j)-u(i-1,j)) / (2*h)
w(i,j) = (u(i,j+1)-u(i,j-1)) / (2*h)
end do
end do
ny`位于边界上,那么您只能使用域内的中心差异计算导数:
do j=-ny+1,ny-1
v(nx,j) = (u(nx,j)-u(nx-1,j)) / h
w(nx,j) = (u(nx,j+1)-u(nx,j-1)) / h
end do
如果你需要边界上的导数,你必须使用像
这样的片面差异AbsoluteLayout