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



我有一个关于数值微分的查询,超出了所使用的语言。假设我有一个包含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点模板方法的错误?

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

中间很容易,只是末端需要一些特殊的东西。

For X' maybe Temp(0:N+1).

For X " maybe Temp(-1:N+2).

当然,你很快就会意识到,你可以完全摆脱Temp,手动完成任务。这取决于向量的长度,以及是否需要对齐。在一些并行世界中,您可能希望temp数组作为一个函数,对于一个简单的串行实现,temp可能在概念上更容易掌握。你还提到延长数组,这是真正通过抓住每一个末端和移动你的爪子进一步分开的矢量。扩展它意味着您可以轻松地跟踪索引,在上面的实现中,X、X'和Temp都在索引值中对齐。由于fortran可以从任意#:AnyOther#开始,这是您可能想要这样做的完美示例。

相关内容

  • 没有找到相关文章

最新更新