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がすべてインデックス値に整列しているインデックスを追跡するためのあごひげがあることを意味します。 fortranは任意の#:AnyOther#から行くことができるので、これはあなたがそのようにしたいときの完璧な例です。

+0

これはエラー基準を満たしていますか? –

関連する問題