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);
        }
Пример #3
0
        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();
        }