IOS 萊布尼茨公式計算圓周率π

圓周率其實就是一個圓周長與直徑的比值我們通常用希臘字母π表示, 他的計算公式有多種, ?其中用萊布尼茨公式是這樣

 \frac{π}{4} = \frac{1}{1} -  \frac{1}{3} +   \frac{1}{5} - \frac{1}{7} + \frac{1}{9} ......??即: ?\frac{π}{4} = \sum_{n=0}^∞ \frac{(-1)^n }{1 + 2n}  ? ?

如果你想知道為什么? ?既然你誠心誠意的發(fā)問了, ?我就大發(fā)慈悲的告訴你!?

首先看一下等比數(shù)列求和公式

S_{n} ?= n_{} ?\times ?a_{1} ?(q = 1)

S_{n} ?=?a_{1} ?\times ?\frac{1-q^n }{1-q} ?=?\frac{a_{1} - a_{n} \times  q }{1- q } ? (q \neq 1)

那么針對于下面的等比數(shù)列, 我們先證明下這個公式

1 + x^1 + x^2 + x^3 + ... + x^n =  \frac{1-x^{n+1}}{1-x}

針對于上面公式我們可看到當n趨向于無窮大, x\in ?(-1, 1) 時, 上面可以寫成

1 + x + x^2 + x^3 + ... + x^n  = \frac{1}{1-x}

我們令?x?=?-x^2 ?帶入上方公式可得

1 - x^2 + x^4  - x^6 + ...  =  \frac{1}{1 + x^2}

兩邊積分可得

 x + \frac{x^3 }{3} + \frac{x^5 }{5} + \frac{x^7 }{7}   ...  =  arctan(x) ?(\tan ^{-1}  x )?

此時, 我們將 x = 1?帶入 可得

1 - \frac{1 }{3} + \frac{1 }{5} - \frac{1 }{7}   ...  =  arctan(1) = \frac{π}{4}

我們便得到了萊布尼茨公式, 但是有些心細的人可能注意到了 ?你 x = 1?并不在?x \in  (-1, 1)?區(qū)間啊

接下來我們就證明 當?x = 1 ?時 上面 收斂于arctan(1)?即可

我們現(xiàn)在已知?1 - x^2 + x^4  - x^6 + ...  =  \frac{1}{1 + x^2} ??x \in  (-1, 1)

對于上面等比數(shù)列, 我們對 n+1 項求和可得

\frac{1-(-1)^{n+1}x^{2n+2} }{1+x^2 }  = \frac{1}{1+x^2} ?即?\frac{1}{1+x^2} - \frac{(-1)^{n+1}x^{2n+2} }{1+x^2 }  = \frac{1}{1+x^2}

我們把減項移到左邊可得

1 - x^2 + x^4  - x^6 + ...  +{-1}^nx^{2n}   + \frac{(-1)^{n+1}x^{2n+2} }{1+x^2 }   =  \frac{1}{1 + x^2} ?? x \in  (-1, 1)

我們對上面等式做 0到1上積分可得

1 - \frac{1}{3}  + \frac{1}{5} -  \frac{1}{7} + ...\frac{-1^n }{2n+1}  + (-1)^{n+1} \int_{0}^{1} \frac{x^{2n+2}}{1+x^2} dx = \frac{π}{4}

接下來我們只需證明當?n \rightarrow ∞?最后一項為0 即可

0\leq \int_{0}^{1} \frac{x^{2n+2}}{1+x^2} dx\leq \int_{0}^{1} \ x^{2n+2} dx = \frac{1}{2n+3} \rightarrow 0

所以我們證明出π的萊布尼茨公式成立

接下來我們用OC 和 Swift 寫下這個公式, 即計算下π, ?兩邊乘4可得

π = \frac{4}{1} -   \frac{4}{3} +  \frac{4}{5} - \frac{4}{7} ....? 我們可以直接對這個無窮序列進行建模,?

我們可看到 分子是4, 分母為 首項為1, 公差 為2 的等差數(shù)列, ?同時還需留意每一項需要乘上?-1^n ?(這里我默認首項 index為0)

OC寫法:

```

- (CGFloat)calculatePi:(NSInteger)position{

? ? NSInteger num4 = 4;

? ? CGFloat series = 1;

? ? NSInteger pro = 1;

? ? CGFloat result = 0;

? ? for(NSInteger i = 0; i < position; i++){

? ? ? ? result +=? pro * (num4 / series);

? ? ? ? series += 2;

? ? ? ? pro *= -1 ;

? ? }

? ? return result;

}

```


調用, 當我們執(zhí)行50000次時候

CGFloat result = [self calculatePi: 50000];

NSLog(@"返回結果: %f", result);

返回結果: 3.141573

當次數(shù)趨近無窮大時候, 結果趨近于π


Swift寫法:

```

func calculatePi(position: NSInteger) -> CGFloat {

? ? ? ? let num4: CGFloat = 4;

? ? ? ? var series: CGFloat = 1;

? ? ? ? var pro: CGFloat = 1;

? ? ? ? var result: CGFloat = 0;

? ? ? ? for _ in 0..<position {

? ? ? ? ? ? result +=? pro * (num4 / series);

? ? ? ? ? ? series += 2;

? ? ? ? ? ? pro *= -1 ;

? ? ? ? }

? ? ? ? return result;

? ? }

```


附:?

同樣執(zhí)行1,000,000 次打印

swift執(zhí)行速度為13s左右, ?而OC執(zhí)行為2分15秒左右, 可見swift運行效率非??? ?而且精度swift更高一些

OC, 可見swift運行效率更高一些

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容