Ocena użytkownikóww: ***** / 1
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.