P i = = 3. 2


37

Lấy cảm hứng từ video này của Infinite Series .

Giới thiệu

Pi được định nghĩa là tỷ lệ của chu vi với đường kính của một vòng tròn. Nhưng một vòng tròn được định nghĩa như thế nào? Thông thường một vòng tròn được định nghĩa là các điểm có khoảng cách không đổi đến điểm trung tâm (chúng ta hãy giả sử rằng tâm nằm ở(0,0) ). Câu hỏi tiếp theo sẽ là: Làm thế nào để chúng ta xác định khoảng cách ? Sau đây chúng tôi đang xem xét các khái niệm khác nhau về khoảng cách (gây ra bởi Lp-norms):

Đưa ra một định mức (= cái gì đó đo chiều dài ) chúng ta có thể dễ dàng xây dựng một khoảng cách (= khoảng cách giữa hai điểm) như sau:

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

Định mức euclide được đưa ra bởi:

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

Điều này cũng được gọi là định mức L2 . Các chỉ tiêu Lp khác được xây dựng bằng cách thay thế2 công thức trên bằng các giá trị khác trong khoảng từ 1 đến vô cùng:

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

Các vòng tròn đơn vị cho các chỉ tiêu khác nhau có hình dạng khá khác biệt:

Thử thách

Cho a p >= 1, tính tỷ lệ chu vi với đường kính của vòng tròn Lp đối với Lp-norm với độ chính xác là bốn con số có ý nghĩa.

Tủ thử

Chúng tôi có thể sử dụng cho p,qvới 1 = 1/p + 1/qchúng tôi nhận được tỷ lệ tương tự cho các Lpcũng như các Lqchuẩn mực. Hơn nữa p = q = 2, tỷ lệ này là tối thiểu và đối với p = 1, q = infinitychúng tôi có tỷ lệ là 4, vì vậy các tỷ lệ luôn nằm giữa pi4.

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
Các hình dạng được gọi là đường cong Lamé hoặc siêu sao và tồn tại với 0 < p <1, mặc dù bản thân định mức không (vì nó vi phạm bất đẳng thức tam giác). Bài viết Wikipedia cho siêu sao bao gồm một hình thức đóng cho khu vực.
Neil

@Neil Tuy nhiên, chúng tôi cần xem xét chu vi, không phải diện tích, mà theo như tôi biết - chỉ có thể được tính thông qua tích phân độ dài cung.
flawr

7
Xin lỗi, đến lúc tôi đọc xong chúng tôi đã quên câu hỏi đã hỏi.
Neil

2
Thử thách đáng yêu!
Luis Mendo

1
Thật thú vị khi lưu ý rằng công thức khu vực ( A = πr²) không áp dụng chop ≠ 2
Mego

Câu trả lời:


12

Python + scipy, 92 byte

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

Công thức là từ câu hỏi toán học này .


Khi thử nghiệm một triển khai với thẩm định này, tôi đã gặp rắc rối với sự hội tụ của phương pháp đó, do sự kỳ dị tại x=1, trình của bạn làm như thế nào?
flawr

Scipy không phải là một phần của thư viện chuẩn Python. Có lẽ chuyển sang Sage?
busukxuan

2
@busukxuan Không có yêu cầu nào về PPCG cho phép bạn chỉ sử dụng các thư viện tiêu chuẩn. Nhưng tôi sẽ đề cập đến nó trong tiêu đề.
orlp

1
@ChristianSievers Tôi đã thực hiện việc tích hợp của riêng mình để tránh cảm thấy tồi tệ khi sử dụng công thức đóng của người khác :-P
Luis Mendo

1
@ChristianSievers Tôi thực sự cũng đã bao gồm một formla khác trong hộp cát, trong trường hợp bạn quan tâm =)
flawr

10

MATL , 31 byte

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

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

Điều này tạo ra tọa độ x , y của một phần tư vòng tròn đơn vị được lấy mẫu tại 1001 điểm với bước 0,001 trong x . Độ dài của một phần tư vòng tròn được tính gần đúng bằng đường thẳng đa giác đi qua các điểm đó; đó là tổng độ dài của 1000 đoạn. Độ dài tất nhiên được tính theo p-norm. Nhân kết quả với 2 sẽ cho chiều dài gần đúng của nửa vòng tròn, nghĩa là 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

Toán học, 49 46 byte

3 byte được lưu do alephalpha .

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

Chức năng ẩn danh. Lấy một số làm đầu vào và trả về một số làm đầu ra.


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

5

PARI / GP, 48 43 byte

Thật dễ dàng sau khi @orlp tìm thấy công thức và phiên bản của @ alephalpha tiết kiệm 5 byte:

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

Để thêm một cái gì đó hơi hữu ích, hãy tính toán những pgì chúng ta nhận được 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

Cách sử dụng đúng

Mặc dù mã cho kết quả chính xác hơn nhiều so với yêu cầu thách thức, nhưng nó có thể dễ dàng được cải thiện rất nhiều: nếu chúng ta thay thế giới hạn tích hợp trên 1bằng [1,1/p-1](đưa ra cái mà hướng dẫn gọi là số mũ số ít) thì tất cả các chữ số hiển thị f(2)đều đồng ý Pi. Điều này vẫn đúng nếu chúng ta tăng độ chính xác lên 100 (loại \p100).

Tuy nhiên, sau đó thay đổi solvetính toán không còn hoạt động. Tôi đã thay đổi thuật ngữ bên trong để xử lý rõ ràng trường hợp u=0và cũng thay đổi sang một máy tính khác với phiên bản PARI mới hơn và 64 bit (ngụ ý độ chính xác mặc định cao hơn).

Dưới đây là tính toán được cải thiện của pgiá trị cho Pi=3.2và chúng ta cũng hãy xem Pi thực:

? 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

Dựa trên câu trả lời của orlp . Việc triển khai JS này khá chậm. Bạn có thể muốn thử i=1e-7(hoặc thậm chí cao hơn) để có xấp xỉ nhanh hơn.

Lưu ý : Điều này về cơ bản chỉ dành cho Chrome và Edge. Một phiên bản ES6 tương đương sử dụng Math.pow()trên Firefox 50.1 dường như chậm hơn nhiều .

Chỉnh sửa : Theo Neil, điều này cũng sẽ hoạt động tốt trên 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))


Phiên bản ES7 có vẻ khá ổn khi tôi dùng thử Firefox 52 (Tôi không đo lường một cách khoa học, nhưng nó có tốc độ tương đương với Chrome; Edge đóng băng với tôi).
Neil

@Neil Cảm ơn phản hồi của bạn. Cập nhật cho phù hợp.
Arnauld
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.