Интегрирование методом Монте Карло

99
09 декабря 2021, 07:40

Пишу программу для интегрирования методом Монте Карло. С моей перспективы код рабочий, а результаты получаются более менее схожие. Поверхностно алгоритм выглядит так:
- Принимаем границу a - b и кол-во точек;
- Обрисовываем функцию прямоугольником (часть функции где y < 0 указывается как абсолютное значение, y минимум всегда будет равен 0.
- При попадании за пределы прямоугольника максимальная граница расширяется в два раза от значении функции в этом месте и начинаем сначала;
Преподаватель указал мне на строку y = GetRandomNumber(yMin, yMax); и сказал что это не совсем верно
Что не так с программой или как её улучшить?

    static void Main(string[] args)
    {
        for (int i = 0; i < 10; i++)
        {
            Console.WriteLine(Integral(10, 35, 1000000));
        }
        Console.ReadKey();
    }
    static double Integral(int a, int b, int n)
    {
        double function;
        double y;
        double yMin = 0;
        int count = 0;
        double x = GetRandomNumber(a, b);
        double yMax = Function(x) * 2;
        int i = 0;
        do
        {
            x = GetRandomNumber(a, b);
            function = Math.Abs(Function(x));
            if(yMax > function)
            {
                y = GetRandomNumber(yMin, yMax);
                if(y < function)
                {
                    count++;
                }
                i++;
            }
            else
            {
                yMax = function * 2;
                count = 0;
                i = 0;
            }
        } while (i < n);
        return count * (b - a) * (yMax - yMin) / n;
    }
    static double Function(double x)
    {
        return Math.Cos(x);
    }
    static double GetRandomNumber(double minimum, double maximum)
    {
        Random random = new Random();
        return random.NextDouble() * (maximum - minimum) + minimum;
    }
Answer 1

Поковырялся в интернете, нашёл решение и упростил метод.

    static double Integral(int a, int b, int n)
    {
        double total = 0;
        double yMax = 0;
        double x;
        double funct;
        int i = 0;
        do
        {
            x = GetRandomNumber(a, b);
            funct = Math.Abs(Function(x));
            if (yMax > funct)
            {
                total += funct;
                i++;
            }
            else
            {
                yMax = funct * 2;
                i = 0;
            }
        } while (i < n);
        return (b - a) * total / n;
    }
READ ALSO
Вставка PDF-файла на форму. Ошибка Visual Studio 2015. C#

Вставка PDF-файла на форму. Ошибка Visual Studio 2015. C#

Помогите найти решение проблемыПосле того как я пытаюсь перенести на форму с панели элементов Adobe PDF Reader, генерируется ошибка "Сбой при импорте...

178
Выбранный путь некорректно вносится в БД

Выбранный путь некорректно вносится в БД

В программе есть OpenFileDialogВ нем я выбираю путь и вношу в переменную route

130
Использование делегата EventHandler

Использование делегата EventHandler

Помогите разложить в голове схему использования события, основанного на предоставляемом делегате EventHandler на примере простой задачи(видел...

65
Как задать curl запрос в С#

Как задать curl запрос в С#

Пример curl-запроса:

181