PyPrintPi på en Raspberry Pi (12 / 23 steg)

Steg 12: Kodning Gauss formel

I vår föregående steg funnit vi formeln:

Π/4=12*ARCTAN(1/18) + 8*arctan(1/57) - 5*arctan(1/239)

Vi kan enkelt förvandla detta till en funktion i python om vi antar att vi har definierat en arctan funktion:

def gauss_pi_method(precision):

Return 4*(12*arctan(18) + 8*arctan(57) - 5*arctan(239))

Nu måste vi skapa en arctan funktion. Den snabbaste metoden för att genomföra skulle vara att använda formeln vi såg i steg 9:

ARCTAN(x) = x - (x³/3) + (x⁵/5) - (x⁷/7) + (x⁹/9) - (x¹¹/11)...

men ser så vi ska bara räkna ut arctans med siffror i form av 1 / x det är vettigare att omdefiniera formeln som:

ARCTAN(1/x) = (1 / x)-(1/3 x ³) + (1/5x⁵) - (1/7x⁷) + (1/9x⁹) - (1/11 x ¹¹)...

Detta ger oss följande funktion i Python:

def arctan(x): #defins en funktion för att definiera pi med formeln vi härrör
noggrannhet = Decimal(Decimal(1)/Decimal(10**(getcontext().prec-3)))
resultat = Decimal(Decimal(1)/Decimal(x)) #result är en variabel används för att lagra våra nuvarande värdet på pi som ett decimaltal, 1 och x förvandlas till decimaler att undvika avrundningsfel
tecken =-1 #sign håller spår om att addera eller subtrahera andelen
denominatorval = 3 #
fract = 0 #fraction håller värdet av den del vi vill addera eller subtrahera till resultatet, det används senare för att se om funktionen kan sluta.

samtidigt sant:
fract = Decimal(Decimal(1)/(denominatorval*(Decimal(x)**denominatorval)))
resultatet += sign*(fract)
om fract < noggrannhet:
Break
tecknet * = -1
denominatorval += 2

returnera resultat

Denna funktion är lite mer avancerad än vår tidigare funktioner eftersom det inte kräver att användaren kan ange hur många iterationer för att köra. I stället man tittar på värdet av getcontext () .prec och söker efter det minsta värde som Python programmet kan skilja från noll (till exempel om getcontext () .prec = 2 så är det lägsta värde som Python kan skilja från 0 0,1).

Sedan jämförs värdet av den förra mandatperioden sekvensen: om det är mindre än det minsta värdet python kan skilja från 0 då det är meningslöst att fortsätta så programmet slutar.

Om vi sammanställt de två funktionerna får vi följande program (gauss_pi_method.py):

från decimal import *

def gauss_pi_method():
Return 4*(12*arctan(18) + 8*arctan(57) - 5*arctan(239))

def arctan(x): #defins en funktion för att definiera pi med formeln vi härrör

noggrannhet = Decimal(Decimal(1)/Decimal(10**(getcontext().prec-3)))
resultat = Decimal(Decimal(1)/Decimal(x)) #result är en variabel används för att lagra våra nuvarande värdet på pi som ett decimaltal, 1 och x förvandlas till decimaler att undvika avrundningsfel
tecken =-1 #sign håller spår om att addera eller subtrahera andelen
denominatorval = 3 #
fract = 0 #fraction håller värdet av den del vi vill addera eller subtrahera till resultatet, det används senare för att se om funktionen kan sluta.

samtidigt sant:
fract = Decimal(Decimal(1)/(denominatorval*(Decimal(x)**denominatorval)))
resultatet += sign*(fract)
om fract < noggrannhet:

Break

tecknet * = -1

denominatorval += 2

returnera resultat

medan 1:
#Asks användaren hur många decimaler som de vill ha det svara för att ges till
decimaler = int (input ("Ange hur många decimaler vill du ha svaret ges till:")) + 1

