Цель: Oтработка навыков программирования с использо-
ванием функции случайного числа.
Обеспечеие урока: Программы: TURBO.EXE, MKARLO.PAS, TRAPT.PAS.
Содержание нового материала.
Существует много способов вычисления площадей фигур. Точное вычисление по формулам
для простейших фигур, приближенное вычисление площадей ограниченных кривыми,
вид которых задан функцией и т.д. Метод приближенного вычисления площадей фигур
с применением датчика случайных чисел называют методом Монте-Карло (по названию
города, где расположена знаменитая рулетка, которую можно рассматрвать как <<генератор>>
случайных чисел).
Суть метода заключается в следующем. Поместим фигуру F в квадрат. Будем наугад
(как говорят математики, случайным образом) бросать точки в этот квадрат. Естественно
предполагать, что чем больше площадь фигуры, тем чаще в нее будут попадать точки.
Представьте себе квадратный дворик и в нем детскую площадку.
Каждому ясно, что во время снегопада количество снежинок, попавших на детскую
площадку, пропорционально ее площади. Таким образом, можно сделать допущение:
при большом числе точек, наугад выбранных внутри квадрата, доля точек, содержащихся
в F, приближенно равна отношению площади F к площади квадрата.
Несложно видеть, что исходными данными являются сторона а квадрата,
содержащего фигуру F, и количество точек kw, которые мы
будем случайным образом выбирать внутри квадрата. Результатом является площадь
S фигуры F. Если через kr обозначить число тех
наугад выбранных точек, которые содержаться в фигуре F, то площадь
S приближенно равна S=(kr/kw)*а 2.
Применим эту модель для приближенного вычисления числа ПИ путем нахождения площади
круга радиуса R=1. Формула площади круга известна:
S = ПИ*R
при R=1 площадь S численно равна ПИ. Квадрат для такого круга
получается со стороной а=2. Площадь квадрата равна 4. Тогда площадь фигуры F
будет равна:
S = (kr/kw)*4,
что можно заменить на
ПИ = (kr/kw)*4.
Выберем за центр окружности и квадрата начало системы координат, тогда выбрать
точку - это значит задать ее координаты: для числа X и Y. Точка принадлежит
квадрату, если -1<=X<=1 и -1<=Y<=1. Если X*X+Y*Y<=1, то точка
попадает в круг F, иначе она лежит вне круга. Это и есть математическое соотношение,
позволяющее для каждой точки определять, лежит ли она в F. Математическая модель,
выбранная нами для решения задач на
нахождение площадей, отличается от предыдущих тем, что в ней используются случайные
числа (такие модели называют вероятностными). В связи с чем при запуске программы
для одного и того же количества случайных чисел результаты будут разными. Можно
ли доверять результатам вычислений? На этот вопрос отвечает специальный раздел
математики - теория вероятностей, в котором имеется строгое математическое доказательство
метода Монте-Карло. На самом деле точность результатов зависит не только от
того, является модель вероятностной или нет, - это зависит и от точности исходных
данных, точности вычислений и в сильной мере
от качества датчика случайных чисел. Именно качество датчика случайных чисел
в системе Express Pascal не выдерживает критики. Функция random и random(x)
выдают, так называемые, псевдос лучайные числа, которые начиная с определенного
значения повторяются и в последовательности чисел обнаруживаются статистические
закономерности.
Оценку достоверности полученного результата производим обычным способом т.е.
сравнением двух результатов вычислений, один из которых выполнен с заведомо
большей точностью, чем другой. Ясно, что при большем числе случайных точек будет
повышена точность результата. В системе PASCAL/FAST из-за плохого качества
датчика случайных чисел и медленной работы ЭВМ при работе программы нет смысла
увеличивать число случайных точек более 10000, точность вычислений увеличена
не будет.
По рассмотренной математической модели программа на языке Паскаль выглядит примерно так:
Program MonteKarlo;
Var x,y:real;
n,kr,kw:integer;
begin
Clrscr; Writeln ('Вычисление ПИ методом МОНТЕ_КАРЛО.');
Writeln;
Write ('Введите количество случайных чисел. n=');
repeat
x:=random;
until keypressed;
Read (n);
GotoXY (20,8); Writeln ('ЖДИТЕ...');
kr:=0; kw:=0;
repeat
x:=(0.5-random)*2; y:=(0.5-random)*2;
kw:=kw+1;
if x*x+y*y<=1 then kr:=kr+1;
until kw>n;
Clrscr;
GotoXY (20,8); Writeln ('n=',n);
GotoXY(20,10); Writeln ('ПИ=',kr/kw*4:2:6);
end.
а) Program MonteKarlo;
Var x,y:real;
n,kr,kw:integer;
x,y - координаты случайной точки,
n- количество случайных точек, попавших в квадрат,
kr - количество случайных точек попавших в фигуру (в на-
шем примере в круг),
kw - счетчик точек, по выходе из цикла равен количеству
случайных точек, попавших в квадрат.
б) Clrscr; Writeln ('Вычисление ПИ методом МОНТЕ_КАРЛО.');
Writeln;
Write ('Введите количество случайных чисел. n=');
Печать заголовка и подсказки на ввод количества случайных
точек.
в) repeat
x:=random;
until keypressed;
Read (n);
GotoXY (20,8); Writeln ('ЖДИТЕ...');
Цикл, предназначенный усилить непредсказуемость последо-
вательности случайных чисел. Чтение с клавиатуры количес-
тва случайных точек и вывод в позиции (20,8) указания
ждать конца выполнения программы.
г) kr:=0; kw:=0;
Установление счетчика точек, попавших в квадрат и круг, в
нулевое состояние.
д) repeat
x:=(0.5-random)*2; y:=(0.5-random)*2;
kw:=kw+1;
if x*x+y*y<=1 then kr:=kr+1;
until kw>n;
Основной расчетный цикл в котором команда:
- x:=(0.5-random)*2; y:=(0.5-random)*2 формирует коорди-
наты случайных точек, попавших в квадрат с координатами
-1<=X<=1 и -1<=Y<=1,
- kw:=kw+1 подсчитывает количество сформированных случай-
ных точек.
- if x*x+y*y<=1 then kr:=kr+1 подсчитывает количество
случайных точек попавших внутрь круга.
- until kw>n выход из цикла по достижении количества слу-
чайных точек превосходящих заданное количество n.
е) Clrscr;
GotoXY (20,8); Writeln ('n=',n);
GotoXY(20,10); Writeln ('ПИ=',kr/kw*4:2:6);
Стереть с экрана и вывести на печать в позиции (20,8) ко-
личество случайных точек и результат вычислений в позиции
(20,10), причем для печати целой части числа отвести не
менее 2-х позиций, для печати дробной части числа отвести
6 позиций.
3. Анализ полученных результатов.
а) Время работы программы и результат зависят от количества выбранных точек.
n
|
результат
|
|
50
|
3.372549
|
|
50
|
3.294118
|
|
50
|
3.215686
|
|
100
|
3.405941
|
|
100
|
3.207921
|
|
100
|
2.970297
|
|
600
|
3.108153
|
|
600
|
3.114809
|
|
600
|
3.194676
|
|
1500
|
3.131246
|
|
1500
|
3.107262
|
|
1500
|
3.128581
|
Из таблицы хорошо видно, что за точность вычислений приходится платить временем работы программы. Разные результаты за пределами точности при одном и том же количестве случайных точек зависит от того, что точки все таки случайные.