algorytm.org

Implementacja w Delphi/Pascal



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Całkowanie numeryczne - metoda Monte Carlo I - Implementacja w Delphi/Pascal
Ocena użytkownikóww: *****  / 1
SłabyŚwietny
Nadesłany przez Tomasz Lubiński, 19 lutego 2008 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

metoda Monte-Carlo - Delphi/metoda_monte_carlo.dpr:
// Calkowanie numeryczne - metoda Monte-Carlo
// www.algorytm.org
// (c)2007 by Tomasz Lubinski

program metoda_monte_carlo;
{$APPTYPE CONSOLE}
uses
  SysUtils, Math;

//funkcja dla ktorej obliczamy calke
function func(x: Real): Real;
begin
     result :=  x*x + 3;
end;

//1 jeżeli punkt leży nad osią OY i jednocześnie pod wykresem funkcji całkowanej
//-1 jeżeli punkt leży pod osią OY i jednocześnie nad wykresem funkcji całkowanej
//0 w przeciwnym razie
function funcIn(x: Real; y: Real): Integer;
begin
     if (y > 0) and (y <= func(x)) then
        result := 1
     else if (y < 0) and (y >= func(x)) then
        result := -1
     else
        result := 0;
end;

//random number from a to b 
function randomPoint(a: Real; b: Real): Real;
begin
        result := a + random * (b-a);
end;

var
     xp, xk, yp, yk, calka: Real;
     pointsIn, i, n: Integer;
begin

	writeln('Podaj poczatek przedzialu calkowania');
	readln(xp);

	writeln('Podaj koniec przedzialu calkowania');
        readln(xk);

	writeln('Podaj dokladnosc calkowania (w setkach punktow)');
	readln(n);
        n := n * 100;

        yp := 0;
        yk := Ceil(Max(func(xp), func(xk)));

        pointsIn := 0;
        randomize();

        for i:=1 to n do
                pointsIn := pointsIn + funcIn(randomPoint(xp, xk), randomPoint(yp, yk));

        calka := (pointsIn / n) * ((xk-xp) * (yk-yp));

	writeln('Wartosc calki wynosi w przyblizeniu ' + FloatToStr(calka));
        readln;
end.
Dodaj komentarz