一个有趣的圆周率计算公式 x=sin(x)+x

读图模式

一个有趣的圆周率计算公式
设初值x=3(任取接近π的值,2,3.14 都可以)
循环计算:x=sin(x)+x
用计算器或电脑的double型计算这个公式,迭代3~4次就达到极限了,我背得出来的就比计算器的精度还高
真正要计算的话,需要大数的计算工具,我自己开发过一个,有需要源码的可以问我要,
事实上我就是用这个公式计算圆周率来验证我的计算工具是否正确。
下面是推导过程,不严谨,意思到了

(上图)由三角函数性质可知:当θ->π时,sin(θ)->π-θ,函数y=sin(x) -> y=π-x

也可以表达为在π附近,y=sin(x) = π-x*D,(x->π,D->1) D为趋向于1的误差

上图蓝线部分为sin(x),≈绿线部分(π-x),就可以通过迭代计算x=sin(x)+x,逼近π

设初值x=3(任取接近π的值,2,3.14 都可以)
循环计算:x=sin(x)+x
每计算一次,x趋向于π,精度翻倍

根据泰勒级数计算sin(x)

每次迭代,需要1次除法,3次乘法,3次加法,每次计算可以获得2~3位十进制精度

梅钦类公式中使用的arctan的缺陷是收敛速度太慢,特别是当x较大时,被除数部分是线性增大,而sin是阶乘,比arctan收敛快得多,需要计算的项就少得多

在想到这个公式后,就在网上搜索了相关的圆周率计算公式,和计算历史,愣是没找到和这个公式相关的算法
这个算是原创吧
在牛顿时代就有能力计算正弦值了,为什么那些数学大佬没想到这个算法呢?

评论 (18) 只看楼主

