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