getcontext () .prec = decimaler + 4 #sets precision med 4 fler decimaler än bad om.

PiEst = gauss_pi_method() #computes pi

getcontext () .prec = decimaler #this kodblock rundor pi antal decimaler som bad om
PiEst = + PiEst

#next line skriver ut resultaten
skriva ut ("Pi till" + str(decimals-1) + "decimaler är:" + str(PiEst))

Om du kör detta för att hitta 10 000 siffror av π det tar under en minut. På min dator tog det 17 sekunder. Det är mycket bättre än den tidigare bästa programmet vi hade, den som är baserad på metoden polygon som tog 43 sekunder på min dator för att beräkna 100 siffror av π.

Men vi kan göra mycket bättre med samma funktion för att beräkna π om vi kunde beräkna arctan(1/x) snabbare.

Lyckligtvis, Euler kom upp med ett sätt att göra just detta:

ARCTAN(1/x) = (x / (1 + x²)) + ((2 * x) / (3*(1+x²)²)) + ((2 * 4 * x) / (3*5*(1+x²)³)) + ((2 * 4 * 6 * x) / (3*5*7*(1+x²)⁴)) +...

N: te termen i denna serie ges av funktionen f(n):

f(n) = f(n-1) * (2 * n) / ((2*n+1)*(1+x²))

där den första termen är (x / (1 + x²))

För att göra koden springa snabbare kan vi beräkna 1 + x² innan slingan så vi bara har att beräkna det en gång. Uppdaterade koden (gauss_pi_method_accelerated_arctan.py) är:

från decimal import *

def gauss_pi_method():
Return 4*(12*arctan(18) + 8*arctan(57) - 5*arctan(239))

def arctan(x): #defins en funktion för att definiera pi med formeln vi härrör

noggrannhet = Decimal(Decimal(1)/Decimal(10**(getcontext().prec-3)))
xSquaredPlusOne = Decimal (x ** 2 + 1)
resultat = Decimal(Decimal(x)/Decimal(xSquaredPlusOne)) #result är en variabel används för att lagra våra nuvarande värdet på pi som ett decimaltal, 1 och x förvandlas till decimaler att undvika avrundningsfel
fract = resultat
numurator_num = 2 # även num används till multiplie nämnaren
denominator_num = 3

samtidigt sant:
fract = (fract*numurator_num)/(Decimal(denominator_num)*xSquaredPlusOne)
resultatet += fract
om fract < noggrannhet:

Break
numurator_num += 2
denominator_num += 2

returnera resultat

medan 1:
#Asks användaren hur många decimaler som de vill ha det svara för att ges till
decimaler = int (input ("Ange hur många decimaler vill du ha svaret ges till:")) + 1

getcontext () .prec = decimaler + 4 #sets precision med 4 fler decimaler än bad om.

PiEst = gauss_pi_method() #computes pi

getcontext () .prec = decimaler #this kodblock rundor pi antal decimaler som bad om
PiEst = + PiEst

#next line skriver ut resultaten
skriva ut ("Pi till" + str(decimals-1) + "decimaler är:" + str(PiEst))

Denna kod tog strax över en halv sekund att beräkna π till 10.000 siffror, som är ungefär 30 gånger snabbare än innan!

Det finns ett snyggt trick att göra koden köra ännu snabbare. Hittills har vi använt decimal biblioteket i Python. Om vi gör beräkningar med hela heltal kommer det dock vara mycket snabbare. För att göra detta vi först multipliceras startvärdet med en stor makt på 10 och senare, när vi vill använda resultatet, vi delar det med den samma makten 10. Här är hur koden ska se ut (gauss_pi_method_fixed_point.py):

från decimal import *
Importera tid

def gauss_pi_method():
Return 4*(12*arctan(18) + 8*arctan(57) - 5*arctan(239))

def arctan(x):
en = 10 ** getcontext () .prec

