2016-01-17 6 views
7

पर पीआई की सटीक गणना नहीं कर सकता है, मैं यहां नया सदस्य हूं और मैं सीधे इस में ड्राइव करने वाला हूं क्योंकि मैंने अपना पूरा रविवार अपने सिर को पाने के लिए कोशिश कर रहा है।पायथन

मैं पाइथन के लिए नया हूं, पहले सी ++ पर मूलभूत मध्यवर्ती स्तर पर कोडिंग सीखा था (यह 10 सप्ताह का यूनिवर्सिटी मॉड्यूल था)।

मैं पीआई की गणना करने के लिए दो पुनरावृत्त तकनीकों की कोशिश कर रहा हूं लेकिन दोनों थोड़ा गलत हो रहे हैं और मुझे यकीन नहीं है कि क्यों।

विश्वविद्यालय में पहली विधि मुझे सिखाया गया था - मुझे यकीन है कि आप में से कुछ ने इसे पहले देखा है।

x=0.0 
y=0.0 
incircle = 0.0 
outcircle = 0.0 
pi = 0.0 
i = 0 
while (i<100000): 
    x = random.uniform(-1,1) 
    y = random.uniform(-1,1) 
    if (x*x+y*y<=1): 
     incircle=incircle+1 
    else: 
     outcircle=outcircle+1 
    i=i+1 
pi = (incircle/outcircle) 
print pi 

यह अनिवार्य रूप से -1 +1 दोनों छोरों पर करने के लिए यादृच्छिक (एक्स, वाई) के लिए एक जनरेटर एक विमान पर समन्वय है। फिर यदि x^2 + y^2 < = 1, हम जानते हैं कि बिंदु समन्वय अक्ष द्वारा गठित बॉक्स के भीतर त्रिज्या 1 के एक चक्र के अंदर रहता है।

बिंदु की स्थिति के आधार पर, incircle या outcircle के लिए काउंटर बढ़ता है।

पीआई के लिए मान सर्कल के अंदर और बाहर मूल्यों का अनुपात है। समन्वय यादृच्छिक रूप से जेनरेट किए जाते हैं, इसलिए यह भी एक प्रसार होना चाहिए।

हालांकि, बहुत अधिक पुनरावृत्ति मूल्यों पर भी, पीआई के लिए मेरा परिणाम हमेशा 3.65 अंक के आसपास होता है।

दूसरी विधि एक और पुनरावृत्ति है जो बहुभुज की परिधि की गणना करता है, जब तक बहुभुज लगभग एक सर्कल नहीं होता है, फिर, पीआई = परिधि/व्यास। (मुझे धोखाधड़ी की तरह है क्योंकि कोडिंग में math.cos (पीआई) शब्द है, ऐसा लगता है कि मैं पीआई खोजने के लिए पीआई का उपयोग कर रहा हूं, लेकिन यह केवल इसलिए है क्योंकि आप पाइथन पर कोणों का प्रतिनिधित्व करने के लिए आसानी से डिग्री का उपयोग नहीं कर सकते हैं)। लेकिन उच्च पुनरावृत्तियों के लिए भी अंतिम परिणाम 3.20 के आसपास समाप्त होता है, जो फिर से गलत है। कोड यहाँ है:

S = 0.0 
C = 0.0 
L = 1.0 

n = 2.0 
k = 3.0 
while (n<2000): 
    S = 2.0**k 
    L = L/(2.0*math.cos((math.pi)/(4.0*n))) 
    C = S*L 
    n=n+2.0 
    k=k+1.0 

pi = C/math.sqrt(2.0) 
print pi 

मुझे याद है, जब मेरी सी ++ कोर्स कर रही है, कहा जा रहा है कि समस्या एक आम एक है और इसके गणित के लिए, लेकिन कोडिंग भीतर कुछ की वजह से कारण नहीं है, फिर भी मैं कर सकते हैं बिल्कुल याद नहीं है। यह यादृच्छिक संख्या पीढ़ी, या फ्लोटिंग पॉइंट नंबरों का उपयोग करने की सीमाओं, या ... वास्तव में कुछ भी हो सकता है। यह सिर्फ मेरे गणित भी हो सकता है ...

क्या कोई सोच सकता है कि समस्या क्या है?

टीएल; डीआर: पीआई की गणना करने की कोशिश कर रहा है, मैं इसके करीब आ सकता हूं लेकिन कभी भी सटीक नहीं, इससे कोई फर्क नहीं पड़ता कि मैं कितने पुनरावृत्ति करता हूं।

