Kuidas kirjutada Pythoni programmi Pi arvutamiseks

Ï€ on oluline number. Seda kasutatakse arvutuste tegemiseks ringide ja sfääride kohta, samuti nurkade mõõtmiseks radiaanide abil. Ï€-l on mõned huvitavad omadused, näiteks ebaratsionaalsus. See tähendab, et sellel on lõpmatult palju numbreid, mis ei ühti korduva mustriga. Siiski saate Ï€ ligikaudselt hinnata erinevate meetoditega. Kui soovite teha palju numbreid, võib see käsitsi teha vigu. Õnneks ei ole raske kirjutada arvutiprogrammi, mis seda teie eest teeks. See on ka hea viis programmeerimise harjutamiseks ja numbri Ï kohta lisateabe saamiseks. Lugege edasi, et õppida, kuidas Pythoni põhiprogrammidega Ï€ arvutada!

1
Saage aru Nilakantha seeriast. Nilakantha seeria algab sõnadega: Ï€=3+42∗3∗4−44∗5∗6+46∗7∗8−48∗9∗10…{displaystyle pi =3+{frac {4 }{2*3*4}}-{frac {4}{4*5*6}}+{frac {4}{6*7*8}}-{frac {4}{8*9 *10}}…}ja jätkab selle mustri järgi. Algoritm, mida soovite kirjutada, on järgmine: “vastusena” alustage 3-st ja arvust n=2{displaystyle n=2}Arvutage 4n∗(n+1)∗(n+2){ displaystyle {frac {4}{n*(n+1)*(n+2)}}}.Lisage vastusest selle arvutuse tulemus või lahutage sellest.Korrake määratud arv kordi.Tagastage ja kuvage vastus .

2
Looge uus tekstifail. Võite kasutada mis tahes oma valitud IDE-d või lihtsalt tekstiredaktorit. Andke oma failile laiend .py, et arvuti tuvastaks selle Pythoni programmifailina.

3
Impordi kümnendmoodul. Kui kasutate Pythonit ilma selleta või sarnaseid teeke, on täpsus piiratud 17 numbriga. See moodul võimaldab aga numbrite suvalist täpsust. See on Pythoni vaiketeek, nii et te ei pea seda eraldi installima.from decimal import *

4
Määrake kümnendkohtade täpsus. Kui suureks te selle teete, sõltub sellest, mitu Ï€ numbrit soovite arvutada. Näiteks Ï€ 100 numbri arvutamiseks lisage rida:getContext().prec = 100

5
Määratlege Nilakantha seeria funktsioon. Programmeerimiseks võite ette kujutada, et seeria on funktsioon, mis võtab iteratsioonide arvu, arvutab selle iteratsioonide arvuga jada ja tagastab ligikaudse Ï€. Pythonis on funktsioonil järgmine struktuur:def nilakantha(reps): # Siin on arvutused tagasta vastus

6
Määrake muutujate algväärtused. vastus on algselt 3. Kindlasti määrake see kümnendkohaks, sest see on number, mille puhul soovite kümnendkoha teegi suurt täpsust. Määrake ka muutuja op väärtuseks 1. Seda muutujat kasutatakse hiljem liitmise ja lahutamise vaheldumiseks.def nilakantha(reps): vastus = Kümnend(3.0) op = 1 # Arvutused on siin tagasta vastus

7
Lisa for-silmus. For-silmus seab muutuja n algselt väärtusele 2. Seejärel teeb see seda, mis on tsükli sees, ja suurendab n väärtust 2 võrra ning kordab seda protsessi, kuni saavutatakse ülempiir 2*kordused+1.def nilakantha(reps): vastus = Kümnend(3.0) op = 1 n jaoks vahemikus (2, 2*kordused+1, 2): # Arvutused tulevad siia tagasi vastuse

8
Arvutage Nilakantha seeria element ja lisage see vastusele. Piisab, kui muuta üks murdosa osa kümnendkohaks, Python teisendab teised osad vastavalt. Programmeerige valem, kuid korrutage see ka op-ga.Esimeses tsüklis määratakse op väärtuseks 1, nii et sellega korrutamine ei tee midagi. Kuid see seatakse hiljem muudele väärtustele. n jaoks vahemikus (2, 2*kordust+1, 2): tulemus += 4/Decimal(n*(n+1)*(n+2)*op)

9
Korrutage op -1-ga. Kui op oli 1, on see -1. Kui see oli -1, on see 1. Negatiivse arvu lisamine on nagu positiivse arvu lahutamine. Nii vaheldub programm liitmise ja lahutamise vahel. n puhul vahemikus(2, 2*kordust+1, 2): tulemus += 4/Decimal(n*(n+1)*(n+2)*op) op *= -1