xSquaredPlusOne = (x * x) + 1
fract = (x * en) / / xSquaredPlusOne
Total = fract
numurator_num = 2
medan 1:
nämnaren = (numurator_num + 1) * xSquaredPlusOne
fract * = numurator_num
fract = fract / / nämnare
om fract == 0:
Break
totala += fract
numurator_num += 2
återgå Decimal(Decimal(total)/Decimal(one))

medan 1:
#Asks användaren hur många decimaler som de vill ha det svara för att ges till
decimaler = int (input ("Ange hur många decimaler vill du ha svaret ges till:")) + 1
start_time = time.time()
getcontext () .prec = decimaler + 5 #sets precision med 4 fler decimaler än bad om.

PiEst = gauss_pi_method() #computes pi

getcontext () .prec = decimaler #this kodblock rundor pi antal decimaler som bad om
PiEst = + PiEst

end_time = time.time()
#next line skriver ut resultaten
skriva ut ("Pi till" + str(decimals-1) + "decimaler är:" + str(PiEst))

skriva ut ("algoritmen sprang i %s sekunder" % (time.time() - starttid))

Denna version av koden beräknas 10 000 decimaler av π i bara 0.26 sekunder, som är nästan dubbelt så snabb som den tidigare metoden!

Se Steg
Relaterade Ämnen

Raspberry Pi dokument Scanner med automatisk belasta upp till Dropbox.

Har du någonsin fått orolig när du inte har kunnat hitta en räkning eller post-it lapp som du verkligen behövs? Bra med denna Raspberry Pi dokument Scanner nu behöver du inte! Alla dina anteckningar, kvitton och handlingar kommer nu att ett klick bor...

En riktigt billig Raspberry Pi GPIO kabel

detta instructable kan nås på författarens hemsida - http://www.neatinformation.com/howto/Pi%20GPIO.html. Om du länkar till detta instructable från en annan webbplats, vänligen inkludera en länk till webbplatsen Ordentlig Information .Projektet beskr...

Öka din verklighet med iTorch raspberry pi ficklampa projektorn

UPPDATERING: Den 3 maj - spela Minecraft på den nyare iTorch :)UPPDATERING: Ny iTorch 3D tryckta version! & & Äntligen lagt upp några filmer, hoppas du gillar dem. :)Inlägg av ITorch mediedelning.https://www.Facebook.com/Photo.php?v=29239404759309...

Automatiserad Aeroponics systemet med Raspberry Pi

i detta Instructable, vi lär dig att göra en Aeroponics systemet som styrs via Raspberry Pi, och använder modulen Raspberry Pi kamera för att ta bilder av dina växter. Aeroponics är en ganska okonventionell metod av trädgårdsarbete, men det är det so...

CoPiino fuktkontroll - raspberry pi och arduino

Jag kom nyligen över en vän till mig. Vi pratade om våra senaste projekt där han slutligen berättade om sin källare som har mycket hög luftfuktighet och är för närvarande inte att bra plats där du vill köra projekt.Detta fick oss att tänka på en ny p...

Hemautomation med nod js, raspberry pi och heimcontrol

I guiden kommer att göra beskriver hur du använder heimcontrol plattform (är NodeJs program för hemautomation öppen källkod under MIT licens)Några av där funktioner:Lyhörda : responsive design ger dig bekväm kontroll hem enheter använda din smartphon...

Arduino / Raspberry Pi fallet med OpenCase

OpenCase kan du enkelt dimension och generera DXF filer för elektronik kapslingar. Du sätter i materialtjockleken, invändiga mått, och berätta det där att skära hål och utskärningar, och det gör resten. OpenSCAD används för alla beräkningar och gener...

Lätt Raspberry Pi baserad skärmsläckare/bildspel för utställningar/butik Front

På utställningar vill du ofta Visa upp ditt arbete i hopp om att locka potentiella kunder. Den här också arbeten för Fönstren av butiker att marknadsföra produkter som säljs inom. De flesta kommer helt enkelt skapa en stor fast bild affisch till stor...

