Liczba pi i jej wyznaczanie

Stronę tą wyświetlono już: 869 razy

Któż nie zna starej dobrej stałej matematycznej π3,14159 26535 89793 23846 26433 83279 50288 41971 69399 37510..., ale cóż owa liczba oznacza? Oczywiście π to nic innego jak stosunek obwodu O okręgu do jego średnicy d. Pojawia się pytanie: jak można wyznaczyć liczbę π? Najstarszym sposobem jest zmierzenie za pomocą sznurka i linijki obwodu okręgu O oraz średnicy d i podzieleniu ich przez siebie w następujący sposób:

Równanie [1] [1]

Zapis wyrażenia w formacie TeX-a:

\pi=\frac{O}{d}

Wyznaczenie liczby π możliwe jest również przy użyciu wzoru Leibniz-a:

Równanie [2] [2]

Zapis wyrażenia w formacie TeX-a:

\pi=4\cdot\sum_{n=1}^{\infty }{\frac{\left(-1\right)^{n-1}}{2\cdot n-1}}=4\cdot\left(1-\frac{1}{3}+\frac{1}{5}-\frac{1}{7}+\frac{1}{9}-...\right)

Szereg [2] jest niestety wolno zbieżny, co oznacza, że aby obliczyć π z odchyleniem od rzeczywistej jej wartości mniejszym od 0.00001 trzeba zsumować aż 100 001 elementów tego szeregu. W ten sposób uzyskana liczba π ma wartość równą 3.14160265349 a jej odchylenie wynosi około 0.0000099999. Aby uzyskać większą dokładność, konieczne jest zliczenie znacznie większej liczby elementów szeregu potęgowego [2].

