官术网_书友最值得收藏!

實驗4 超越祖沖之

簡介

中國數(shù)學(xué)家劉徽在注釋《九章算術(shù)》(公元263年)時只用圓內(nèi)接正多邊形就求得π的近似值,也得出精確到兩位小數(shù)的π值,他的方法被后人稱為割圓術(shù)。他用割圓術(shù)一直算到圓內(nèi)接正192邊形。

南北朝時代的數(shù)學(xué)家祖沖之(公元429年—公元500年)進一步得出精確到小數(shù)點后7位的π值(約5世紀(jì)下半葉),給出不足近似值3.1415926和過剩近似值3.1415927,還得到兩個近似分?jǐn)?shù)值,密率355/113和約率22/7。其中,密率在西方直到公元1573年才由德國人奧托得到,并于1625年發(fā)表于荷蘭工程師安托尼斯的著作中,歐洲稱之為安托尼斯率。

計算機的快速發(fā)展使π的精度越來越高,那么怎么通過計算機計算π值呢?在上一個實驗當(dāng)中,N個線段畫出了一個圓形,所以可以把這些線段的總長度除以圓的直徑,得出π的大小。

使用公式:

π=C /d

其中,C是圓的周長,d是圓的直徑。

在支持HTML5的瀏覽器里運行下面代碼:

        <canvasid="myCanvas"width="480"height="300"style="border: 1px solid #c3c3c3;">
        Your browser does not support the canvas element.
        </canvas>
        <scripttype="text/javascript">
        var c=document.getElementById("myCanvas");
        var cxt=c.getContext("2d");
        var x=150;
        var y=150;
        var r=100;
        var girth=0;
        for (var i=x-r; i < x+r+1; i +=1) {
        var tempY1=Math.pow(r * r-(x-i) * (x-i), 1 / 2);    \注:這里代表x坐標(biāo)\
                  cxt.lineTo(i, y+tempY1);
        var tempX=r * r-(x-i+1) * (x-i+1);
        var tempY2=Math.pow(r * r-(x-i+1) * (x-i+1), 1 / 2);    \注:這里的+1代表下一個x坐標(biāo)\
        var temp=getLengthOfTwoPoint({ x: i-1, y: tempY2 }, { x: i, y: tempY1 });
        if (tempX >=0) {
                      girth +=temp;
                  }
                }
                alert("π的是值為:"+girth / r)
        function getLengthOfTwoPoint(startPoint, endPoint) {    \注:用于求兩點之間的距離\
        var calX=Math.abs(startPoint.x-endPoint.x);
        var calY=Math.abs(startPoint.y-endPoint.y);
        return Math.pow((calX * calX+calY * calY), 0.5);
                }
        </script>

上面的計算方法是把半個圓上的每段相鄰兩點之間的距離求和,然后除以r得出π的值。運行之后發(fā)現(xiàn)π的值為:3.1412985671602183,和標(biāo)準(zhǔn)的3.1415926535897932384626433 832795028841971693993751058209749相差甚遠(yuǎn)。

如何修改上面的代碼,提高精確度呢?數(shù)學(xué)家祖沖之得出了精確到小數(shù)點后7位,我們能超過他嗎?

因為是用的N條線段模擬圓,只要N越大,就越接近圓。所以可以增大半徑r,這樣需要的線段越多,求出的π就越接近標(biāo)準(zhǔn)值。將r增大至400000:

        var c=document.getElementById("myCanvas");
        var cxt=c.getContext("2d");
        var x=150;
        var y=150;
        var r=400000;
        var girth=0;
        for (var i=x-r; i < x+r+1; i +=1) {
        var tempY1=Math.pow(r * r-(x-i) * (x-i), 1 / 2);
                  cxt.lineTo(i, y+tempY1);
        var tempX=r * r-(x-i+1) * (x-i+1);
        var tempY2=Math.pow(r * r-(x-i+1) * (x-i+1), 1 / 2);
        var temp=getLengthOfTwoPoint({ x: i-1, y: tempY2 }, { x: i, y: tempY1 });
        if (tempX >=0) {
                      girth +=temp;
                  }
                }
                alert("π的是值為:"+girth / r)
        function getLengthOfTwoPoint(startPoint, endPoint) {
        var calX=Math.abs(startPoint.x-endPoint.x);
        var calY=Math.abs(startPoint.y-endPoint.y);
        return Math.pow((calX * calX+calY * calY), 0.5);
                }

結(jié)果如圖1-18所示。

圖1-18 計算機計算的π值

可以看到,我們得到的π值小數(shù)點后前8位是準(zhǔn)確的。

主站蜘蛛池模板: 平阴县| 朝阳县| 都昌县| 阜城县| 北辰区| 连南| 新疆| 高阳县| 呼图壁县| 吴忠市| 平安县| 鹿邑县| 沁阳市| 台安县| 绥芬河市| 敦煌市| 平原县| 互助| 通许县| 大同县| 雷山县| 安溪县| 巴彦淖尔市| 勃利县| 安龙县| 陈巴尔虎旗| 孟州市| 金坛市| 蓬溪县| 布拖县| 金沙县| 佛坪县| 西青区| 阿图什市| 邵阳市| 达日县| 广灵县| 五原县| 依兰县| 黄浦区| 乌拉特前旗|