Jestem nowym członkiem tutaj i zamierzam wjechać prosto w to, ponieważ spędziłem całą moją niedzielę próbując zrozumieć.Nie można dokładnie obliczyć pi na Pythonie
Jestem nowy w Pythonie, ponieważ wcześniej nauczyłem się kodowania w C++ na poziomie podstawowym i średnio-zaawansowanym (był to 10-tygodniowy moduł uniwersytecki).
Próbuję kilka iteracyjnych technik do obliczenia Pi, ale oba są nieco niedokładne i nie jestem pewien dlaczego.
Pierwsza metoda, której uczyłem się na uniwersytecie - jestem pewien, że niektórzy z was już to widzieli.
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
To zasadniczo generator losowy (x, y) współrzędnych na płaszczyźnie od -1 do +1 na obu osiach. Następnie, jeśli x^2 + y^2 < = 1, wiemy, że punkt spoczywa wewnątrz okręgu o promieniu 1 w polu utworzonym przez współrzędne osi.
W zależności od położenia punktu, licznik zwiększa się dla incircle
lub outcircle
.
Wartość pi jest to stosunek wartości wewnątrz i na zewnątrz koła. Współrzędne są generowane losowo, więc powinno być równomiernie rozłożone.
Jednak nawet przy bardzo wysokich wartościach iteracji, mój wynik dla Pi jest zawsze wokół znaku 3.65.
Druga metoda to kolejna iteracja, która oblicza obwód wielokąta ze zwiększającą się liczbą boków, aż wielokąt jest prawie okręgiem, a następnie Pi = Obwód/średnica. (W pewien sposób oszukałem, ponieważ kodowanie ma termin math.cos (Pi), więc wygląda na to, że używam Pi do znalezienia Pi, ale dzieje się tak tylko dlatego, że nie możesz łatwo używać stopni do reprezentowania kątów w Pythonie). Ale nawet w przypadku wysokich iteracji końcowy rezultat wydaje się zakończyć około 3,20, co znowu jest błędne. Kod jest tutaj:
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
Pamiętam, kiedy robi mój C++ Oczywiście, będąc powiedział, że problem jest powszechny, a nie ze względu na matematyce, ale z powodu czegoś w kodowaniu, jednak mogę nie pamiętam dokładnie. Może to dotyczyć generowania losowych liczb lub ograniczeń używania liczb zmiennoprzecinkowych lub ... cokolwiek naprawdę. To może być nawet moja matematyka ...
Czy ktoś może pomyśleć, co to jest problem?
TL; DR: Próbując obliczyć Pi, mogę zbliżyć się do niego, ale nigdy niezbyt dokładnie, bez względu na to, ile wykonuję iteracji.
(Oh i inny punkt - w drugim kodzie znajduje się wiersz z napisem S = 2,0 ** k. Jeśli ustawię "n" na wartość wyższą niż 2000, wartość S staje się zbyt duża, aby obsłużyć, a kod ulega awarii Jak mogę to naprawić?)
Dzięki!
To jest problem matematyczny. Metoda Monte-Carlo podaje przybliżenie pi, a nie pi. [This] (http://rosettacode.org/wiki/Pi#Python) powinno być dokładniejsze. – Rolbrok
Zauważyłem również, że Python jest czasami trochę poza jego obliczeń. Na przykład przy zastosowaniu 'tan (45)' degrees zwraca 0.99999 ... zamiast 1. –
@AshwinGupta Nie jest to wada tylko Pythona, ale dowolnego języka implementującego arytmetykę zmiennoprzecinkową. Ponadto, jest tan (45), który jest równy 1. – Reti43