Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
Лекция 5
Метод Монте-Карло
Имитационное моделирование
Лекция 5
Программирование и информатика: Лекция 514.11.2019 13
Метод Монте-Карло
- численный метод решения различных задач (в том
числе физических) при помощи моделирования
случайных событий.
В широком смысле метод Монте-Карло – метод,
использующий псевдослучайные числа.
Метод Монте-Карло сформулирован в 1949 г. в
работах Дж. Неймана, С. Улама, Н. Метрополиса
(первые ЭВМ, проект создания атомной бомбы)
Программирование и информатика: Лекция 514.11.2019 14
Идея метода Монте-Карло
Площадь озера?
N Nвс
1 12 13 2
Sкв~N Sозера~Nвc
кввс
озера SN
NS
consty)(x, :тноРавновероя
y)dS(x,dP
1) , (0 события ьвероятност
P
Программирование и информатика: Лекция 5
кввс
озера SN
NS
14.11.2019 15
Предшественники метода: игла Бюффона
R = 1
кв
кр
N
NS 4кр R
Sкр = πR2 = π Sкв = 4
5,38
74
Число реализаций!
Программирование и информатика: Лекция 514.11.2019 16
Генератор псевдослучайных чисел
Равномерно распределенные целые числа на
интервале от 0 до RAND_MAX
int rand(void);
void srand(unsigned int); /* смена начальной точки генератора */
Пример.
#include <stdlib.h>
#include <time.h>
int i,j;
srand( (unsigned)time( NULL ));
i = rand(); /* 41 */
j = rand(); /* 18467 */
Базовый генератор: линейный конгруэнтный метод
Xn+1 = (M*Xn+C) mod m
Программирование и информатика: Лекция 514.11.2019 17
Пример генератора псевдослучайных чисел
#define RAND_MAX 32767
static unsigned long int next = 1;
int rand(void)
{
next = next * 1103515245 + 12345;
return (unsigned int)(next/65536) % RAND_MAX;
}
void srand(unsigned int seed)
{
next = seed;
}
Программирование и информатика: Лекция 514.11.2019 18
Вещественные числа на интервале [0, 1]
double r;
r = (double) rand()/RAND_MAX; /* 0.171534 */
;
#define RAND_MAX 0x7fff /* (32767, Visual C */
0 … 743 … 1059 … 6493 … RAND_MAX
Программирование и информатика: Лекция 514.11.2019 19
Вещественные числа на интервале [a, b]
Линейное преобразование
ξ = α*r + β
0 1
a b
r
ξ
a = α*0 + β → β = a
b = α*1 + β → α = b - a
ξ = (b-a)*r + a
b
a
1)(1)()(
нормировки Условие
b] [a, на)(
ababdd
const
Программирование и информатика: Лекция 514.11.2019 20
Численное интегрированиеметодом Монте-Карло
Надо вычислить определенный интеграл:
dfab
abdf
b
a
b
a
)()(
1)()(
N
i
i
b
aN
fabdfab
1
)()()()()(
Среднее значение
функции f() на [a,b]
ab
1)(
Пусть - случайная величина, равномерно
распределенная на [a, b], т.е.
Программирование и информатика: Лекция 514.11.2019 21
Приближенное вычисление определенного интеграла методом Монте-Карло
1. Исходная задача – регулярная! Псевдослучайные
числа используются для ее приближенного решения.
2. Возможно, не самый лучший способ численного
интегрирования. Особенно для одномерных
интегралов.
b
a
N
i
ifN
abdf
1
)()(
)(
Программирование и информатика: Лекция 514.11.2019 22
Обобщение на многомерное интегрирование
b
a
N
i
ii
d
c
fN
cdabddf
1
),())((
),(
Двумерный интеграл
ab
1)(
сd
1)(
Пример: вычисление числа π
Программирование и информатика: Лекция 514.11.2019 23
Вычисление числа π методом Монте-Карло
b
a
d
c
cdabdd ))((
Сведем задачу к двумерному интегралу выбором f(ξ, η)
Если f(ξ, η) ≡ 1, то
x
y
a b
c
d
Используя f(ξ, η), нужно выделить круг
единичного радиуса R = 1
x
y
и посчитать его площадь S = π
R
Программирование и информатика: Лекция 514.11.2019 24
Вычисление числа π методом Монте-Карло
x
y
1,0
1,1),(
22
22
yx
yxyxf
R
-1
-1 1
1
1
1 1
1
1
),(4
),(N
i
iifN
dydxyxf
]1,1[,
Программирование и информатика: Лекция 514.11.2019 25
Вычисление числа π методом Монте-Карло
x
y
-1
-1 1
1double pi, x, y;
int i, icircle, N = 10000;
for(i=1, icircle=0; i<=N; i++)
{
x = rand()/(double)RAND_MAX*2.-1.;
y = rand()/(double)RAND_MAX*2.-1.;
if (x*x+y*y <= 1) icircle++;
}
pi = 4*(double)icircle/(double)N;
printf("\n pi = %10.4f", pi);
pi = 3.1464
N = 1 000 000 pi = 3.1414
http://en.wikipedia.org/wiki/Monte_Carlo_method
Программирование и информатика: Лекция 514.11.2019 26
Качество псевдослучайных чисел.Гистограммы распределений
nk
ξ ξ
const)(],1,0[ Число испытаний
(чисел) N = 100
10 10 10 10 10 10 10 10 10 10
0
10
20
30
40
50
60
0.5 0.15 0.25 0.35 0.45 0.55 0.65 0.75 0.85 0.950.05
10
50
40
0 0 0 0 0 0 00
10
20
30
40
50
60
0.5 0.15 0.25 0.35 0.45 0.55 0.65 0.75 0.85 0.950.05
Программирование и информатика: Лекция 514.11.2019 27
Гистограмма для 100 псевдослучайных чисел, равномерно распределенных на
отрезке [0, 1]
nk
ξ
]1,0[Число испытаний
(чисел) N = 100
11 108
119
12 10 10 11 10
0
10
20
30
40
50
60
0.5 0.15 0.25 0.35 0.45 0.55 0.65 0.75 0.85 0.950.05
Программирование и информатика: Лекция 514.11.2019 28
Тестирование генераторов. χ2-критерий
nk
ξ
r
k k
kk
n
nny
1 T
2
T
правдоподобности гипотезы о
некотором распределении
1 … k … r
kk Npn T
При N → ∞ сходится по вероятности
к χ2-распределению с r-1 степенями
свободы
Статистика y слишком велика – плохо!
Статистика y слишком мала – плохо!
Таблицы «хороших» значений для разных N и r
11 10 811 9 12 10 10 11 10
0
10
20
30
40
50
60
0.5 0.15 0.25 0.35 0.45 0.55 0.65 0.75 0.85 0.950.05
Программирование и информатика: Лекция 514.11.2019 29
Тестирование генераторов. K-равномерность
0 1
0 1
ξi
1
ξi, ξi+11 - равномерность
2 - равномерность
0 1
1
1
3 - равномерность
Известны датчики, для которых
ξk+2 = α ξk+1 + βξk
Программирование и информатика: Лекция 514.11.2019 30
int randbad()
{
int i;
static int count = 0, i1,i2;
switch (++count)
{
case 1: return (i1 = rand());
case 2: return (i2 = rand());
case 3: i = (i1 + i2)/2;
count = 0;
return i;
}
}
«Плохой» генератор псевдослучайных чисел
2
213
Программирование и информатика: Лекция 514.11.2019 31
Вычисление числа π с использованием «плохого» генератора
x
y
-1
-1 1
1double pi, x, y;
int i, icircle, N = 10000;
for(i=1, icircle=0; i<=N; i++)
{
x = randbad()/(double)RAND_MAX*2.-1.;
y = randbad()/(double)RAND_MAX*2.-1.;
if (x*x+y*y <= 1) icircle++;
}
pi = 4*(double)icircle/(double)N;
printf("\n pi = %10.4f", pi);
pi = 3.4192
Программирование и информатика: Лекция 514.11.2019 32
-1.0 -0.5 0.0 0.5 1.0
-1.0
-0.5
0.0
0.5
1.0
y
x
-1.0 -0.5 0.0 0.5 1.0
-1.0
-0.5
0.0
0.5
1.0
y
x
randbad() rand ()
N = 100
pi = 3.52 pi = 3.28
pi = 3.4040N = 1 000 000 pi = 3.1414
Распределение «плохих» чисел на плоскости
Программирование и информатика: Лекция 514.11.2019 33
Псевдослучайные числа с нормальным распределением
2
2
2
)(
22
1)(:
a
e
aaa),( aaa
Программирование и информатика: Лекция 514.11.2019 34
Генерация псевдослучайных чисел с нормальным распределением (0,1). Способ 1
1)()(]1,[0, Пусть 2121
a
212
211
ln2)2cos(
ln2)2sin(
Преобразование Бокса — Мюллера
Программирование и информатика: Лекция 514.11.2019 35
Генерация псевдослучайных чисел с нормальным распределением (0,1)
14
1
3
1
4
1
2
1
062
16
]1,0[2
16
12
1
12
1
2
212
1
222
12
1
12
1
12
1
12
1
kk
kk
k
k
kk
k
k
k
k
k
k
В соответствии с ЦПТСпособ 2
Программирование и информатика: Лекция 514.11.2019 36
Общая схема имитационного моделированияметодом Монте-Карло
1. Разыгрывание событий в соответствии с их
вероятностями (псевдослучайные числа)
2. Имитация распространения частицы,
регистрация в плоскости наблюдения
3. Многократное повторение опыта
4. Усреднение результатов
Программирование и информатика: Лекция 514.11.2019 37
Текущее среднее
Пусть x1, x2, …, xN – случайные числа
Оценка среднего по конечному числу реализаций N:
N
xx
N
N
N
x
N
x
N
N
N
x
N
x
N
Nxxx
x
N
N
N
N
i
N
N
i
N
N
i
N
i
N
1
1
1
i
1
1
i
1
1
i
1
i
1
1
1
1
1
NN
Программирование и информатика: Лекция 5
0 1P1
14.11.2019 38
Прямое имитационное моделирование физических явлений и процессов
Пример 1.
122
111
1)(
),,,()(
PAP
trPAP
События
A1 – поглощение
A2 – рассеяние
),,,()(
trlсв
ξ = (double)rand()/RAND_MAX;
if (ξ<P1) ->A1
else ->A2
свсвсв lll -
10
00
11
11
|)()( PddPPP
PP
Программирование и информатика: Лекция 514.11.2019 39
Прямое имитационное моделирование.Результат статистических испытаний
x, см
Программирование и информатика: Лекция 514.11.2019 40
Перколяция или задача о протекании
Пример 2. Перколяция (задача о протекании)
Решетка – N*N ячеек (N = 7)
«Занятая» ячейка
– вероятность p (p = 0,33)
«Свободная» ячейка – (1-p)
Кластер
– соседние занятые ячейки
Стягивающий кластер
Программирование и информатика: Лекция 514.11.2019 41
Вероятность образования стягивающего кластера
Реализация решетки с N = 25 и p = 0,7
Есть стягивающий кластер!M - число реализаций решетки
Мст – число реализаций со
стягивающим кластером
Pст ≈ Мст / M
Pст
p
1
1
p*геометрический фазовый переход
0
Программирование и информатика: Лекция 514.11.2019 42
Литература
1. Н.Н. Калиткин. Численные методы. – BHV, 2011, 592 с.
1. И.М. Соболь. Метод Монте-Карло. – М.: Наука, 1968, 64 с.
2. К. Биндер, Д.В. Хеерман. Моделирование методом Монте-Карло в статистической физике. М.: Наука, 1995.
Программирование и информатика: Лекция 5
void function(void)
{
int i = 0;
static int j = 0;
printf ("\n i = %d, j = %d", i++, j++);
}
int main(int argc, char* argv[])
{
function();
function();
}
Язык Си. Автоматические и статические переменные. Время «жизни»
i = 0 j = 0
i = 0 j = 1
53