1 SCIENCE TIME 1
il^1 ^jlil АВТОМАТИЗАЦИЯ ПРОЦЕССА ВЫЧИСЛЕНИЯ ОПРЕДЕЛЕННОГО ИНТЕГРАЛА В ХОДЕ ОБУЧЕНИЯ СТУДЕНТОВ Мозжегоров Кирилл Станиславович, Полевщиков Иван Сергеевич, ФГБОУ ВПО «Пермский национальный исследовательский политехнический университет», г. Пермь E-mail: kirill.mozzhegorov@yandex. ru E-mail: i.s.polevshchikov@gmail.com
Аннотация. В статье в сокращенной форме изложены особенности применения метода Монте-Карло для вычисления определенных интегралов. Рассмотрены особенности реализации программы, написанной на языке С#, предназначенной для вычисления определенного интеграла методом Монте-Карло.
Ключевые слова: статистическое моделирование, метод Монте-Карло, вычисление определенного интеграла, язык программирования С#.
Метод Монте-Карло лежит в основе статистического моделирования, заключающегося в том, что модель испытывается множеством случайных сигналов с заданной плотностью вероятности с целью получения выходных результатов [1, 2]. Рассмотрим особенности метода Монте-Карло на примере вычисления определенного интеграла.
Необходимо найти значение интеграла:
x2
у = |(^ .
На рис. 1 представлен график функции /(x) . Вычисление значения интеграла этой функции заключается в нахождении площади под графиком функции.
| SCIENCE TIME |
У4
с2 ЦП)
г2
с1 -
Рис. 1 Определение значения интеграла методом Монте-Карло [1]
В первую очередь, необходимо ограничить кривую сверху, справа и слева, а далее случайным образом распределить точки в прямоугольнике поиска. Количество точек, попавших под кривую по отношению к общему числу точек пропорционально площади под кривой (величине интеграла) по отношению к площади испытуемого прямоугольника. Следовательно, значение интеграла можно вычислить по следующей формуле:
N
У =ТГ • (Х - Х1) • (С2 - С1) ,
где N, - количество точек, принятых для испытаний (то есть попавших в
прямоугольник (рис. 1);
N2 - количество точек под кривой, то есть попавших в закрашенную площадь под функцией (рис. 1);
х, и Х2 - ограничения слева и справа по оси абсцисс соответственно;
с, и с2 - ограничения снизу и сверху по оси ординат соответственно.
В процессе обучения студентов бакалавриата (обучающихся по направлению «Информатика и вычислительная техника»), студенту необходимо автоматизировать процесс вычисления определенного интеграла согласно рассмотренному выше принципу посредством написания программы с использованием одного из языков программирования высокого уровня.
Рассмотрим особенности реализации программы для вычисления
| SCIENCE TIME |
определенного интеграла методом Монте-Карло на примере интеграла вида:
у = | (ик + b)dx .
xl
Для решения поставленной задачи был выбран язык программирования С# [3-4], являющийся современным объектно-ориентированным языком программирования с С-подобным синтаксисом.
Для начала создадим функцию, которая выдавала бы случайное число, подчиняющееся равномерному распределению на интервале [0;1] :
double Value_Rund() {
Random rand = new Random(); double z = rand.NextDouble(); Thread.Sleep(l); return z;
}
Функция Thread. Sleep(l) - блокирует поток на одну миллисекунду, что
й [0;1] позволяет возвращать разные значения случайного числа в интервале ,
которое создается методом NextDouble().
Далее рассмотрим основную функцию расчета введенного пользователем
интеграла. Функция выполняется после нажатия пользователем кнопки
«Решить»:
private void button1_Click(object sender, EventArgs e) {
int n = Convert.ToInt32(numericUpDown1.Value);
int xl = 3;
int x2 = 4;
int a = 4;
int b = -1;
int cl = Convert.ToInt32(numericUpDown2.Value); int c2 = Convert.ToInt32(numericUpDown3.Value); if (c2 < cl || x2 < xl) return;
I SCIENCE TIME I
double res = 0.0; int N1 = 0; int N2 = 0;
for (int i = 0; i < n; i++) {
double xRand = x1 + (x2 - x1) * Value_Rund(); double yRand = c1 + (c2 - c1) * Value_Rund(); double f = a * xRand + b;
if (f >= yRand) {
N1++; N2++;
}
else
N1++;
}
res = N2 * 1.0 / N1 * (x2 - x1) * (c2 - c1); textBox2.Text = res.ToString("F5");
double result = (a * x2 * x2 * 1.0 / 2 + b * x2) - (a * x1 * x1 * 1.0 / 2 + b
* x1);
textBox1.Text = resultToString("F5");
}
Разберем детальнее выполнение этой функции. В первую очередь, считываются данные из формы и определяются коэффициенты интеграла:
int n = Convert.ToInt32(numericUpDown1.Value); int x1 = 3; int x2 = 4; int a = 4; int b = -1;
int c1 = Convert.ToInt32(numericUpDown2.Value); int c2 = Convert.ToInt32(numericUpDown3.Value);
Дальше происходит проверка правильности данных, без которой не может быть получен необходимый результат:
if (c2 < c1 || x2 < x1) return;
I
SCIENCE TIME
I
Затем выполняется цикл с количеством шагов, равным введенному числу п . В этом цикле с помощью функции Уа1ие_Кипё() генерируются случайные точки в заданном прямоугольнике и вычисляется количество точек, попавших в область под графиком (область заданного интеграла):
for (int i = 0; i < n; i++)
{
double xRand = x1 + (x2 - x1) * Value_Rund(); double yRand = c1 + (c2 - c1) * Value_Rund(); double f = a * xRand + b;
if (f >= yRand) {
N1++; N2++;
}
После этого, зная количество попавших точек в заданную функцией область, можно рассчитать значение интеграла:
res = N2 * 1.0 / N1 * (x2 - x1) * (c2 - c1);
Также данный интеграл, применив соответствующие преобразования, можно вычислить аналитически. Это происходит с помощью следующих операций:
double result = (a * x2 * x2 * 1.0 / 2 + b * x2) - (a * x1 * x1 * 1.0 / 2 + b * x1);
Дополнительно была добавлена кнопка «Очистить», которая выполняет очистку результатов. Обработчик нажатия этой кнопки выглядит следующим образом:
private void button2_Click(object sender, EventArgs e)
else
N1++;
}
{
textBox1.Clear(); textBox2.Clear();
}
Рассмотрим результаты работы программы. Для примера возьмем следующий интеграл:
Запустим созданную программу. Введем исходные данные. Результат
е- N = 10 0
работы программы для точек представлен на рис. 2.
Рис. 2 Результат выполнения программы при
N = 10
Результат работы программы для N 100 точек представлен на рис. 3.
Рис. 3 Результат выполнения программы при
N = 100
I SCIENCE TIME I
Согласно рис. 2 и 3 видно, что чем больше количество сгенерированных точек, тем точнее вычисленное значение интеграла.
Таким образом, с использованием языка C# была реализована программа, показывающая на простейшем примере особенности вычисления определенного интеграла методом Монте-Карло. Следует отметить, что практическое применение данный метод находит в случае, когда значение интеграла нельзя найти аналитическим способом [1].
Литература:
1. Мухин О.И. Лекция «Статистическое моделирование» [Электронный ресурс]. - Режим доступа: stratum.pstu.ac.ru/education/textbooks/modelir/lection21.html. (Дата обращения: 30.08.2014).
2. Гайнанов Р.Р., Файзрахманов Р. А., Полевщиков И.С. Особенности программной реализации процесса расчета определенного интеграла методом Монте-Карло // Science Time. 2015. №1(13). С. 71-75.
3. Павловская Т. А.. C#. Программирование на языке высокого уровня: учебник для вузов. Санкт-Петербург[и др.]: Питер, 2010 . 432 с.
4. Троелсен Э. C# и платформа .NET. Библиотека программиста. СПб.: Питер, 2007. 796 с.