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));
}
}
}

