อนุพันธ์ที่ขอบ


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
แค่ Nitpick ความแตกต่างกลาง / ไปข้างหน้า / ย้อนหลังเป็นเพียงการประมาณของอนุพันธ์ ณ จุดหนึ่งไม่ใช่ตัวอนุพันธ์
เลียม

ฉันไม่เข้าใจว่าแต่ละหมายเลขอินพุทและเอาท์พุทสอดคล้องกับอะไร
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)]และเพิ่มพวกเขา

เวอร์ชั่นเก่านั้นดีกว่า (เพราะ Convolution) แต่มี 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


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]

ลองออนไลน์

บันทึก 2 ไบต์ขอบคุณ @Adnan



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-~/\-:

คล้ายกับวิธีการที่ใช้ในการ @ ดาวิดวิธีการแก้ปัญหา

การใช้

   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

Pyth - 29 ไบต์

วิธีการง่าย ๆ โง่ ๆ

s[_-F<Q2mc-@Qhd@Qtd2tUtQ_-F>2

ลองมันออนไลน์ได้ที่นี่



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.