0

У меня есть запрос на численное дифференцирование, которое выходит за пределы используемого языка. Предположим, что у меня есть массив из n точек x и f (x), и я хочу взять первую производную от f (x). Каждый метод будет потреблять точки, делающие производный массив короче, чем функция, поэтому как можно «удлинить» массив разумным способом. Например, я хочу взять дериватив с использованием пятибалльной трафарет, то естьКак обрабатывать граничные точки в числовом дифференцировании?

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

f(n) где функция оценивается в п-й точке. Таким образом, с помощью этого метода массив f' короче на 4 балла. Как я могу удлинить этот массив умным способом, и если это возможно так, что это приведет к ошибке, подобной этому методу 5-точечного трафарета?

+0

В конечных точках вы можете использовать нецентральные формулы. https://en.wikipedia.org/wiki/Finite_difference_coefficient#Forward_and_backward_finite_difference. Вероятно, также возможно получить формулы для промежуточных случаев, но это может быть расщепление волос. –

ответ

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 #, это прекрасный пример того, когда вы захотите это сделать.

+0

Выполняет ли это критерий ошибки? –

Смежные вопросы