P i = = 3, 2


37

Inspiriert von diesem Video von Infinite Series .

Einführung

Pi ist definiert als das Verhältnis des Umfangs zum Durchmesser eines Kreises. Aber wie ist ein Kreis definiert? Normalerweise wird ein Kreis als die Punkte mit konstantem Abstand zum Mittelpunkt definiert (nehmen wir an, dass sich der Mittelpunkt in befindet (0,0)). Die nächste Frage wäre: Wie definieren wir den Abstand ? Im Folgenden betrachten wir unterschiedliche Vorstellungen von Entfernungen (induziert durch die Lp-Norms):

Wenn eine Norm (= etwas, das eine Länge misst ) gegeben ist, können wir leicht einen Abstand (= Abstand zwischen zwei Punkten) wie folgt konstruieren :

dist(A,B) := norm (A-B)

Die euklidische Norm ist gegeben durch:

norm((x,y)) = (x^2 + y^2)^(1/2)

Dies wird auch als L2-Norm bezeichnet . Die anderen Lp-Normen werden konstruiert, indem die 2in der obigen Formel angegebenen Werte durch andere Werte zwischen 1 und unendlich ersetzt werden:

norm_p((x,y)) = (|x|^p + |y|^p)^(1/p)

Die Einheitskreise für diese verschiedenen Normen haben ganz unterschiedliche Formen:

Herausforderung

Bei einer gegebene p >= 1, berechnet das Verhältnis von Umfang zu Durchmesser eines Lp-Kreises in Bezug auf die Lp-Norm mit einer Genauigkeit von vier signifikanten Ziffern.

Testfälle

Das können wir verwenden für p,qmit 1 = 1/p + 1/quns das gleiche Verhältnis für das bekommen , Lpsowie die LqNorm. Außerdem ist p = q = 2das Verhältnis minimal, und p = 1, q = infinitywir erhalten ein Verhältnis von 4, so dass die Verhältnisse immer zwischen piund liegen 4.

p   or  q            ratio
1       infinity     4
2       2            3.141592
1.623   2.60513      3.200
1.5     3            3.25976
4       1.33333      3.39693

2
Die Formen sind als Lamé-Kurven oder Superellipsen bekannt und existieren auch für 0 < p <1, obwohl die Norm dies nicht tut (weil sie die Dreiecksungleichung verletzt). Der Wikipedia-Artikel für die Superellipse enthält ein geschlossenes Formular für den Bereich.
Neil

@Neil Wir müssen jedoch den Umfang berücksichtigen, nicht die Fläche, die meines Wissens nur über ein Bogenlängenintegral berechnet werden kann.
Fehler

7
Entschuldigung, als ich mit dem Lesen fertig war, hatte ich vergessen, wonach die Frage gefragt hatte.
Neil

2
Schöne Herausforderung!
Luis Mendo

1
Es ist interessant festzustellen, dass die Bereichsformel ( A = πr²) nicht gilt fürp ≠ 2
Mego

Antworten:


12

Python + scipy, 92 Bytes

from scipy.integrate import*
lambda p:2/p*quad(lambda x:(x/x**p+(1-x)**(1-p))**(1/p),0,1)[0]

Formel ist aus dieser math.SE-Frage .


Beim Testen einer Implementierung mit diesem Ansatz hatte ich aufgrund der Singularität bei Probleme mit der Konvergenz dieses Ansatzes. x=1Wie funktioniert Ihre Übermittlung?
Fehler

Scipy ist nicht Teil der Python-Standardbibliothek. Vielleicht zu Sage wechseln?
Busukxuan

2
@busukxuan Für PPCG gibt es keine Anforderung, mit der Sie nur Standardbibliotheken verwenden können. Aber ich werde es trotzdem im Titel erwähnen.
Orlp

1
@ChristianSievers Ich habe meine eigene Integration gemacht, um zu vermeiden, dass ich mich schlecht fühle, wenn ich die geschlossene Formel eines anderen verwende :-P
Luis Mendo

1
@ ChristianSievers Ich habe tatsächlich auch eine andere Formla in den Sandkasten aufgenommen, falls Sie interessiert sind =)
Fehler

10

MATL , 31 Bytes

0:1e-3:1lyG^-lG/^v!d|G^!slG/^sE

Probieren Sie es online! Oder überprüfen Sie alle Testfälle .

Erläuterung

Dies erzeugt die x , y- Koordinaten eines Viertels des Einheitskreises, der an 1001 Punkten mit Schritt 0,001 in x abgetastet wurde . Die Länge des Kreisviertels wird durch die Länge der Polygonlinie angenähert, die durch diese Punkte verläuft. das ist die Summe der Längen der 1000 Segmente. Die Länge wird natürlich nach p-norm berechnet . Wenn Sie das Ergebnis mit 2 multiplizieren, erhalten Sie die ungefähre Länge eines halben Kreises, d. H. Pi.

0:1e-3:1   % Push [0 0.001 0.002 ... 0.999 1]. These are the x coordinates of
           % the vertices of the polygonal line that will approximate a quarter
           % of the unit circle