全部评论

  • 1楼
    2014-07-14 14:36 方弦 科学松鼠会成员,信息学硕士生 只看Ta

    很简单,因为实际上不可行。

    sin的泰勒级数是在0附近才收敛的,在pi附近不收敛,所以不能直接套用泰勒公式。如果利用sin的性质,将pi附近的计算转移到0附近的话,那需要用到pi本身,也不科学。

    [0] |
  • 2楼
    2014-07-14 15:00 abiao_47231 只看Ta

    我发现这个算法是巧合:拿计算器乱按的(sin(3)=3.14.....,sin(3.14)=3.14159........)

    不过推导的过程应该是基本正确的

    事实上我就是用这个公式计算圆周率来验证我的计算工具是否正确。也的确是可用的。

    我拿算出的Pi和标准Pi做过比较,一般的电脑1分钟就可以算到万位左右了。

    [0] |
  • 3楼
    2014-07-14 15:04 abiao_47231 只看Ta

    “sin的泰勒级数是在0附近才收敛的,在pi附近不收敛”

    这不对吧,sin(3),sin(3.14),sin(3.1415...)就没法通过泰勒级数计算了?

    和事实不符啊,自己算下就知道了啊,在Pi附近还特别收敛呢。

    [0] |
  • 4楼
    2014-07-14 15:44 小学已毕业 只看Ta

    x接近π时,sin(π-x)=π-x

    又sin(x)=sin(π-x)

    [0] |
  • 6楼
    2014-07-14 16:05 方弦 科学松鼠会成员,信息学硕士生 只看Ta
    引用@abiao_47231 的话:“sin的泰勒级数是在0附近才收敛的,在pi附近不收敛” 这不对吧,sin(3),sin(3.14),sin(3.1415...)就没法通过泰勒级数计算了? 和事实不符啊,自己算下就知道了啊,在Pi附...

    泰勒级数的定义本来就是展开的点附近才准确,否则可能不收敛的,有一个收敛半径。

    [0] |
  • 7楼
    2014-07-14 16:57 13班制作人 只看Ta

    sin(x)的泰勒级数的收敛半径是正无穷

    [1] |
  • 8楼
    2014-07-14 17:39 方弦 科学松鼠会成员,信息学硕士生 只看Ta
    引用@13班制作人 的话:sin(x)的泰勒级数的收敛半径是正无穷

    嗯,的确这个是,我之前搞错了。

    那么大概可以算一下计算量,我感觉还是不小的……现在基本上算pi都用超几何级数了吧……

    [1] |
  • 9楼
    2014-07-14 17:55 dwdwccc 只看Ta

    。就是cot(x/2)求零点的牛顿法。。每个 2k*pi到2(k+1)pi的初值可以得到(2k+1)*pi的解。。

    [0] |
  • 10楼
    2014-07-14 18:10 abiao_47231 只看Ta

    当然这不是最快的算法,甚至不算很快的算法,现在提这个除了教学没什么价值了

    我只是奇怪,推导过程这么简单,为什么前人没有想到过?

    计算速度也比梅钦公式快多了

    [0] |
  • 11楼
    2014-07-20 12:54 阿尔吉农 只看Ta

    这不就是不动点迭代求sin x=0在3附近的根吗?你以为古人很容易求sin x……

    [1] |
  • 12楼
    2014-07-21 10:10 abiao_47231 只看Ta

    牛顿就会算啊,泰勒级数发明后就更系统化了,这个算法应该不难想到

    再说,梅钦公式也要求arctan的值的,一样要用级数来计算的,sinx要计算的项比arctan少得多

    [0] |
  • 13楼
    2014-07-21 19:54 黎曼球面 只看Ta

    牛顿切线法就可以推出

    [0] |
  • 15楼
    2014-07-24 23:58 XiangYu16 只看Ta


    引用@方弦 的话:很简单,因为实际上不可行。 sin的泰勒级数是在0附近才收敛的,在pi附近不收敛,所以不能直接套用泰勒公式。如果利用sin的性质,将pi附近的计算转移到0附近的话,那需要用到pi本身,也不科学。

    学过实分析么?

    sin x的定义就是右边的幂级数


    幂级数\sum_{n=0}^{\infty} \frac{(-1)^n}{(2n+1)!}x^{2n+1}的收敛半径是\infty,对每个x\in R,此幂级数都是绝对收敛的,因为这一点,sin x就定义为此幂级数的和,于是sin x是R上实解析的函数,且对于每个x\in R 幂级数都是收敛到sin x

    [0] |
  • 16楼
    2014-07-25 07:36 方弦 科学松鼠会成员,信息学硕士生 只看Ta
    引用@XiangYu16 的话: 学过实分析么? sin x的定义就是右边的幂级数 幂级数\sum_{n=0}^{\infty} \frac{(-1)^n}{(2n+1)!}x^{2n+1}的收敛半径是\infty,对每个x\...

    ……这是复分析……而且后来已经有人说了这个问题,我也更正了……看贴请看完……

    [1] |
  • 17楼
    2014-11-26 08:12 DONOBB 只看Ta
    引用@小学已毕业 的话:x接近π时,sin(π-x)=π-x又sin(x)=sin(π-x)

    这是对的

    来自果壳网移动版
    [0] |
  • 18楼
    2017-07-14 09:15 氢氧化钠是强酸 只看Ta
    引用@方弦 的话:很简单,因为实际上不可行。sin的泰勒级数是在0附近才收敛的,在pi附近不收敛,所以不能直接套用泰勒公式。如果利用sin的性质,将pi附近的计算转移到0附近的话,那需要用到pi本身,也不科学。

    亲,sin兀=0

    [0] |
  • 19楼
    2017-07-14 14:22 叶迎风 只看Ta

    去他娘的敏感词!

    [0] |
  • 21楼
    2017-07-14 14:35 叶迎风 只看Ta
    引用@叶迎风 的话:去他娘的敏感词2

    [0] |

最新帖子

关于我们 加入果壳 媒体报道 帮助中心 果壳活动 家长监控 免责声明 联系我们 移动版 移动应用

©果壳网    京ICP证100430号    京网文[2018] 6282-492号    新出发京零字第朝200003号     京公网安备11010502007133号

违法和不良信息举报邮箱:jubao@guokr.com    举报电话:18612934101    网上有害信息举报专区    儿童色情信息举报专区