P = i = 3.2


37

Infinite Series 의이 비디오에서 영감을 얻었습니다 .

소개

Pi는 원주와 원주의 비율로 정의됩니다. 그러나 원은 어떻게 정의됩니까? 일반적으로 원은 중심점까지 일정한 거리를 갖는 점으로 정의됩니다 (중심이에 있다고 가정하자 (0,0)). 다음 질문은 : 거리를 어떻게 정의 하는가? 다음에서는 거리의 다른 개념을 고려하고 있습니다 ( Lp-norms 에 의해 유발 됨).

표준 (= 길이 를 측정하는 것)이 주어지면 다음과 같이 거리 (= 두 점 사이 의 거리 )를 쉽게 구성 할 수 있습니다 .

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

유클리드 표준은 다음과 같습니다.

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

이것을 L2-norm 이라고도합니다 . 다른 Lp- 노름2위의 공식에서 1과 무한대 사이의 다른 값 으로 대체하여 구성됩니다 .

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

서로 다른 규범의 단위 원은 매우 다른 모양을 가지고 있습니다.

도전

주어진 경우 p >= 1, 4 개의 유효 숫자의 정확도로-노름 에 대한 Lp- 원의 직경 대 원주의 비율을 계산합니다 Lp.

테스트 케이스

우리가 사용할 수있는 위해 p,q1 = 1/p + 1/q우리가 동일한 비율을 얻을 Lp아니라 한 Lq표준. 또한 대한 p = q = 2비율을 최소화하고, 대한 p = 1, q = infinity비율 사이에 항상 있도록, 4의 비율을 얻을 pi하고 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
모양은 Lamé 곡선 또는 초박형으로 알려져 있으며 규범 자체가 (삼각형 불평등을 위반하기 때문에) 자체가 아니더라도 0 < p <1에도 존재합니다 . 수퍼 타원에 대한 Wikipedia 기사에는 해당 영역에 대한 닫힌 양식이 포함되어 있습니다.
Neil

@Neil 그러나 우리는 원호 길이 적분을 통해서만 계산할 수있는 영역이 아니라 원주를 고려해야합니다.
flawr

7
죄송합니다. 제가 글을 다 읽었을 때 질문이 무엇을했는지 잊어 버렸습니다.
Neil

2
사랑스러운 도전!
Luis Mendo

1
면적 공식 ( A = πr²)은 다음과 같은 특징을 갖지 않습니다.p ≠ 2
Mego

답변:


12

파이썬 + scipy, 92 바이트

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

공식은 이 math.SE 질문에서 입니다.


이 접근법으로 구현을 테스트 할 때의 특이점으로 인해 해당 접근법의 수렴에 문제가있었습니다. x=1의 제출은 어떻게 이루어 집니까?
flawr

Scipy는 Python 표준 라이브러리의 일부가 아닙니다. 아마도 Sage로 바꾸시겠습니까?
busukxuan

2
@busukxuan PPCG에는 표준 라이브러리 만 사용할 수있는 요구 사항이 없습니다. 어쨌든 제목에서 언급하겠습니다.
orlp

1
@ChristianSievers 나는 다른 사람의 닫힌 공식을 사용하는 것에 대한 나쁜 느낌을 피하기 위해 내 자신의 통합을했습니다 :-P
Luis Mendo

1
@ChristianSievers 나는 또한 당신이 관심이
있다면

10

MATL , 31 바이트

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

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

설명

이렇게 생성 X , Y 단계 0.001 1,001 포인트에서 샘플링 된 단위 원의 1/4의 좌표 (X)를 . 원의 1/4 길이는 해당 점을 통과하는 다각형 선의 길이와 비슷합니다. 즉, 1000 세그먼트 길이의 합입니다. 길이는 물론 p-norm 에 따라 계산됩니다 . 결과에 2를 곱하면 대략 반원의 길이, 즉 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 바이트

alephalpha 로 인해 3 바이트가 절약되었습니다 .

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

익명의 기능. 숫자를 입력으로 받아서 숫자를 출력으로 반환합니다.


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

5

PARI / GP, 48 43 바이트

@orlp가 공식을 찾은 후에는 쉬우 며 @alephalpha의 버전은 5 바이트를 절약합니다.

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

약간 유용한 것을 추가하기 p위해 우리가 얻는 것을 계산해 봅시다 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

올바른 사용법

코드가 챌린지 요구보다 훨씬 정확한 결과를 제공하지만 쉽게 개선 할 수 있습니다. 만약 우리가 통합 상한 1[1,1/p-1](수동으로 특이점 지수라고 부르는 것)으로 바꾸면 표시된 모든 숫자가에 f(2)동의합니다 Pi. 정밀도를 100 (type \p100)으로 늘리면 여전히 그렇습니다 .

그러나 그 변경 후에는 solve계산이 더 이상 작동하지 않았습니다. 내부 용어를 명시 적으로 처리하고 u=0새로운 PARI 버전과 64 비트 (기본 정밀도가 높음)가있는 다른 컴퓨터로 변경했습니다.

에 대한 향상된 p값 계산은 다음과 같습니다 Pi=3.2. 실제 Pi도 살펴 보겠습니다.

? 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

자바 스크립트 (ES7), 80 바이트

orlp의 답변을 기반으로 합니다. 이 JS 구현은 매우 느립니다. i=1e-7더 빠른 근사를 위해 시도 하거나 더 높은 값을 원할 수도 있습니다 .

참고 : 기본적으로 Chrome 및 Edge 전용입니다. Math.pow()Firefox 50.1에서 사용하는 동등한 ES6 버전 은 훨씬 느려 보입니다 .

편집 : Neil에 따르면 Firefox 52에서도 제대로 작동합니다.

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 버전은 Firefox 52를 사용하여 시도했을 때 꽤 놀랍게 보였습니다 (과학적으로 측정하지는 않았지만 Chrome과 거의 같은 속도를 느꼈습니다. 가장자리가 얼어 붙었습니다).
Neil

귀하의 의견에 감사드립니다. 이에 따라 업데이트되었습니다.
Arnauld 2012 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.