Languages
[Edit]
PL

JavaScript - jak użyć metody Monte Carlo do obliczenia liczby pi?

0 points
Created by:
Aston-Freeman
397

Za pomocą JavaScript można obliczyć pole powierzchni (całka oznaczona) w następujący sposób.

1. Przykład obliczenia pola powierzchni koła

Główną ideą tej metody jest:

  1. duża ilość losowych punktów
  2. sprawdzanie, czy każdy następny punkt znajduje się wewnątrz okręgu, czy nie,
  3. obliczenie współczynnika, dzieląc liczbę punktów wewnątrz okręgu przez liczbę punktów na zewnątrz,
  4. pomnożenie współczynnika przez pole powierzchni kwadratu - w ten sposób z proporcji można otrzymać przybliżoną wartość pola powierzchnię koła,
  5. użycie przekształconego wzoru pola powierzchni koła, aby obliczyć liczbę PI.

Uwaga:

Im dłużej trwa symulacja, tym wyniki są bardziej precyzyjne.

// ONLINE-RUNNER:browser;

<!doctype html>
<html>
<head>
  <style>

    #my-canvas { border: 1px solid gray; }

  </style>
  <script>

    function randomizePoint(range) {
        return range * (Math.random() - 0.5);
    }

    // Metoda, która sprawdza czy punkt znajduje się wewnątrz okręgu 
    // o środku w punkcie (0, 0).

    function checkCondition(circleRadius, pointX, pointY) {
    	var pointRadius = Math.sqrt(pointX * pointX + pointY * pointY);

      	if (pointRadius <= circleRadius) {
        	return true;
        }

      	return false;
    }

    window.Drawer = function(canvas) {
        var context = canvas.getContext('2d');

        var xCenter = canvas.width / 2;
        var yCenter = canvas.height / 2;

        this.clearCanvas = function() {
            context.clearRect(0, 0, canvas.width, canvas.height);
        };

        this.drawPoint = function(x, y, color) {

            var tmpX = Math.round(xCenter + x - 1);
            var tmpY = Math.round(yCenter + y - 1);

            context.strokeStyle = '#fff';
            context.fillStyle = color || '#000';

            context.fillRect(tmpX, tmpY, 2, 2);
        };

        this.drawCircle = function(x, y, radius) {

            var tmpX = Math.round(xCenter + x - 1);
            var tmpY = Math.round(yCenter + y - 1);

            context.lineWidth = 0.5;
            context.strokeStyle = '#ff0000';
            context.fillStyle = '#fff';

            context.beginPath();
            context.arc(tmpX, tmpY, radius, 0, 2 * Math.PI);
            context.stroke();
        };
    };

  </script>
</head>
<body>
  <canvas id="my-canvas" width="300" height="300"></canvas>
  <script>

    var canvas = document.querySelector('#my-canvas');

    var drawer = new Drawer(canvas);

    var squareArea = canvas.width * canvas.height;
    var circleRadius = 150;

    var squarePointsCount = 0;
    var circlePointsCount = 0;

    drawer.clearCanvas();
    drawer.drawCircle(0, 0, circleRadius);

    function makeIteration() {

        for(var i = 0; i < 100; ++i) {

          	 // losowe współrzędne z zakresu od -150 do +150
            var pointX = randomizePoint(canvas.width);
    	    var pointY = randomizePoint(canvas.height);

            if (checkCondition(circleRadius, pointX, pointY)) {
                drawer.drawPoint(pointX, pointY, 'red');

                circlePointsCount += 1;
            } else {
                drawer.drawPoint(pointX, pointY, 'silver');
            }

            squarePointsCount += 1;
        }

        // większa liczba iteracji zwiększa precyzję obliczeń 

        var randomPointsProportion = circlePointsCount / squarePointsCount;

      	var computatedCircleArea = randomPointsProportion * squareArea;
        var computatedPI = computatedCircleArea / (circleRadius * circleRadius);

      	var computationError = Math.abs(Math.PI - computatedPI);

        console.clear();

        console.log('Liczba PI:');
      	console.log(' Oczekiwana: ' + Math.PI);
      	console.log(' Obliczona: ' + computatedPI);
        console.log(' Błąd: ' + computationError);
    }

    setInterval(makeIteration, 100);

  </script>
</body>
</html>

Referencje

  1. Metoda Monte Carlo - Wikipedia
Native Advertising
🚀
Get your tech brand or product in front of software developers.
For more information Contact us
Dirask - we help you to
solve coding problems.
Ask question.

❤️💻 🙂

Join