Как лечить граничные точки в численном дифференцировании?

У меня есть вопрос о численном дифференцировании, который выходит за рамки используемого языка. Предположим, у меня есть массив из 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 ответ

Решение
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 и сделать все вручную. Это зависит от длины ваших векторов и необходимости выравнивания. В некотором параллельном мире вам может потребоваться, чтобы временный массив был функцией. Для простой последовательной реализации временная схема может быть концептуально легче понять. Также вы упомянули о удлинении массива, который действительно гармонирует с вектором, захватывая каждый конец и раздвигая лапы дальше друг от друга. Расширение означает, что у вас есть подбородок, чтобы отслеживать индекс, где, как и в приведенном выше примере, X, X'и Temp все выровнены по значению индекса. Поскольку fortran может идти от любого #:AnyOther#, это идеальный пример того, когда вы можете захотеть это сделать.

Другие вопросы по тегам