Raspberry Pi I2C (Python)

i detta instructable, jag kommer att förklara hur man använder I2C på Pi, med exempel på CMPS03 kompass modulen och SRF08 ultraljud sortiment, med hjälp av python. Jag kommer att förklara rakt igenom installera OS, att se till att beroenden och allt...

Kör Linux Terminal på Windows med DHCP och Raspberry Pi

Vad du behöver:Dator med Windows installeratRaspberry Pi (jag rekommenderar B + men någon kommer att fungera)SD-kort med Raspberry Pi bild utarbetatsEthernet-kabelStrömkälla för Raspberry PiDHCP-servern (finns här)PuTTY (finns här)Steg 1: Förbered DH...

Skicka en kopia av dina bilder och videor i din Android-telefon till Raspberry Pi med Bluetooth

IntroduktionDetta instructable byggd på en tidigare instructable "vända Raspberry Pi i en Bluetooth-enhet som jag skapat.Foton och videoklipp på min Android telefon säkerhetskopieras automatiskt till Google + Foto moln. Men vill jag spara en kopia i...

Förvandla Raspberry Pi till Network File System version 4 (NFSv4) server

IntroduktionNätverk-filen System(NFS) kan samtidigt köra i version 2, 3, 4. NFS version 4(NFSv4) har flera förbättringar över NFSv2 och NFSv3. De förbättringar som jag gillar mest är:NFSv4 gör konfigurera brandväggen enkelt eftersom NFSv4 använder en...

AirPlay Radio med Raspberry Pi och WiFi

Innan jag började arbeta för Pelagicore vann jag två Raspberry Pi: s (kort RP) som de sponsrade. En eftersom jag var en av de första människorna på foss-gbg epostlistan som de började. Det är för folk från Göteborg och omgivning som vill gå med andra...

Digital notställ: Raspberry Pi + Touchscreen

IMSLP är en av de största sakerna att hända i klassisk musikvärlden under de senaste minne. För dem som inte vet, är IMSLP.org en online-bibliotek med alla noter som inte längre är under copyright-skydd. Du kan hitta ganska mycket något skrivet av Be...

Institutionen för redundans institutionen: Raspberry Pi hallon paj

Pi, naturligtvis, är ett användbart verktyg i matematik- men en Raspberry Pi är ett användbart verktyg i alla möjliga sätt. Vi är mycket glada över att äga en Raspberry Pi - som är ungefär som naken mullvad råttan datorer: det är ett kreditkort storl...

0-5V Analog insignal från Raspberry Pi ett diagram på webben

med hjälp av PIC PI expansionskort i kombination med din Raspberry Pi kommer jag visa dig hur du kan diagram analoga spänningar till CosmMaskinvara som behövs för detta projekt1 x Raspberry Pi1 x PIC PI utveckling styrelsen (du kommer att kunna köpa...

1970-talet raspberry Pi Amazon AlexaPhone

Detta är en av 1970-talet-style trimphone som jag har konverterat för att hysa en Raspberry Pi kör Amazons Alexa röstsökningstjänsten.För att använda det du bara lyfta luren, tala din fråga, hänga upp och alexas svar levereras via en inbyggd högtalar...

1981 Portable VCR Raspberry PI Media Centre

Detta är en tidig 80-Sharp VC - 2300H bärbara Videobandspelare som jag har konverterat - det har nu en Raspberry Pi i centrum, kör de utmärkta Raspbmc medierna Center software. Andra uppgraderingar inkluderar en snazzy arduino-baserad klocka och en E...

2 sätt byta med Raspberry PI och Berry IO

Min allra första instructable...Jag postat en video på youtube på ett projekt jag gjorde under min semester, här är en länk:Efter mycket mail och frågor från människor som ber om detaljerna till denna 2 sätt byta, jag bestämde mig att utarbeta detta...