algorytm.org

Implementacja w C#



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 C#
Ocena użytkownikóww: *****  / 2
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_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));
		}
	}
}
Dodaj komentarz