(ओह और दूसरा बिंदु - दूसरे कोड में एस = 2.0 ** के कहने वाली एक पंक्ति है। यदि मैं 2000 से अधिक कुछ भी 'n' सेट करता हूं, तो एस के लिए मान संभालने के लिए बहुत बड़ा हो जाता है और कोड क्रैश हो जाता है मैं इसे कैसे ठीक कर सकता हूं?)

धन्यवाद!

+0

यह एक गणित समस्या है। मोंटे-कार्लो की विधि पाई का अनुमान लगाती है, पीआई नहीं। [यह] (http://rosettacode.org/wiki/Pi#Python) अधिक सटीक होना चाहिए। – Rolbrok

+0

मैंने यह भी देखा है कि पाइथन कभी-कभी इसकी गणनाओं पर थोड़ा सा बंद होता है। उदाहरण के लिए, 'तन (45)' डिग्री लागू करते समय यह 0.9 99 99 लौटाता है ... –

+0

@ अश्विन गुप्ता यह सिर्फ पायथन की कमी नहीं है, लेकिन कोई भी भाषा जो फ्लोटिंग पॉइंट अंकगणित लागू करती है। इसके अलावा, यह तन (45) है जो 1 के बराबर है। – Reti43

उत्तर

7

एल्गोरिथ्म के लिए अपने पहले संस्करण अधिक इस तरह दिखना चाहिए:

from __future__ import division, print_function 

import sys 
if sys.version_info.major < 3: 
    range = xrange 

import random 


incircle = 0 
n = 100000 
for n in range(n): 
    x = random.random() 
    y = random.random() 
    if (x*x + y*y <= 1): 
     incircle += 1 
pi = (incircle/n) * 4 
print(pi) 

प्रिंटों:

3.14699146991 

यह करीब है। पीआई के करीब पहुंचने के लिए n बढ़ाएं।

algorithm यूनिट सर्कल का केवल एक चौथाई हिस्सा ध्यान में रखता है, यानी 1 के त्रिज्या के साथ।

एक चौथाई वृत्त के क्षेत्रफल के लिए सूत्र है:

area_c = (pi * r **2)/4 

इस चक्र युक्त वर्ग के क्षेत्र के लिए यही कारण है कि:

area_s = r **2 

जहां r वृत्त की त्रिज्या है।

अब अनुपात है:

area_c/area_s 

स्थानापन्न समीकरण से ऊपर, फिर से arange और आपको मिलता है:

pi = 4 * (area_c/area_s) 

मोंटे कार्लो जा रहे हैं, बस एक बहुत ही उच्च संख्या का प्रतिनिधित्व द्वारा दोनों क्षेत्रों की जगह उन्हें। आम तौर पर, यादृच्छिक रूप से फेंक डार्ट्स के समानता का उपयोग यहां किया जाता है।

+0

अरे, बस इसे पोस्ट कर रहा था :)। ओह ठीक है, वैसे भी वास्तव में एक अजगर आदमी नहीं है। –

+0

मध्य में बिंदुओं का अनुपात सभी बिंदुओं के अनुपात में है (केवल चार बार), सिर्फ बाहर के बिंदु ... आपको इसका जिक्र करना चाहिए। –

+0

अहह ठीक है, धन्यवाद! मुझे ये अब मिला। मैं मानता हूं कि मैं बस स्मृति से कोडिंग (एक साल पहले से अधिक) पर जा रहा था, और इसके बजाय बेवकूफ रूप से इसके पीछे मूल गणित के बारे में सोचने के बिना, मुझे लगता है कि यह बस (घुमावदार/बाहर निकलना) था लेकिन अब, rummaged कुछ पुरानी फाइलों के माध्यम से और मूल सी ++ कोड मिला, यह वास्तव में यहां वर्णित विधि का उपयोग करता है। एक बार फिर धन्यवाद। –

2

पहले एक के लिए, अपने गणना

pi = incircle/1000000*4 # 3.145376.. 

होना चाहिए यह है कि कुल अंकों की संख्या (लगभग मेरी चलाने पर .७,८५,६७१) से अधिक चक्र के अंदर उतरा अंकों की संख्या है।

1 (random.uniform(-1,1)) के त्रिज्या के साथ, कुल क्षेत्रफल 4 है, इसलिए यदि आप सर्कल के अंदर उतरने वाले बिंदुओं के अनुपात से एकाधिक 4 हैं, तो आपको सही उत्तर मिल जाएगा।