IOS 莱布尼茨公式计算圆周率π

2020-06-09  本文已影响0人  ShawnAlex

圆周率其实就是一个圆周长与直径的比值我们通常用希腊字母π表示, 他的计算公式有多种,  其中用莱布尼茨公式是这样

 \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}     

如果你想知道为什么?  既然你诚心诚意的发问了,  我就大发慈悲的告诉你! 

首先看一下等比数列求和公式

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)

那么针对于下面的等比数列, 我们先证明下这个公式

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) 区间啊

接下来我们就证明 当 x = 1  时 上面 收敛于arctan(1) 即可

我们现在已知 1 - x^2 + x^4  - x^6 + ...  =  \frac{1}{1 + x^2}   x \in  (-1, 1)

对于上面等比数列, 我们对 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 的等差数列,  同时还需留意每一项需要乘上 -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;

}

```

调用, 当我们执行50000次时候

CGFloat result = [self calculatePi: 50000];

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

返回结果: 3.141573

当次数趋近无穷大时候, 结果趋近于π

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;

    }

```

附: 

同样执行1,000,000 次打印

swift执行速度为13s左右,  而OC执行为2分15秒左右, 可见swift运行效率非常快,  而且精度swift更高一些

OC, 可见swift运行效率更高一些

上一篇 下一篇

猜你喜欢

热点阅读