10
Kirjutage funktsioonile liides. Tõenäoliselt soovite sisestada, kui palju seeria iteratsioone tuleks kasutada, ja viisi, kuidas kuvada arvutatud Ï€ ligikaudne väärtus.print(“Mitu kordust?”)kordused = int(input()) print(nilakantha(kordused))Kui te pole palju Ï€ numbreid meelde jätnud, võiksite tulemusega võrdlemiseks kuvada ka Ï€ tegeliku alguse. Kui see on nii, lisage järgmine rida:print(“3.141592653589793238462643383279502884197169399375105820974944592307816406286208098

11
Kontrollige oma koodi. Kogu teie kood peaks nüüd välja nägema selline (viimase rea võid välja jätta):from decimal import *getcontext().prec = 100def nilakantha(reps): result = Decimal(3.0) op = 1 n = 2 n puhul vahemikus( 2, 2*kordust+1, 2): tulemus += 4/Decimal(n*(n+1)*(n+2)*op) op *= -1 return resultprint(“Mitu kordust?”)kordused = int(sisend())print(nilakantha(kordused))print(“3.141592653589793238462643383279502884197169399375105820974944592307281608209749445923072816087692816208742816208481281608

12
Käivitage oma programm. Klõpsake oma IDE sümbolil “Käivita”. Pythoni IDLE-s vajutage F5. Kui töötasite lihtsas tekstiredaktoris, salvestage fail ja käivitage see Pythoniga.Alustage väikese arvu iteratsioonidega, näiteks 100. See võimaldab teil näha, kas programm töötab. Olge valmis ootama, kui soovite palju numbreid. Ï €. Näiteks selle seeria miljoni iteratsiooni sooritamine annab teile õigesti 18 numbrit Ï € ja selleks kulub umbes 30 sekundit.

13
Mõista Monte-Carlo meetodit. Kujutage ette suvalise pikkusega ruutu ja selle sees veerand ringi, mille raadius on sama pikkusega. Programm genereerib juhuslikud punktid ruudu sees ja seejärel kontrollib, kas need on ka ringi sees. Kui punkte on palju, siis veerandringi sees olevate punktide jagamine ruudu sees olevate punktide arvuga on nagu ruudu jagamine. veerandringi pindala ruudu pindala võrra. Seega, kuna:AquartercircleAsquare=14Ï€r2r2=14Ï€{displaystyle {frac {A_{quartercircle}}{A_{square}}}={frac {{frac {1}{4}}pi r ^{2}}{r^{2}}}={frac {1}{4}}pi }Võite Ï€ arvutada järgmisega:4AquartercircleAsquare=Ï€{displaystyle 4{frac {A_{quartercircle} }{A_{ruut}}}=pi }Programm ei saa pindala lihtsalt otse kasutada, sest veerandringi pindala arvutamiseks oleks vaja Ï€, mille see programm peaks määrama. See ei ole tõhus meetod. . Peate üsna kaua ootama, et saada sama palju Ï€ numbreid kui näiteks Nilakantha seerias. See on aga meetod, mida on lihtne ette kujutada ja visualiseerida (veel aeglasema jõudluse hinnaga).

14
Importige vajalikud moodulid. Te ei pea neid installima, need kõik on juba Pythoniga installitud. juhuslikul on funktsioon juhuslike arvude genereerimiseks. matemaatika pakub mõningaid matemaatilisi funktsioone, nagu ruutjuur, mida vajate punkti kauguse arvutamiseks. kilpkonn joonistab, mida programm teeb. See muudab selle aeglasemaks, kuid võib aidata meetodist aru saada ja olla mõnda aega huvitav vaadata. Kui soovite Ï€ kiiresti arvutada, peaksite igal juhul valima teise meetodi.import randomimport mathimport turtle

15
Küsige kasutajalt, mitu punkti arvutada. See võib olla järgmise koodiga:print(“Sisesta punktide arv:”)np = input(),mitte np.isdigit(): print(“Sisesta punktide arv:”) np = input()np = int( np)

16
Tee kilpkonn kiiremaks. Vaikimisi pole kilpkonn nii kiire kui võiks. Muutke seda, määrates kilpkonna kiiruseks fastest:turtle.speed(“kiireim”)

17
Joonistage olukord. Joonistage koordinaatide süsteem, milles on ristkülik ja veerandring, ja joonistage veerandring. Esiteks määrake muutuja, mis salvestab ruudu pikkuse ja veerandringi raadiuse pikslites (vaja on ainult üks muutuja , sest see on sama number). See säästab teid palju tööd, kui otsustate muuta veerandringi ja ruudu suurust. pikkus = 300 # ringi raadius ja ruudu pikkus pikslites. Seejärel peate tegelikult joonistama koordinaatide teljed ja ringi. See kood on pikk, kuid kõik see liigutab kilpkonna, et neid asju joonistada.#draw y axisturtle.pensize(2)turtle.forward(length + 40)turtle.left(135)turtle.forward(20)turtle. tagasi(20)kilpkonn.vasak(90)kilpkonn.edasi(20)kilpkonn.penup()kilpkonn.kodu()kilpkonn.pendown()#joonista x telgkilpkonn.vasak(90)kilpkonn.edasi(pikkus + 40)kilpkonn. vasak(135)kilpkonn.edasi(20)kilpkonn.tagasi(20)kilpkonn.vasak(90)kilpkonn.edasi(20)kilpkonn.penup()kilpkonn.goto(0,length)kilpkonn.vasak(45)kilpkonn.vasak (180)kilpkonn.pendown()#joonista veerand ringkilpkonnast.pencolor(“punane”)kilpkonn.ring(pikkus,-90)

18
Tehke silmus arvutuste jaoks, mida peate iga punkti jaoks tegema. Enne tsüklit määrake ringi sees olevate punktide arv (muutuja sees) väärtusele 0.inside = 0, kui i vahemikus(0,np):

19
Leidke punktile juhuslik asukoht. Teil on vaja kahte juhuslikku arvu punkti x- ja y-asendis. Arvutuste hõlbustamiseks jätsime eelmistes sammudes veerandringi keskpunkti (0,0). See tähendab, et mõlemad numbrid peavad jääma 0 ja ruudu pikkuse vahele. Hankige sellised arvud funktsiooniga random.uniform(): #get dot position x = random.randint(0,length) y = random.randint(0,length)

20
Kontrollige, kas punkt on veerandringi sees. Peate arvutama punkti ja keskpunkti vahelise kauguse ning kontrollima, kas see on väiksem või võrdne veerandringi raadiusega. Kauguse arvutamiseks peate kasutama Pythagorase teoreemi. See on:d=(x2−x1)2+(y2−y1)2{displaystyle d={sqrt {(x_{2}-x_{1})^{2}+(y_{2}-y_ {1})^{2}}}}Kuna aga keskpunkt asub punktis (0,0), on x1 ja y1 mõlemad 0 ja neid võib ignoreerida. Valem on lihtsam:d=x22+y22{displaystyle d={sqrt {{x_{2}}^{2}+{y_{2}}^{2}}}}Pythoni koodis (x2 ja y2 on koordinaadid, mille saite eelmises etapis): #määrake kaugus keskpunktist d = math.sqrt(x**2 + y**2)Kui punkt asub ringi sees, suurendage muutujat, mis loeb punkte sees ring 1 võrra. Parema ülevaate saamiseks määrake ringi sees oleva punkti värv punaseks ja ringist väljas oleva punkti värv siniseks. if d <= pikkus: sees += 1 kilpkonn.pencolor("punane") else: kilpkonn.pencolor("sinine") 21 Joonista punkt. Kasutage selleks kilpkonna: #joonista punkt kilpkonn.penup() turtle.goto(x,y) turtle.pendown() turtle.dot() 22 Kuva tulemused pärast tsükli lõppemist. Öelge kasutajale, mitu punkti oli ringi sees ja millise Ï€ väärtuse see arvutus andis:print("Inside of veerandringi:")print(inside)print("Punktide kogusumma:")print(np) print("Pi on ligikaudu:")print((sees / np) * 4.0) 23 Väljuge ainult siis, kui kasutaja klõpsab ekraanil. Seda tehakse kilpkonna mooduli funktsiooniga exitonclick(). Vastasel juhul sulguks joonisega aken arvutuste lõppedes ja kasutajal poleks aega seda vaadata. Lisa rida:turtle.exitonclick() 24 Kontrollige oma koodi. Kogu teie kood peaks nüüd olema:import randomimport mathimport turtleprint("Sisesta punktide arv:")np = input()while not np.isdigit(): print("Sisesta punktide arv:") np = input()np = int(np)turtle.speed("kiireim")length = 300 # ringi raadius ja ruudu pikkus pikslites#joonista y axisturtle.pensize(2)turtle.forward(length + 40)turtle.left(135)turtle Edasi (pikkus + 40)kilpkonn.vasak(135)kilpkonn.edasi(20)kilpkonn.tagasi(20)kilpkonn.vasak(90)kilpkonn.edasi(20)kilpkonn.penup()kilpkonn.goto(0,pikkus)kilpkonn. left(45)turtle.left(180)turtle.pendown()#joonista veerand ringturtle.pencolor("punane")turtle.circle(length,-90)inside = 0for i vahemikus(0,np): #get punkti asukoht x = random.uniform(0,length) y = random.uniform(0,length) #määrata kaugus keskpunktist d = math.sqrt(x**2 + y**2), kui d <= pikkus: sees += 1 kilpkonn.pencolor("punane") else: kilpkonn.pencolor("sinine") #joonista täpp kilpkonn.penup() kilpkonn.goto(x,y) kilpkonn.pendown() kilpkonn.punkt()print( "Verandringi sees:")print(inside)print("Punktide kogusumma:")print(np)print("Pi on ligikaudu:")print((inside / np) * 4.0)turtle.exitonclick( ) 25 Käivitage oma programm. Klõpsake oma IDE sümbolil "Käivita". Pythoni IDLE-s vajutage F5. Kui töötasite lihtsas tekstiredaktoris, salvestage fail ja käivitage see Pythoniga. Alustage väikese arvu punktidega, näiteks 100. See võimaldab teil näha, kas programm töötab. Olge valmis ootama väga kaua. Isegi 1000 punkti arvutamine võtab u. 1½ minutit ja annab mõne (1–2) numbri Ï €. 10000 punkti arvutamine võtab 15 minutit ja annab 2–3 numbrit Ï€.