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_cs/metoda_monte_carlo.cs:
// Calkowanie numeryczne - metoda Monte-Carlo // www.algorytm.org // (c)2007 by Tomasz Lubinski using System; namespace metoda_monte_carlo_cs { /// <summary> /// Metoda Monte-Carlo. /// </summary> class Metoda_Monte_Carlo { public delegate double FUNC(double x); private static Random rand = new Random(); //random number from a to b private static double randomPoint(double a, double b) { return a + rand.NextDouble() * (b-a); } /// <summary> /// Oblicza calke metoda Monte-Carlo w przedziale od xp do xk z dokladnoscia n dla funkcji fun /// </summary> /// <param name="xp">poczatek przedzialu calkowania</param> /// <param name="xk">koniec przedzialu calkowania</param> /// <param name="yp">minimalna wartosc wewnatrz calkowania</param> /// <param name="yk">maksymalna wartosc wewnatrz calkowania</param> /// <param name="n">dokladnosc calkowania</param> /// <param name="func">funkcja calkowana</param> /// <returns>przyblizona wartosc calki</returns> private static double calculate(double xp, double xk, double yp, double yk, int n, FUNC func) { double calka; int pointsIn; pointsIn = 0; for (int i=0; i<n; i++) { pointsIn += funcIn(randomPoint(xp, xk), randomPoint(yp, yk)); } calka = (pointsIn / (n*1.0)) * ((xk-xp) * (yk-yp)); return calka; } //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 int funcIn(double x, double y) { if (( y > 0) && (y <= func(x))) return 1; else if (( y > 0) && (y <= func(x))) return -1; return 0; } /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main(string[] args) { double xp, xk, yp, yk; int n; FUNC function = new FUNC(func); Console.WriteLine("Podaj poczatek przedzialu calkowania"); xp = double.Parse(Console.ReadLine()); Console.WriteLine("Podaj koniec przedzialu calkowania"); xk = double.Parse(Console.ReadLine()); Console.WriteLine("Podaj dokladnosc calkowania (w setkach punktow)"); n = int.Parse(Console.ReadLine()); n *= 100; yp = 0; yk = Math.Ceiling(Math.Max(func(xp), func(xk))); Console.WriteLine("Wartosc clki wynosi w przyblizeniu " + calculate(xp, xk, yp, yk, n, function)); } } }