Quiche लोरेन [बंद]


52

चूंकि यह हाल ही में पाई दिन था, मैं है देखा एक नंबर की चुनौतियों है कि आप अनुकरणीय गणना करने के लिए पूछना।

बेशक, एक क्विक लॉरेन काफी पाई नहीं है (आप शीर्षक से चुनौती का अनुमान लगा सकते हैं, तो आप +1 के बोनस स्कोर का दावा कर सकते हैं)। जैसे, आपका काम एक एल्गोरिथ्म या विधि लिखना है जो ऐसा लगता है कि यह पहली नज़र में पाई का अनुमान लगाता है, लेकिन यह गारंटी दी जाती है कि वह पाई की ओर न जुटे

यह एक अंतर्निहित चुनौती है, इसलिए सुनिश्चित करें कि यह 3.14 का उत्पादन करेगा ... एक साधारण परीक्षण के मामले में, जैसे कि आपके एल्गोरिथ्म के 10 पुनरावृत्तियों के साथ। यह भी एक लोकप्रियता की चुनौती है, इसलिए स्पष्ट मत जाओ echo(pi)और कहो कि IEEE 754 फ़्लोटिंग पॉइंट राउंड कुछ अंकों को ऊपर या नीचे करता है।

विजेता को एक क्वीन लोरेन² मिलता है।

¹ चेतावनी: वास्तव में बोनस स्कोर नहीं। स्कोर का दावा करके, आप मुझे Pi Day, 2016 से पहले एक पाई बेक करने के लिए सहमत हैं

² चेतावनी: आपके उत्तर को 'स्वीकृत' के रूप में चिह्नित करने के लिए कोरी लॉरेन का उपयोग एक रूपक के रूप में किया जाता है


सम्बंधित: लिंक
Sp3000

2
मैं इस प्रश्न को ऑफ-टॉपिक के रूप में बंद करने के लिए मतदान कर रहा हूं क्योंकि अंडरहैंड चुनौतियां अब यहां विषय पर नहीं हैं। meta.codegolf.stackexchange.com/a/8326/20469
बिल्ली

जवाबों:


77

कलन विधि

प्रसिद्ध परिणाम का उपयोग करना:

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

हम पायथन 3 में परिभाषित करते हैं:

from math import sin
from functools import reduce
from operator import mul

def integrate(f, a, b, n):
   h = (b-a)/n
   i = h * sum(f(a+i*h+h/2) for i in range(n))
   return i

def sinc(x):
   return sin(x)/x

def borwein(n):
   def f(x):
     g = lambda i: sinc(x/(2*i+1))
     return reduce(mul, map(g, range(n)), 1)
   return f

परिक्षण

>>> for i in range(1,10):
...   pi = 2 * integrate(borwein(i), 0, 1000, 1000)
...   print("x[{}] = {}".format(i, pi))
x[1] = 3.140418050361841
x[2] = 3.141593078648859
x[3] = 3.1415926534611547
x[4] = 3.1415926535957164
x[5] = 3.1415926535895786
x[6] = 3.1415926535897953
x[7] = 3.1415926535897936
x[8] = 3.1415926535435896 # ???
x[9] = 3.141592616140805  # ?!!

स्पॉइलर

Borwein अभिन्न एक व्यावहारिक मजाक के गणित के विचार है। जबकि ऊपर की पहचान sinc (x / 13) तक है, अगला मान वास्तव में है:

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


12
हाल के दिनों में एक विचाराधीन सवाल का सबसे अच्छा जवाब में से एक।
अनुकूलक

14
"एक व्यावहारिक मजाक का गणित का विचार"। +1
चाचा

16
यह अच्छा है! IIRC, इस अभिन्न के साथ अधिक प्रसिद्ध चुटकुलों में से एक था जब किसी ने वुल्फराम अल्फा पर अजीब एक तक के परिणामों को रिकॉर्ड किया, और एक बग रिपोर्ट भेजी ... जो WA
देवों

3
यह संदर्भ एक अच्छी व्याख्या देता है कि क्या चल रहा है।
टोनियोएलग्रिंगो

59

पाई खोजने के लिए, हम इस प्रसिद्ध अंतर समीकरण को एकीकृत करेंगे:

> डाई / dt = sin (y) * exp (t)

एक प्रारंभिक स्थिति के साथ

> 0 <y0 <2 * pi

यह सर्वविदित है कि यह आरंभिक मूल्य समस्या increases के रूप में परिवर्तित होती है क्योंकि टी बिना किसी बाध्यता के बढ़ जाती है। इसलिए, हमें केवल 0 और 2 and के बीच किसी चीज के लिए उचित अनुमान के साथ शुरुआत करनी है, और हम संख्यात्मक एकीकरण कर सकते हैं। 3 is के करीब है, इसलिए हम शुरू करने के लिए y = 3 चुनेंगे।

class PiEstimator {

    static final int numSteps = 100;
    static final double dt = 0.1, tMax = numSteps * dt;

