数组的有限差分导数

时间:2016-10-21 15:58:43

标签: arrays fortran differential-equations

我正在尝试使用数组的衍生物,但遇到了麻烦。该数组是二维,xy方向。我希望使用xy沿着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

注意,假设在找到vw之前定义并填充了数组vwu应该分别是xy的数组 RIGHT(CONCAT('0', expr ),2) 的衍生物。这是采用数组导数的正确方法吗?

1 个答案:

答案 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