l          % Push 1
y          % Duplicate [0 0.001 0.002 ... 0.999 1] onto the top of the stack.
G          % Push input, p
^          % Element-wise power: gives [0^p 0.001^p ... 1^p]
-          % Element-wise subtract from 1: gives [1-0^p 1-0.001^p ... 1-1^p]
lG/        % Push 1, push p, divide: gives 1/p
^          % Element-wise power: gives [(1-0^p)^(1/p) (1-0.001^p)^(1/p) ...
           % ... (1-1^p)^(1/p)]. These are the y coordinates of the vertices
           % of the polygonal line
v          % Concatenate vertically into a 2×1001 matrix. The first row contains
           % the x coordinates and the second row contains the y coordinates
!          % Transpose
d|         % Compute consecutive differences down each column. This gives a
           % 1000×2 matrix with the x and y increments of each segment. These
           % increments will be referred to as Δx, Δy
G          % Push p
^          % Element-wise power
!          % Transpose
s          % Sum of each column. This gives a 1×1000 vector containing
           % (Δx)^p+(Δy)^p for each segment
lG/        % Push 1/p
^          % Element-wise power. This gives a 1×1000 vector containing 
           % ((Δx)^p+(Δy)^p)^(1/p) for each segment, that is, the length of 
           % each segment according to p-norm
s          % Sum the lenghts of all segments. This approximates the length of
           % a quarter of the unit circle
E          % Multiply by 2. This gives the length of half unit circle, that is,
           % pi. Implicitly display

8

Mathematica, 49 46 Bytes

3 Bytes aufgrund von Alephalpha gespeichert .

2NIntegrate[(1+(a^-#-1)^(1-#))^(1/#),{a,0,1}]&

Anonyme Funktion. Nimmt eine Zahl als Eingabe und gibt eine Zahl als Ausgabe zurück.


1
2NIntegrate[(1+(a^-#-1)^(1-#))^(1/#),{a,0,1}]&
Alephalpha

5

PARI / GP, 48 43 Bytes

Es ist einfach, nachdem @orlp die Formel gefunden hat, und in der @ alephalpha-Version werden 5 Bytes gespeichert:

p->2*intnum(u=0,1,(1+(u^-p-1)^(1-p))^(1/p))

Um etwas Nützliches hinzuzufügen, berechnen pwir den Wert, für den wir erhalten 3.2:

? f=p->2*intnum(u=0,1,(1+(u^-p-1)^(1-p))^(1/p));
? solve(p=1,2,f(p)-3.2)
%2 = 1.623002382384469009676324702

Richtige Benutzung

Während der Code Ergebnisse liefert, die viel genauer sind als die Herausforderungsanforderungen, kann er leicht erheblich verbessert werden: Wenn wir die obere Integrationsgrenze 1durch [1,1/p-1](im Handbuch als Singularitätsexponent bezeichnet) ersetzen, f(2)stimmen alle angezeigten Ziffern überein Pi. Dies gilt auch dann, wenn wir die Genauigkeit auf 100 (Typ \p100) erhöhen .

Nach dieser Änderung solvefunktionierte die Berechnung jedoch nicht mehr. Ich habe den inneren Begriff geändert, um den Fall explizit zu behandeln, u=0und habe auch auf einen anderen Computer mit einer neueren PARI-Version und 64-Bit gewechselt (was eine höhere Standardgenauigkeit impliziert).

Hier ist die verbesserte Berechnung des pWertes für Pi=3.2, und schauen wir uns auch den realen Pi an:

? f=p->2*intnum(u=0,[1,1/p-1],if(u,(1+(u^-p-1)^(1-p))^(1/p),0));
? f(2)
%2 = 3.1415926535897932384626433832795028842
? Pi
%3 = 3.1415926535897932384626433832795028842
? solve(p=1,2,f(p)-3.2)
%4 = 1.6230023823844690096763253745604419761

p->2*intnum(u=0,1,(1+(u^-p-1)^(1-p))^(1/p))
Alephalpha

0

JavaScript (ES7), 80 Byte

Basierend auf der Antwort von orlp . Diese JS-Implementierung ist ziemlich langsam. Möglicherweise möchten Sie versuchen i=1e-7(oder sogar höher), eine schnellere Annäherung zu erreichen.

Hinweis : Dies ist grundsätzlich nur für Chrome und Edge vorgesehen. Eine vergleichbare ES6-Version unter Math.pow()Firefox 50.1 scheint viel langsamer zu sein.

Edit : Laut Neil sollte dies auch in Firefox 52 funktionieren.

f=
p=>{for(i=5e-8,s=x=0;(x+=i)<1;)s+=i*(x**(1-p)+(1-x)**(1-p))**(1/p);return 2/p*s}

console.log(f(1).toFixed(3))
console.log(f(2).toFixed(3))
console.log(f(1.623).toFixed(3))


Die ES7-Version wirkte ziemlich lebhaft, als ich sie mit Firefox 52 ausprobierte (ich habe sie nicht wissenschaftlich gemessen, aber sie fühlte sich ungefähr so ​​schnell an wie Chrome; Edge erstarrte bei mir).
Neil

@Neil Danke für dein Feedback. Entsprechend aktualisiert.
Arnauld
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.