public static double[] ComplementsSimpsons38(Normal[] distributions, int steps = 150) { if (steps % 3 != 0) { steps += 3 - steps % 3; // Round up to a multiple of 3 } double[] complementProbs = new double[distributions.Length]; distributions = NegateDistributions(distributions); // This change is local to this method for (int i = 0; i < distributions.Length; i++) { Normal distribution_i = distributions[i]; Func <double, double> integrand = x => { double product = distribution_i.Density(x); for (int j = 0; j < distributions.Length; j++) { if (j != i) { product *= distributions[j].CumulativeDistribution(x); } } return(product); }; complementProbs[i] = NewtonCotes.Simpsons38Rule(integrand, distribution_i.Mean - 8 * distribution_i.StdDev, distribution_i.Mean + 8 * distribution_i.StdDev, steps); //Console.WriteLine($"S38[{i}]: {complementProbs[i]}"); } return(complementProbs); }
/// <summary> Takes a set of normal distributions and computes the probability that each one would produce the minimal value if /// a point sample was taken from each. Integration is performed by Simpson's 3/8 rule. </summary> /// <param name="distributions">The array of distributions to compare</param> /// <param name="iterations">The number of iterations to use in Simpson's 3/8 Rule. Defaults to 150.</param> /// <returns>An array of probabilities that each distribution will produce the minimum value if a point sample was taken from each. /// [i] = P(X_i less than min(all X_j))</returns> public static double[] Simpsons38RuleWithoutNegation(Normal[] distributions, int iterations = 150) { double[] complementProbs = new double[distributions.Length]; for (int i = 0; i < distributions.Length; i++) { Normal distribution_i = distributions[i]; Func <double, double> integrand = x => { double product = distribution_i.Density(x); for (int j = 0; j < distributions.Length; j++) { if (j != i) { product *= 1 - distributions[j].CumulativeDistribution(x); } } return(product); }; complementProbs[i] = NewtonCotes.Simpsons38Rule(integrand, distribution_i.Mean - 8 * distribution_i.StdDev, distribution_i.Mean + 8 * distribution_i.StdDev, iterations); //Console.WriteLine($"S38R[{i}]: {complementProbs[i]}"); } return(complementProbs); }
void App_Startup(object sender, StartupEventArgs e) { Func <double, double> function = null; int funSelection = 0; bool isParsable = false; bool isBetween = false; do { Console.WriteLine("Wybierz wariant funkcji do całkowania:"); Console.WriteLine("(1). f(x) = 4x^4 -2x^3 + 4x^2 -4x +1 "); Console.WriteLine("(2). f(x) = 4sin(2x) "); Console.WriteLine("(3). f(x) = 2|x^3|"); isParsable = Int32.TryParse(Console.ReadLine(), out funSelection); isBetween = funSelection.IsBetween(1, 3); } while(!(isParsable && isBetween)); switch (funSelection) { case 1: function = Example.Polynomial; break; case 2: function = Example.Sinus; break; case 3: function = Example.Absolute; break; } Console.Write("Nieskończone przedziały? (t/*)"); bool isInifniteRange = Console.ReadKey().IsKey('t'); Console.WriteLine(); double a, b; if (isInifniteRange) { a = double.NegativeInfinity; b = double.PositiveInfinity; } else { bool isNumber = false; bool isCorrect = false; do { Console.WriteLine("Określ przedziały całkowania:"); Console.Write("a:"); isNumber = double.TryParse(Console.ReadLine(), NumberStyles.Any, CultureInfo.InvariantCulture, out a); Console.Write("b:"); isNumber = double.TryParse(Console.ReadLine(), NumberStyles.Any, CultureInfo.InvariantCulture, out b); isCorrect = a < b; } while (!isNumber || !isCorrect); } double epsilon = 0; bool isEpsilonCorrect = false; do { Console.Write("Określ dokładność obliczeń: "); isEpsilonCorrect = double.TryParse(Console.ReadLine(), NumberStyles.Any, CultureInfo.InvariantCulture, out epsilon); } while (!isEpsilonCorrect); if (double.IsInfinity(a) || double.IsInfinity(b)) { a = Utilis.CalculateLimit(0, -2, Example.Exponent(function)); b = Utilis.CalculateLimit(0, 2, Example.Exponent(function)); } Newton_Cotes NewtonCotes; Gauss_Hermite GaussHermite; if (isInifniteRange) { NewtonCotes = new Newton_Cotes(Example.Exponent(function), a, b, epsilon); GaussHermite = new Gauss_Hermite(function, epsilon); } else { NewtonCotes = new Newton_Cotes(Example.Exponent(function), a, b, epsilon); GaussHermite = null; } Console.WriteLine("Całka obliczona przy użyciu metody Newtona-Cotesa wynosi: " + NewtonCotes.GetResult()); Console.WriteLine("Liczba węzłów: " + NewtonCotes.GetIterationsCount()); if (!(GaussHermite is null)) { Console.WriteLine("Całka obliczona przy użyciu kwadratury Gaussa wynosi: " + GaussHermite.GetResult()); Console.WriteLine("Liczba węzłów: " + GaussHermite.GetIterationsCount()); } MainWindow mainWindow = new MainWindow(); mainWindow.Plot.NewtonCotesValues = NewtonCotes.GetNodes(); mainWindow.Plot.Values = NewtonCotes.GetValues(); mainWindow.Show(); }