如何处理数值微分中的边界点?

时间:2016-10-29 01:09:08

标签: arrays fortran numerical-methods automatic-differentiation

我对数字差异有一个超出所用语言的问题。假设我有一个n点x和f(x)的数组,我想取f(x)的一阶导数。每个方法都会消耗点,使得导数数组比函数更短,那么"加长"阵列以聪明的方式。例如,我想使用五点模板来获取衍生物,即

    f'(0) = 1/12 h (-f(-2) + 8 f(-1)- 8 f(1) + f(2))

其中f(n)是在第n点评估的函数。因此,使用此方法,f'数组缩短了4个点。如何以一种聪明的方式延长该阵列,如果它可能产生类似于这种5点模板方法的错误?

1 个答案:

答案 0 :(得分:0)

SUBROUTINE Diff(X, N, XPrime)
INTEGER           , INTENT(IN   ) :: N
REAL, DIMENSION(N), INTENT(IN   ) :: X
REAL, DIMENSION(N), INTENT(INOUT) :: XPrime
enter code here
REAL, DIMENSION(-1:N+2)           :: Temp
INTEGER                           :: I

!Use temp for X
Temp(1:N) = X
!... Temp(O)   = X(1) - (X(2) - X(1)  )
!... Temp(N+1) = X(N) + (X(N) - X(N-1))

!Your code here

!output XPrime from 1:N

END SUBROUTINE Diff

矢量的中间很容易,只需要一些特殊的东西。

对于X'可能是Temp(0:N + 1)。

对于X''可能是Temp(-1:N + 2)。

当然不应该花很长时间才意识到你可以完全摆脱Temp并手动完成任务。这取决于你的向量有多长,以及你是否需要一些对齐。在某些并行的世界中,您可能需要将temp数组作为函数。对于简单的串行实现,temp在概念上可能更容易掌握。你还提到了加长阵列,它通过抓住每一端并将你的爪子进一步分开来真正地折叠矢量。扩展它意味着你有下巴划痕来跟踪索引,在上面的实现中,X,X'和Temp都在索引值中对齐。因为fortran可以来自任何#:AnyOther#这是你可能想要这样做的完美例子。