我对数字差异有一个超出所用语言的问题。假设我有一个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点模板方法的错误?
答案 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#这是你可能想要这样做的完美例子。