Живые и Твёрдые Издательский Дом Коммерсантъ

Вычисление числа ПИ из количества координатных точек

// входящих в окружность единичного размера, вписанную в квадрат

Координатный метод вычисления числа ПИ реализован из праздного интереса.

Проблема: ПИ - это количественная мера отношения числа координатных точек, входящих в квадрат к числу координатных точек входящих в окружность, вписанную в данный квадрат.
Суть метода: генерировать координатные точки для квадрата, подсчитывая количество координат, попадающих в окружность, вписанную в квадрат. Затем определить ПИ из их отношения.
Выберем, для простоты и наглядности, в качестве расчётной модели, единичную окружность (радиус = 1) вписанную в квадрат. Центр координат, с точкой (0,0) совпадает с центром окружности.
рис. 1
pict. 1 / рис. 1 .. unit circle inscribed in a square / окружность вписанная в квадрат
Реализация на C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Pi
{
    class Program 
    { 
        // шаг приращения координаты
        // чем мешьше шаг, тем точнее число ПИ 
        const double  dotstep = 0.001;
        static void  Main(string [] args)
        {
            double  x=0.0, y=0.0, pi=0.0, dotsInCircle = 0.0, r= 1.0;
            double  rq = Math.Pow(r,2);
            double  rd = 0.0; 
            /*
            1. Окружность единичного радиуса вписана в квадрат
            2. Центр координат в середине окружности (0,0)
            3. Теоретически ПИ это отношение площади квадрата к площади вписанной окружности.
             * Значит, можем утверждать, что отношение количества координатных точек внутри квадрата
             * к количеству точек внутри вписанной окружности тоже является числом ПИ.
             * Координаты Х и Y имеют значения от -1 до 1
             * Для подсчёта координатных точек пройдём от начала до конца каждой координатной оси с определённым шагом
             * и подсчитаем количество точек, оказавшихся внутри дуги вписанной окружности.
             * Уравнение для точек на окружности: (Math.Pow(x, 2) + Math.Pow(y, 2)) = Math<.Pow(r, 2)
             */
            for  (x = -1.0; x <= 1.0; x += dotstep)
            {
                for  (y = -1.0; y <= 1.0; y += dotstep)
                {
                    // если (x,y) на окружности или внутри неё
                    if ((Math.Pow(x, 2) + Math.Pow(y, 2)) <= rq)
                    {
                        // счётчик точек внутри окружности
                        dotsInCircle += 1;
                    }
                    // счётчик всех точек в квадрате
                    rd += 1;
                }
            }
            // Из формулы площади квадрата S = 4*Math.Pow(r,2)
            // получим r - радиус эффективный (от количества координатных точек => плащадь квадрата )
            r = Math.Sqrt(rd / 4); 
            // Из формулы площади круга S = Pi*Math.Pow(r,2)
            // определяем значение PI из количества координатных точек (приведённой к площади окружности) и радиуса эффективного
            pi = dotsInCircle / (Math.Pow(r,2));
            Console.WriteLine("pi=" + pi);
            Console.ReadKey();
        }
    }
}

Рейтинг@Mail.ru Photo & Фото