Listing 1
  1. // Kod programu liczącego liczbę <b>π</b> z zadanym odchyleniem maksymalnym z wykorzystaniem wzoru Leibniz-a
  2. #define _USE_MATH_DEFINES
  3. #include <math.h>
  4. #include <stdlib.h>
  5. #include <iostream>
  6. int main()
  7. {
  8. double pi = 0;
  9. int n = 1;
  10. double prec = 0;
  11. std::cout<<"Maksymalne odchylenie:";
  12. std::cin>>prec;
  13. while(abs(pi - M_PI) > prec){
  14. pi += 4 * (n % 2 == 0? -1.0: 1.0) / (2 * n - 1);
  15. printf("%.12f %.12f %i
  16. ",pi,abs(pi - M_PI),n);
  17. n++;
  18. }
  19. getchar();
  20. getchar();
  21. return 0;
  22. }

Liczbę π można obliczyć za pomocą szeregu aproksymującego obwód okręgu przy użyciu wielokątów foremnych. Wzór wyprowadzić można korzystając z rysunku 1.

Rysunek pomocniczy do wyprowadzenia wzoru aproksymującego obwód okręgu.
Rys. 1
Rysunek pomocniczy do wyprowadzenia wzoru aproksymującego obwód okręgu.

Podstawą do wyprowadzenia wzoru aproksymującego obwód okręgu o promieniu r jest kwadrat narysowany czerwonymi liniami na rysunku 1. Dla trójkąta prostokątnego ΔACO można obliczyć długość jego przeciwprostokątnej |AC|, która jest równa:

Równanie [3] [3]

Zapis wyrażenia w formacie TeX-a:

|AC|=r\cdot \sqrt{2}

Na podstawie tych danych, można obliczyć długość boku ośmiokąta foremnego opisanego na tym samym okręgu kolorem zielonym (rys. 1). Zacząć należy od wyznaczenia długości boku l2 trójkąta prostokątnego ΔBCO wykorzystując twierdzenie Pitagorasa:

Równanie [4] [4]

Zapis wyrażenia w formacie TeX-a:

l_2=\sqrt{r^2-\left(\frac{r\cdot\sqrt{2}}{2}\right)^2}

Dla dalszego uproszczenia sprawy, przyjmijmy wartość pomocniczą a1 równą:

Równanie [5] [5]

Zapis wyrażenia w formacie TeX-a:

a_1=r\cdot \sqrt{2}

Teraz wyrażenie [4] upraszcza się do następującej postaci:

Równanie [6] [6]

Zapis wyrażenia w formacie TeX-a:

l_2=\sqrt{r^2-\left(\frac{a_1}{2}\right)^2}

W celu wyznaczenia długości boku ośmiokąta foremnego konieczne jest wyznaczenie długości l1 boku trójkąta ΔBCD. Należy zauważyć, że suma długość l1+l2 jest równa promieniowi r okręgu, w związku z czym długość l1 można zapisać następującą zależnością:

Równanie [7] [7]

Zapis wyrażenia w formacie TeX-a:

l_1=r-l_2\Rightarrow l_1=r-\sqrt{r^2-\left(\frac{a_1}{2}\right)^2}

Ostatecznie więc długość boku |DC| ośmiokąta foremnego można obliczyć w następujący sposób:

Równanie [8] [8]

Zapis wyrażenia w formacie TeX-a:

|DC|=\sqrt{l_1^2+\left(\frac{a_1}{2}\right)^2}=\sqrt{\left(r-\sqrt{r^2-\left(\frac{a_1}{2}\right)^2}\right)^2+\left(\frac{a_1}{2}\right)^2}

Znając długość |DC| ośmiokąta, i przyjmując ją jako a1 można obliczyć długość boku szesnastokąta opisanego na tym samym okręgu, a więc wzór [8] można zapisać w postaci następującego ciągu liczbowego:

Równanie [9] [9]

Zapis wyrażenia w formacie TeX-a:

a_n=\sqrt{l_1^2+\left(\frac{a_{n-1}}{2}\right)^2}=\sqrt{\left(r-\sqrt{r^2-\left(\frac{a_{n-1}}{2}\right)^2}\right)^2+\left(\frac{a_{n-1}}{2}\right)^2}

ciąg ten opisuje długości boków wielokątów, których liczba boków jest dana następującą zależnością:

Równanie [10] [10]

Zapis wyrażenia w formacie TeX-a:

w=2^{n+1}

gdzie w oznacza liczbę boków, n oznacza numer elementu ciągu [9]. Mnożąc wyrażenie [10] przez wzór [9] otrzymuje się ciąg opisujący długość obwodu wielokątów danych zależnością [10] opisanych na tym samym okręgu o promieniu r. Wzór ten będzie miał więc ostatecznie następującą postać:

Równanie [11] [11]

Zapis wyrażenia w formacie TeX-a:

b_n=2^{n+1}\cdot\sqrt{\left(r-\sqrt{r^2-\left(\frac{a_{n-1}}{2}\right)^2}\right)^2+\left(\frac{a_{n-1}}{2}\right)^2}

Dla n→∞ bn=2·π·r, w związku z czym dla kolejnych elementów ciągu bn można uzyskać coraz to dokładniejszą wartość liczby π w następujący sposób:

Równanie [12] [12]

Zapis wyrażenia w formacie TeX-a:

c_n=\frac{2^{n+1}}{2\cdot r}\cdot\sqrt{\left(r-\sqrt{r^2-\left(\frac{a_{n-1}}{2}\right)^2}\right)^2+\left(\frac{a_{n-1}}{2}\right)^2}

Dla 24 elementu ciągu [12] uzyskuje się przybliżoną wartość liczby π = 3.14159265358979, któremu odpowiada 33 554 432-kąt foremny.

Listing 2
  1. #include <math.h>
  2. #include <conio.h>
  3. #include <iostream>
  4. typedef unsigned int UINT;
  5. void Approx(double &v,UINT &n,UINT &nb){
  6. v = sqrt(pow(1.0-sqrt(1.0-pow(v / 2.0, 2.0)),2.0)+pow(v / 2.0,2.0));
  7. nb++;
  8. if(n >= nb){
  9. Approx(v,n,nb);
  10. }
  11. }
  12. void Approx(double &v, UINT &n){
  13. UINT nb = 1;
  14. v = sqrt(2.0);
  15. if(n > 1){
  16. nb++;
  17. Approx(v, n, nb);
  18. }
  19. v *= pow(2.0,(double)nb) / 2.0;
  20. }
  21. int main()
  22. {
  23. UINT n = 0;
  24. double v = 0;
  25. std::cout<<"podaj numer elementu ciagu c_n:";
  26. std::cin>>n;
  27. Approx(v,n);
  28. char c[255];
  29. _gcvt(v,20,c);
  30. printf("%s",c);
  31. getch();
  32. getch();
  33. return 0;
  34. }

Kolejnym ciekawym sposobem wyznaczenia liczby π jest skorzystanie z prawdopodobieństwa przecięcia się igły o długości l z liniami równoległego podziału obszaru prostokątnego umieszczonych w odstępach równych t, takich że tl. Przykładowy podział obszaru oraz igieł: a przecinającej linię podziału i b nie przecinającej linii podziału można obejrzeć na rysunku 2.

Rysunek poglądowy konstrukcji umożliwiającej wyznaczenie liczby <b>π</b>.
Rys. 2
Rysunek poglądowy konstrukcji umożliwiającej wyznaczenie liczby π.

Rzucając N razy na obszar prostokątny podzielony jak na rysunku 2 można zliczyć liczbę przypadków n, w których rzucona igła przecięła się z którąkolwiek z linii podziału. Znając n i N można obliczyć prawdopodobieństwo przecięcia się igły z linią podziału według następującej zależności:

Równanie [13] [13]

Zapis wyrażenia w formacie TeX-a:

P=\frac{n}{N}

Przecięcie linii podziału przez igłę jest związane z dwoma czynniki: odległością środka igły xc od najbliższej linii podziału, oraz wartości mniejszego kąta nachylenia igły θ względem linii podziałowych. Przedział wartości, jakie może przyjmować parametr xc jest więc następujący:

Równanie [14] [14]

Zapis wyrażenia w formacie TeX-a:

x_c\in \left[0;\frac{t}{2}\right]

natomiast dla parametru θ dostępne są wartości z przedziału:

Równanie [15] [15]

Zapis wyrażenia w formacie TeX-a:

\theta\in \left[0;\frac{\pi}{2}\right]

Przedziały dla parametrów xc i θ wynikają z rysunku 3, i z wcześniej opisanych założeń dotyczących tych parametrów.

Rysunek pomocniczy, opisujący parametry <b>x<sub>c</sub></b> oraz <b>θ</b>.
Rys. 3
Rysunek pomocniczy, opisujący parametry xc oraz θ.

Rozważmy teraz, prawdopodobieństwo, że igła upadnie w dowolnej odległości xc od najbliższej linii podziału, zakładając, że igła nie może spaść poza obszarem rzutu. W takim przypadku prawdopodobieństwo powinno się równać 1, a więc powinna zostać spełniona następująca równość:

Równanie [16] [16]

Zapis wyrażenia w formacie TeX-a:

\int_0^{\frac{t}{2}}k_x, dx_c=1\Rightarrow k_x\cdot\left[x\ight]_0^{\frac{t}{2}}=1\Rightarrow k_x=\frac{2}{t}

gdzie: kx jest współczynnikiem prawdopodobieństwa.

W analogiczny sposób należy rozpisać równanie prawdopodobieństwa dla wszystkich dostępnych wartości parametru θ:

Równanie [17] [17]

Zapis wyrażenia w formacie TeX-a:

\int_0^{\frac{\pi}{2}}k_\theta, d\theta=1\Rightarrow k_\theta\cdot\left[\theta\right]_0^{\frac{\pi}{2}}=1\Rightarrow k_\theta=\frac{2}{\pi}

Ostatecznie więc funkcja prawdopodobieństwa, że odległość środka igły xc od najbliższej mu linii podziału będzie się zawierać w przedziale od x1 do x2 gdzie x1x2 oraz x10, x2t/2 przyjmuje następującą postać:

Równanie [18] [18]

Zapis wyrażenia w formacie TeX-a:

P=\int_{x_1}^{x_2}\frac{2}{t}, dx_c

natomiast funkcja prawdopodobieństwa, że kąt nachylenia igły θ zawiera się w przedziale od θ1 do θ2, gdzie θ1θ2 oraz θ1≥0, θ2π/2 przyjmuje następującą postać:

Równanie [19] [19]

Zapis wyrażenia w formacie TeX-a:

P=\int_{\theta_1}^{\theta_2}\frac{2}{\pi}, d\theta

Dla funkcji prawdopodobieństwa [17] szukamy takich wartości przedziałów x1 i x2, które dają możliwość przecięcia się igły z linią podziału. Przedział dolny x1 = 0 ponieważ w takiej sytuacji środek igły znajduje się na linii podziału, a więc igła ją przecina. Przedział górny x2 zależy od kąta θ nachylenia igły względem linii podziału w następujący sposób:

Równanie [20] [20]

Zapis wyrażenia w formacie TeX-a:

x_2=\frac{l}{2}\cdot \sin, \theta

Dla funkcji prawdopodobieństwa kąta nachylenia igły względem linii podziału przedział θ1 = 0, natomiast θ2 = π/2, ponieważ dla każdego kąta nachylenia igły możliwe jest zdarzenie polegające na jej przecięciu się z linią podziału.

Znając funkcje [18], [19] oraz wartości ich przedziałów, staje się możliwe napisanie funkcji prawdopodobieństwa przecięcia igły z linią podziału, która przyjmuje następującą postać:

Równanie [21] [21]

Zapis wyrażenia w formacie TeX-a:

P=\int_0^{\frac{\pi}{2}}\frac{2}{pi}\,d\theta\int_0^{\frac{l}{2}\cdot \sin\, \theta}frac{2}{t},dx_c=\int_0^{\frac{2}{\pi}}\frac{2}{\pi}\cdot\frac{2}{t}\cdot\left[x\right]_0^{\frac{l}{2}\cdot sin\, \theta}\,d\theta=frac{4}{\pi\cdot t}\cdot\int_0^{\frac{pi}{2}}\frac{l}{2}\cdot \sin\,\theta\,d\theta=\frac{2\cdot l}{\pi\cdot t}\cdot\left[-\cos\,\theta\right]_0^{\frac{\pi}{2}}=\frac{2\cdot l}{\pi \cdot t}\cdot \left(-\cos,\frac{\pi}{2}+\cos\,0\right)=\frac{2\cdot l}{\pi\cdot t}

Ostatecznie można więc przyrównać do siebie stronami równanie [13] i [21] w następujący sposób:

Równanie [22] [22]

Zapis wyrażenia w formacie TeX-a:

\frac{n}{N}=\frac{2\cdot l}{\pi\cdot t}

a po przekształceniu równania [22] otrzymujemy upragniony wzór wyznaczający π:

Równanie [23] [23]

Zapis wyrażenia w formacie TeX-a:

\pi=\frac{2\cdot l\cdot N}{t\cdot n}

Pozostaje już tylko wykonanie sporej liczby zdarzeń N w celu wyznaczenia liczby π, w czym może być pomocny poniższy kod programu:

Listing 3
  1. #include "stdafx.h"
  2. #include <conio.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5. #include <iostream>
  6. #include <time.h>
  7. #define AREA_WIDTH 100.0
  8. #define AREA_HEIGHT 100.0
  9. #define P 5.0
  10. double edge_length = AREA_WIDTH / P;
  11. typedef unsigned int UINT;
  12. double RandD(double max){
  13. return (double)rand() / (RAND_MAX + 1) * max;
  14. }
  15. void RandomEdge(double &x1,double &y1,double &x2,double &y2,double length){
  16. x1 = RandD(AREA_WIDTH);
  17. y1 = RandD(AREA_HEIGHT);
  18. do{
  19. x2 = rand() % (int)AREA_WIDTH;
  20. y2 = rand() % (int)AREA_HEIGHT;
  21. }while(x1 == x2 && y1 == y2);
  22. x2 -= x1;
  23. y2 -= y1;
  24. double l = sqrt(double(x2 * x2 + y2 * y2));
  25. x2 *= length / 2.0 / l;
  26. y2 *= length / 2.0 / l;
  27. double x, y;
  28. x = x1 + x2;
  29. y = y1 + y2;
  30. x1 = x1 - x2;
  31. y1 = y1 - y2;
  32. x2 = x;
  33. y2 = y;
  34. }
  35. bool HaveCross(double x1,double x2, double p){
  36. for(double i = 0; i <= AREA_WIDTH; i += AREA_WIDTH / p){
  37. if((x1 <= i && x2 >= i) || (x1 >= i && x2 <= i)){
  38. return true;
  39. }
  40. }
  41. return false;
  42. }
  43. int main(){
  44. time_t t;
  45. time(&t);
  46. srand(t);
  47. double x1 = 0, y1 = 0, x2 = 0, y2 =0;
  48. int n = 0;
  49. UINT nd = 0;
  50. std::cout<<"Podaj liczbę losowań:";
  51. std::cin>>nd;
  52. for(UINT N = 1; N < nd + 1; N++){
  53. RandomEdge(x1,y1,x2,y2,edge_length);
  54. if(HaveCross(x1, x2, P)){
  55. n++;
  56. }
  57. std::cout <<" pi = "<<(double)(2.0 * edge_length * (double)N) / (AREA_WIDTH / P * (double)n)<<" "<<N<<std::endl;
  58. }
  59. getch();
  60. getch();
  61. return 0;
  62. }

Mafijne powiązanie liczby π z liczbami pierwszymi

Euler, skubaniec jeden znalazł metodę na π obliczenie. I odkrył także tym samym przecie, że powiązana jest π jak Wiecie ze zbiorem P wszystkich liczb pierwszych. A wszystkie elementy P zbioru pierwszych są uporządkowane w sposób taki, że Pi<Pi+1. A teraz pozostaje zapisać wzór Eulera cały, co w sposób niesamowicie doskonały łączy liczby pierwsze z π nareszcie:

Równanie [24] [24]

Zapis wyrażenia w formacie TeX-a:

prod_{i=1}^{\infty}{\frac{1}{1-p_i^{-2}}}=\frac{1}{1-2^{-2}}\cdot\frac{1}{1-3^{-2}}\cdot\frac{1}{1-5^{-2}}\cdot\frac{1}{1-7^{-2}}\cdot\frac{1}{1-11^{-2}}\cdot,_{\cdots},=\frac{\pi^2}{6}

Przekształcenie wzoru tego pozostawiam Wam do wykonania samodzielnego.

A teraz gratka dla żądnych sławy i miliona dolarów na swawolne zabawy, bo otóż Riemann cwaniaczek jeden wziął Eulera wzór do siebie i przekształcił go w sposób następujący:

Równanie [25] [25]

Zapis wyrażenia w formacie TeX-a:

\zeta =\prod_{i=1}^{\infty}{\frac{1}{1-p_i^{s}}}

I męczą się srodze tęgie głowy naukowców co dzień, jak udowodnić lub obalić hipotezę Riemanna, lecz to wciąż zagadka jest uwikłana, zawiła strasznie, nie daje spokoju. Choć trudzą się mędrcy w pocie i znoju. Nikt nie udowodnił ani nie zaprzeczył, że Riemann bredził, twierdząc że wszystkie nietrywialne miejsca zerowe funkcji ζ leżą na jednej prostej zwanej krytyczną.

Inna postać Riemanna funkcji wygląda następująco:

Równanie [26] [26]

Zapis wyrażenia w formacie TeX-a:

\zeta=\prod_{i=1}^{\infty}{\frac{1}{i^{s}}}

I dla s=2 funkcja ta przyjmuje wartość taką samą jak w przypadku równania [24]. Czyli znów wzór na π liczbę żeśmy wytrząsnęli.

Komentarze