0

사용 된 언어를 넘어서는 수치 차별화에 대한 질문이 있습니다. n 개의 점 x와 f (x)의 배열이 있다고 가정하고 f (x)의 1 차 미분을 취하려고합니다. 모든 방법은 파생 배열을 함수보다 짧게 만드는 점을 소비하므로 스마트하게 배열을 "길게"만들 수 있습니다. 나는 5 점 스텐실을 사용하여 파생를 먹고 싶어 예를 들어, 그 f(n)은 n 번째 점에서 평가하는 기능입니다숫자 차별화에서 경계 지점을 처리하는 방법은 무엇입니까?

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

입니다. 따라서이 방법을 사용하면 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는 모두 인덱스 값으로 정렬됩니다. 포트란은 # : AnyOther #에서 갈 수 있기 때문에 이것을 할 수있는 완벽한 예가 될 것입니다.

+0

오류 조건을 충족합니까? –