エッジでのデリバティブ


9

導関数を近似するための私の好ましい方法は、中央差分であり、その差分は前方差分または後方差分よりも正確です。ただし、中心的な違いは、評価するポイントの両側にデータポイントが必要なことです。通常、これはどちらのエンドポイントにもデリバティブがないことを意味します。それを解決するには、エッジで前方と後方の差に切り替えてください:

具体的には、最初のポイントには前方差分、最後のポイントには後方差分、中央のすべてのポイントには中央差分を使用してください。また、xの値は等間隔であると想定して、yにのみ焦点を合わせることができます。次の式を使用します。

ここに画像の説明を入力してください

幸運を祈ります。誰かが3つのすべての派生物を適切な場所に再現する簡単なルールを思いつくかどうかを楽しみにしています!

EX入力:

0.034  9.62    8.885   3.477   2.38

FD、CD、およびBDを使用して、どのスポットでどのアルゴリズムを使用するかを示します。したがって、5点以上を使用して、

FD     CD      CD      CD     BD

そして、計算された値は次のようになります:

9.586  4.4255 -3.0715 -3.2525 -1.097 

常に少なくとも3つの入力ポイントがあると想定でき、単精度または倍精度を使用して計算できます。

そしていつものように、最も短い答えが勝つ。


3
単なる一歩進んだ中央/前方/後方の違いは、ある時点での微分の単なる近似であり、微分そのものではありません。
リアム

各入力番号と出力番号が何に対応するのかわかりません。
xnor

@xnor、入力と出力の間に、どのデータポイントにどのアルゴリズムを使用するかを簡単に説明します。今では意味がありますか?
Tony Ruth

はい、それは理にかなっていると思います。5つの入力の場合は、次のようにします[a,b,c,d,e] -> [b-a,(c-a)/2,(d-b)/2,(e-c)/2,e-d]。3つの入力ポイントより少なくできますか?
xnor

@xnor、そうです。そして、少なくとも3つの入力ポイントを想定できるように更新しました。
Tony Ruth

回答:


4

ゼリー13 10 バイト

I.ịṚjI+2\H

オンラインでお試しください!

使い方

I.ịṚjI+2\H  Main link. Argument: A (array)

I           Increments; compute the deltas of consecutive values.
            For [a, b, c, d, e], this yields [b-a, c-b, d-c, e-d].
 .ị         At-index 0.5; get the the last and first element.
            This yields [e-d, b-a].
   Ṛ        Reverse the pair.
            This yields [b-a, e-d].
    jI      Join, separating by the increments.
            This yields [b-a, b-a, c-b, d-c, e-d, e-d].
      +2\   Add the values of all overlapping pairs.
            This yields [2(b-a), c-a, d-b, e-c, 2(e-d)].
         H  Halve all resulting numbers.
            This yields [b-a, (c-a)/2, (d-b)/2, (e-c)/2, e-d]. 

3

MATL、21 15バイト

2/d1)6Mh8Mt0)h+

TryItOnline

入力ベクトルを半分にして、連続する差分を取り、d=[i(2)-i(1) i(3)-i(2) ... i(end)-i(end-1)]/22つの変更されたベクトル、、を作成[d(1) d][d d(end)]、それらを追加します。

古いバージョンは(畳み込みのため)優れていましたが、21バイトです。

d1j)6M1)6MTT2/H3$Y+bv

1
なるほど、かなり賢いですね。したがって、前方差異のリストと後方差異のリストを取り、それらを平均して中心的な差異を取得します。次に、代わりに2つの前方差分または2つの後方差分(同じスポット内)を平均化することにより、エンドポイントを修正します。前方と後方の差が1点ずれているだけなので、多くの構造を再利用できます。
トニー・ルース

違いを転送してください。実行すると、中央の差の2倍になるが(y(i)-y(i-1))+(y(i+1)-y(i))得られy(i+1)-y(i-1)ます。
デビッド


1

05AB1E、20 19 17 14バイト

¥Ð¦øO;s¤s0èŠ)˜

説明しました

¥Ð              # triplicate deltas of list
                  [9.585999999999999, -0.7349999999999994, -5.4079999999999995, -1.097]
  ¦øO;          # get central difference (fold addition over deltas and divide by 2)
                  [4.4254999999999995, -3.0714999999999995, -3.2524999999999995]
      s¤        # get backwards difference
                  -1.097
        s0è     # get forwards difference
                  9.585999999999999
           Š)˜  # reorder differences, merge to list and flatten
                  [9.585999999999999, 4.4254999999999995, -3.0714999999999995, -3.2524999999999995, -1.097]

オンラインでお試しください

@Adnanのおかげで2バイト節約



1

Pyth、14バイト

.OM>L2._seB-Vt

オンラインで試す:デモ

説明:

.OM>L2._seB-VtQQ   implicitly add two Qs (input arrays) at the end
           -VtQQ   get all neighbored differences
        seB        get the last element of ^ and append it to ^
      ._           compute all prefixes
   >L2             reduce all prefixes to the last two elements
.OM                compute the average of each ^

1

J、21バイト

[:((,{:)+{.,])2-~/\-:

@Davidのソリューションで使用されているアプローチに似ています

使用法

   f =: [:((,{:)+{.,])2-~/\-:
   f 0.034 9.62 8.885 3.477 2.38
9.586 4.4255 _3.0715 _3.2525 _1.097

説明

[:((,{:)+{.,])2-~/\-:  Input: list A
                   -:  Halve each value in A
              2   \    Select each overlapping sublist of size 2 in A
               -~/     Reduce it using subtraction to get the difference
[:(          )         Operate on the list of differences, call it D
            ]          Identity function, returns D
         {.            Get the head of D
           ,           Join them to get [head(D), D]
   ( {:)               Get the tail of D
    ,                  Join them to get [D, tail(D)]
        +              Add them together elementwise to get the derivatives and return


0

JavaScript(ES6)、62バイト

a=>a.map((_,i)=>i&&i--<a.length-2?(a[i+2]-a[i])/2:a[i+1]-a[i])

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.