    static double f(double y, double t){ return Math.sin(y) * Math.exp(t); }

    public static void main(String[] args){
        double y = 3;
        int n = 0;

        for(double t = 0; t < tMax; t+=dt){
            if(n%5 == 0) System.out.println(n + ": " + y);
            n++;
            y += f(y,t)*dt;
        }
    }
}

विभिन्न चरणों की प्रत्येक संख्या के लिए यहां कुछ परिणाम दिए गए हैं:

0: 3.0
5: 3.0682513992369205
10: 3.11812938865782
15: 3.1385875952782825
20: 3.141543061526081
25: 3.141592653650948
30: 3.1415926535886047
35: 3.1415926535970526
40: 3.1415926517316737  // getting pretty close!
45: 3.1416034165087647  // uh oh
50: 2.0754887983317625  
55: 49.866227663669584
60: 64.66835482328707
65: 57.249212987256286
70: 9.980977494635624
75: 35.43035516640032
80: 51.984982646834
85: 503.8854575676292
90: 1901.3240821223753
95: 334.1514462091029
100: -1872.5333656701248

यह काम किस प्रकार करता है:

वह अंतर समीकरण सर्वविदित है क्योंकि इसे सही ढंग से एकीकृत करना बेहद मुश्किल है। जबकि छोटे टी मूल्यों के लिए भोली एकीकरण स्वीकार्य परिणाम देगा, अधिकांश एकीकरण विधियां चरम अस्थिरता प्रदर्शित करती हैं क्योंकि टी बहुत बड़ी हो जाती है।


4
@UriZarfaty यह विकिपीडिया लेख इसे अच्छी तरह से समझाता है: en.wikipedia.org/wiki/Stiff_equation
AJMansfield

1
क्या है n? ...
कोल जॉनसन

1
@AJMansfield मेरा मतलब था: यह कहीं भी घोषित नहीं है। आपका forमंदी उपयोग करता है t, लेकिन आपका लूप उपयोग करता है n
कोल जॉनसन

1
@ColeJohnson मैंने अभी इसे ठीक किया है।
AJMansfield

2
मुझे लगता है कि आपके डिफरेंशियल समीकरण को डाई / डीटी = पाप (वाई) * एक्सप (टी) पढ़ना चाहिए।
डेविड झांग

6

कोड:

var pi = function(m) {
  var s2 = 1, s1 = 1, s = 1;
  for (var i = 0; s >= 0; ++i) {
    s = s1 * 2 - s2 * (1 + m*m);
    s2 = s1;
    s1 = s;
  }
  return i*m*2;
};

मैंने मूल रूप से इस क्रम को दुर्घटना से खोजा था। यह 1, 1उसके s(n)द्वारा दिए गए प्रत्येक शब्द के रूप में शुरू होता है s(n) = 2*s(n - 1) - s(n - 2) * (1 + m*m)। अंतिम परिणाम सबसे छोटा है nजो कि s(n) < 0कई गुना है 2m। जैसा कि mछोटा होता है, इसे अधिक से अधिक सटीक होना चाहिए।

pi(1/100) --> 3.14
pi(1/1000) --> 3.14
pi(1/10000) --> 3.1414
pi(1/100000) --> 3.14158
pi(1/1000000) --> 3.141452 // what?
pi(1/10000000) --> 3.1426524 // .. further away from pi

मुझे पूरा यकीन है कि ये फ्लोटिंग पॉइंट एरर हैं क्योंकि (1 + m*m)यह एक के करीब है, लेकिन मुझे यकीन नहीं है। जैसा मैंने कहा, मैं दुर्घटना से इस पर ठोकर खाई। मुझे इसके आधिकारिक नाम पर यकीन नहीं है। mइसे बहुत छोटे से आज़माएँ नहीं तो यह हमेशा के लिए चलेगा (यदि ऐसा छोटा होने के 1 + m*m == 1कारण है m)।

अगर किसी को इस अनुक्रम का नाम पता है या यह इस तरह क्यों व्यवहार करता है, तो मैं इसकी सराहना करूंगा।


मुझे लगता है कि यह रद्दीकरण के कारण है, जो दो लगभग समान संख्याओं को घटाते समय अंकों का नुकसान है। S1 और s2 एक पुनरावृत्ति के बाद लगभग बराबर हैं।
Sanchises

1
मुझे अभी तक यह पता लगाना नहीं है कि यह कैसे काम करता है, लेकिन यह मुझे कुछ ऐसा याद दिलाता है जो मैंने एक बार किया था: मैंने बार-बार एक शोर संकेत के संचयी योग को लिया और इसे 0, अधिकतम मान के लिए सामान्यीकृत किया। यह एक साइन लहर में परिवर्तित होगा, चूंकि यह एकमात्र संकेत है जो अपने स्वयं के विरोधी व्युत्पन्न है (एक चरण ऑफसेट के साथ)।
Sanchises

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