가장자리에서 파생


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)]/2한 다음 두 경로를 수정하게, [d(1) d][d d(end)], 이들에 추가.

이전 버전은 더 좋았지 만 (컨볼 루션 때문에) 21 바이트

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

1
나는 영리하다. 따라서 차등 차이 목록과 차후 차이 목록을 가져 와서 평균 차이를 구하십시오. 그런 다음 끝점은 2 개의 전진 차이 또는 2 개의 후진 차이 (동일한 지점)를 평균하여 고정됩니다. 앞뒤로 차이가 한 지점 씩 서로 이동하기 때문에 많은 구조를 재사용 할 수 있습니다.
Tony Ruth

차이를 앞으로 나아가면 그렇지 않으면 그렇습니다. 하는 것은 중심 차이의 두 배인을 (y(i)-y(i-1))+(y(i+1)-y(i))제공합니다 y(i+1)-y(i-1).
David

3

NumPy가 포함 된 Python, 29 바이트

import numpy;numpy.gradient

이것은 NumPy gradient기능 의 기본 동작입니다 . 바이트는 이 합의에 따라 계산되었습니다 .


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

자바 스크립트 (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.