Ocena użytkownikóww: ***** / 5
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.java:
import java.util.Random;
// Calkowanie numeryczne - metoda Monte-Carlo
// www.algorytm.org
// (c)2007 by Tomasz Lubinski
public class Metoda_Monte_Carlo {
//funkcja dla ktorej obliczamy calke
private static double func(double x) {
return x*x+3;
}
// 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
private static double funcIn(double x, double y) {
if (( y > 0) && (y <= func(x)))
return 1;
else if (( y > 0) && (y <= func(x)))
return -1;
return 0;
}
//random number from a to b
private static double randomPoint(double a, double b) {
return a + Math.random() * (b-a);
}
/**
* @param args
*/
public static void main(String[] args) {
double xp, xk, yp, yk, calka;
int n, pointsIn;
System.out.println("Podaj poczatek przedzialu calkowania");
xp = Console.readDouble("");
System.out.println("Podaj koniec przedzialu calkowania");
xk = Console.readDouble("");
System.out.println("Podaj dokladnosc calkowania (w setkach punktow)");
n = Console.readInt("");
n *= 100;
yp = 0;
yk = Math.ceil(Math.max(func(xp), func(xk)));
pointsIn = 0;
for (int i=0; i<n; i++) {
pointsIn += funcIn(randomPoint(xp, xk), randomPoint(yp, yk));
}
calka = (pointsIn / (double)n) * ((xk-xp) * (yk-yp));
System.out.println("Wartosc calki wynosi w przyblizeniu " + calka);
}
}