किनारे पर व्युत्पन्न


9

एक व्युत्पन्न को अनुमानित करने का मेरा पसंदीदा तरीका केंद्रीय अंतर है, यह आगे के अंतर या पिछड़े अंतर की तुलना में अधिक सटीक है, और मैं उच्च-क्रम में जाने के लिए बहुत आलसी हूं। लेकिन केंद्रीय अंतर को आपके द्वारा मूल्यांकन किए जाने वाले बिंदु के दोनों ओर डेटा बिंदु की आवश्यकता होती है। आम तौर पर इसका मतलब है कि आप एंडपॉइंट पर व्युत्पन्न नहीं हैं। इसे हल करने के लिए, मैं चाहता हूं कि आप किनारों पर आगे और पीछे के अंतर पर स्विच करें:

विशेष रूप से, मैं चाहता हूं कि आप पहले बिंदु के लिए आगे के अंतर का उपयोग करें, अंतिम बिंदु के लिए एक पिछड़े अंतर और बीच के सभी बिंदुओं के लिए एक केंद्रीय अंतर। इसके अलावा, आप मान सकते हैं कि x मान समान रूप से दूरी पर हैं, और केवल y पर ध्यान केंद्रित करें। इन सूत्रों का उपयोग करें:

यहां छवि विवरण दर्ज करें

सौभाग्य, मैं यह देखने के लिए उत्सुक हूं कि क्या कोई व्यक्ति एक सरल नियम के साथ आता है जो सही स्थानों पर सभी 3 डेरिवेटिव को पुन: पेश करता है!

EX INPUT:

0.034  9.62    8.885   3.477   2.38

मैं एफडी, सीडी, और बीडी का उपयोग करेगा कि किस एल्गोरिथ्म को किस स्थान पर उपयोग करने के लिए सूचित करना है, इसलिए 5 अंक से ऊपर का उपयोग करने वाले अनुमानित डेरिवेटिव का उपयोग किया जाता है

FD     CD      CD      CD     BD

और फिर गणना मूल्य होंगे:

9.586  4.4255 -3.0715 -3.2525 -1.097 

आप मान सकते हैं कि हमेशा कम से कम 3 इनपुट बिंदु होंगे, और आप एकल या दोहरे परिशुद्धता का उपयोग करके गणना कर सकते हैं।

और हमेशा की तरह, सबसे छोटा उत्तर जीतता है।


3
बस एक नाइटपिक, केंद्रीय / आगे / पिछड़े अंतर केवल एक बिंदु पर डेरिवेटिव के सन्निकटन हैं, न कि स्वयं डेरिवेटिव।
लियाम

मुझे समझ नहीं आ रहा है कि प्रत्येक इनपुट और आउटपुट संख्या किस से मेल खाती है।
xnor

@ xnor, मैंने इनपुट और आउटपुट के बीच एक संक्षिप्त विवरण दिया जिसमें बताया गया है कि किस डेटा बिंदु के लिए कौन सा एल्गोरिदम उपयोग करना है। क्या यह अब समझ में आता है?
टोनी रूथ

हां, मुझे लगता है कि यह समझ में आता है। 5 इनपुट के लिए, आप करेंगे [a,b,c,d,e] -> [b-a,(c-a)/2,(d-b)/2,(e-c)/2,e-d]। वहाँ कम हो सकता है कि 3 इनपुट अंक?
xnor

@xnor, यह सही है। और, मैंने अपडेट किया ताकि आप कम से कम 3 इनपुट पॉइंट मान सकें।
टोनी रूथ

जवाबों:


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 बैकवर्ड अंतर (एक ही स्थान पर) के बजाय औसत द्वारा तय किए जाते हैं। चूंकि आगे और पीछे का अंतर एक-दूसरे से एक स्थान पर स्थानांतरित हो जाता है, इसलिए आपको बहुत सारी संरचना का पुन: उपयोग करना पड़ता है।
टोनी रूथ

बस आगे मतभेद हैं, अन्यथा हाँ। कर (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

अजगर, 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

जे, 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

जावास्क्रिप्ट (ईएस 6), 62 बाइट्स

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.