eMatematikas Prisijunk Forumas Užduotys Testai Pradžia

Apskaičiuokite apytikslę PI reikšmę


Prisiminiau šį uždavinuką ir pagalvojau, kad galbūt jis ką nors sudomins :D . Galbūt sąlyga bus kiek abstrakti, bet nežinau ar būtų įdomu, jei parašyčiau daugiau detalių :D .
Taigi, turime apskritimą, kuris yra įbrėžtas kvadrate.
http://s11.postimg.org/o1w7mvo2r/circle_in_a_square.png
1. Kokia tikimybė, kad atsitiktinai pasirinktas kvadrato viduje esantis taškas bus taip pat ir apskritimo viduje?
2. Besinaudojant pirmo punkto atsakymu, parašyti programą, kuri skaičiuoja pi reikšmę. (programa neturėtų pati nutraukti darbo,  y.y., ji turėtų dirbti iki pasaulio pabaigos :D )
Mažokai informacijos parašiau, tad galbūt po to kokių nors užuominų parašysiu. Beje, pats šią užduotį padariau paskaliu, tad galbūt sprendimas atrodys kiek kitaip rašant su kita kalba.

Priminė Bufono adatos problemą...

pakeista prieš 13 m

lukasmPriminė Bufono adatos problemą...

Jei labai nori, tai gali sukurti adatų metimo simuliatorių :D , bet šios problemos nėra susijusios (nors tiesioginių sąsajų nematau).

Jos tiesiogiai nesusiję. Panašumas tik tas, kad šitų problemų dėka galima gražiai apytiksliai apskaičiuot pi reikšmę naudojant tikimybių teoriją. Bent jau Bufono adatos problema, kai pirmąkart perskaičiau ją, mane sužavėjo. :D

pakeista prieš 13 m

Tikimybė tikriausiai yra apskritimo ir kvadrato plotų santykis, o programoje aš generuočiau du atsitiktinius skaičius iš intervalo (-R;R) ir tikrinčiau, ar duotas taškas patenka i apskritimo vidų. pi reikšmė bus
[tex]4 \times \frac{\mbox{taskai patenkantys i apskritimo vidu}}{\mbox{visi sugeneruoti taskai}}[/tex]

Taip, teisingai :) , bet vis tiek norėtųsi pamatyti kokią nors programą :D


#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>

#define N 1000

int main(void) {
    int i,k;
    double x,y,yy;
    srand(time(NULL));
    for(k=0,i=1;i<=N;i++) {
        x=rand()-RAND_MAX/2.0;
        y=rand()-RAND_MAX/2.0;
        yy=sqrt((double)RAND_MAX*RAND_MAX/4.0-x*x);
        if(y>-yy && y<yy) k+=1;
        printf("%d %d, %lf\n",k,i,4.0*k/i);
    }
    return 0;
}

Funkcija rand() gražina reikšmę tarp 0 ir RAND_MAX. srand() reikalinga pakeisti (kad nebūtų visada vienoda) atsitiktinių skaičių seką.

Man Bufono eksperimentas įdomesnis ir įspūdingesnis, nes jį galima pačiam namie išbandyti - pavyzdžiui su degtukais ant linoleumo :)

Jeigu tau patinka tokios matematinio tipo programavimo problemos išbandyk ProjectEuler.net.

su octave


n = 2000;
N = 10;

mano_Pi = zeros(1, n);
taskuSkaicius = zeros(1, n);

for i = 1 : n
    taskuSkaicius(i) = N;
    x = rand(1, N);
    y = rand(1, N);
    r = x.^2 + y.^2;
    taskaiApskritime = (r <= 1);
    r(taskaiApskritime) = 1;
    r(not(taskaiApksritime)) = 0;
    mano_Pi(i) = 4 * sum(r) / N;
    N += 10;
endfor

plot(taskuSkaicius, mano_Pi, taskuSkaicius, pi*ones(1, n))
xlabel("tasku skaicius")
ylabel("tasku skaicius")
axis([min(taskuSkaicius), max(taskuSkaicius), mon(mano_Pi), max(mano_Pi)])



https://www.ematematikas.lt/upload/uploads/40000/4000/44478/thumb/p17tbf77qh52l4mq9g7142e1u3o1.png

Pateiksiu savo programą :)
Pirmiausiai, užtenka tikrinti tik pirmą ketvirtį, o ne visą apskritimą. Taip pat, R neturi reikšmės, todėl jį galima pasirinkti pačiam (pasirinkau R = 1). Paskalyje random() funkcija grąžina (jei neperduodamas joks argumentas) realų skaičių nuo 0 iki 1.

var m, n : QWord;
    x, y : real;
begin
  m := 0;
  n := 0;
  while true do
    begin
      x := random();
      y := random();
      if (x*x + y*y) < 1 then
        m := m + 1;
      n := n + 1;
      if ((n+1) mod 999999) = 0 then
        writeln('PI = ', (m/n)*4);
    end;
end.

pakeista prieš 13 m

Nori sudalyvauti šioje temoje ir parašyti savo pranešimą? Prisijungti »