P i = = 3, 2


37

Infinite Serisinin bu videosundan ilham alındı .

Giriş

Pi, çevrenin bir dairenin çapına oranı olarak tanımlanmaktadır. Fakat bir daire nasıl tanımlanır? Genellikle bir daire, merkez noktasına sabit mesafeli noktalar olarak tanımlanır (merkezin açık olduğunu varsayalım (0,0)). Bir sonraki soru şudur: Mesafeyi nasıl tanımlarız ? Aşağıda, farklı mesafeler kavramlarını düşünüyoruz ( Lp-normlar tarafından uyarıldı):

Bir norm verildiğinde (= uzunluğu ölçen bir şey ) aşağıdaki gibi kolayca bir mesafe (= iki nokta arasındaki mesafe) oluşturabiliriz:

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

Öklid normuna göre:

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

Buna L2-normu da denir . Diğer Lp-normları2 , yukarıdaki formüldeki 1 ile sonsuz arasındaki diğer değerler ile değiştirilerek oluşturulur :

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

Bu farklı normlar için birim daireler oldukça belirgin şekillere sahiptir:

Meydan okuma

A göz önüne alındığında p >= 1, çevrenin bir Lp dairenin çapına oranını Lp-norm açısından dört anlamlı rakamın kesinliği ile hesaplayın.

testcases

Bunu , norm için olduğu kadar aynı orana p,qsahip 1 = 1/p + 1/qolduğumuz için kullanabiliriz . Ayrıca , oran minimumdur ve 4 oranını alırsak, oranlar her zaman ve arasındadır .LpLqp = q = 2p = 1, q = infinitypi4

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
Şekiller, Lamé eğrileri veya süper elipsler olarak bilinir ve normun kendisi olmasa da (üçgenin eşitsizliğini ihlal ettiği için) 0 < p <1 için de bulunur. Süper elip için Wikipedia makalesi, alan için kapalı bir form içerir.
Neil

@ Neil Ancak çevreyi, bildiğim kadarıyla sadece bir yay uzunluğu integrali ile hesaplanabilecek alanı değil, dikkate almamız gerekir.
kusur,

7
Üzgünüm, onlara okuduğumda, sorunun ne istediğini unuttum.
Neil

2
Güzel meydan okuma!
Luis Mendo,

1
Alan formülünün ( A = πr²) geçerli olmadığına dikkat çekmek ilginçtirp ≠ 2
Mego

Yanıtlar:


12

Python + scipy, 92 bayt

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

Formül bu matematikten geliyor .


Bu appraoch ile bir uygulama test ederken nedeniyle de tekillik, yani yaklaşımın yakınlaşma zorlandığı x=1gönderiminiz nasıl yapar?
kusur,

Scipy, Python standart kütüphanesinin bir parçası değildir. Belki Sage'e geçmelisin?
busukxuan

2
@busukxuan PPCG'de yalnızca standart kitaplıkları kullanmanızı sağlayan bir gereklilik yoktur. Ama yine de başlıkta bahsedeceğim.
orlp

1
@HristianSievers Başkasının kapalı formülünü kullanmaktan kötü hissetmekten kaçınmak için kendi entegrasyonumu yaptım:
Luis Mendo

1
@ChristianSievers Ayrıca , ilgileniyorsanız sandbox'a başka bir formla ekledim =)
kusur

10

MATL , 31 bayt

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

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

açıklama

Bu , 1001 noktadan örneklenen birim çemberin dörtte birinin x , y koordinatlarını x 0.001 ile oluşturur . Çemberin çeyreğinin uzunluğu, bu noktalardan geçen poligonal çizginin uzunluğu ile yaklaşık olarak hesaplanır; yani, 1000 segmentin uzunluklarının toplamıdır. Uzunluk elbette p-norm'a göre hesaplanır . Sonucu 2 ile çarpmak, yarım dairenin yaklaşık uzunluğunu verir, yani 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 bayt

Halep nedeniyle 3 bayt kurtarıldı .

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

Anonim işlev Girdi olarak bir sayı alır ve çıktı olarak bir sayı döndürür.


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

5

PARI / GP, 48 43 bayt

@ Orlp formülü bulduktan sonra kolaydır ve @ alephalpha'nın sürümü 5 bayt kazandırır:

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

Biraz yararlı bir şeyler eklemek piçin, alacağımız şeyi hesaplayalım 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

Doğru kullanım

Kod çok daha kesin meydan taleplerine daha sonuçlar verirken, kolayca çok geliştirilebilir: Biz üst entegrasyon sınırını değiştirirseniz 1ile [1,1/p-1]daha sonra tüm rakamları gösterilmiştir (manuel aramalar tekillik üs neyi vererek) f(2)ile kabul Pi. Hassasiyeti 100'e (tür \p100) yükseltirsek, bu hala geçerlidir .

Ancak, bu değişiklikten sonra solvehesaplama artık işe yaramadı. Davayı açıkça ele almak için iç terim u=0değişti ve ayrıca daha yeni bir PARI sürümü ve 64 bit olan (daha yüksek bir varsayılan hassasiyet anlamına gelen) farklı bir bilgisayara geçtim.

İşte, pdeğerin iyileştirilmiş hesaplaması Pi=3.2ve gerçek Pi'ye bir bakalım:

? 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 bayt

Orlp'nin cevabına dayanarak . Bu JS uygulaması oldukça yavaştır. Daha i=1e-7hızlı bir yaklaşım için denemek isteyebilirsiniz (veya daha yüksek).

Not : Bu temelde yalnızca Chrome ve Edge için tasarlanmıştır. Math.pow()Firefox 50.1'de kullanılan eşdeğer bir ES6 sürümü çok daha yavaş görünüyor .

Düzenleme : Neil'e göre, bu Firefox 52'de de iyi çalışmalı.

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))


ES7 sürümü Firefox 52 kullanarak denediğimde oldukça dikkat çekici görünüyordu (bilimsel olarak ölçmedim ama Chrome ile aynı hızda hissettim; Edge üzerime dondu).
Neil

@Neil Geri bildiriminiz için teşekkür ederiz. Buna göre güncellendi.
Arnauld
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.