Саратовського державного соціально-ЕКОНОМІЧНИЙ УНІВЕРСИТЕТ
ФАКУЛЬТЕТ ІНФОРМАТИКИ ТА ІНФОРМАЦІЙНИХ ТЕХНОЛОГІЙ
Курсова робота
Обчислення інтегралів МЕТОДОМ МОНТЕ - КАРЛО
Виконав:
Керівник:
Саратов, 2009
ЗМІСТ
ВСТУП
1. МАТЕМАТИЧНЕ ОБГРУНТУВАННЯ АЛГОРИТМУ ОБЧИСЛЕННЯ ІНТЕГРАЛА
1.1 Принцип роботи методу Монте - Карло
1.2 Застосування методу Монте - Карло для обчислення n - мірного інтеграла.
1.3 Сплайн - інтерполяція
1.4 Алгоритм розрахунку інтеграла
2. Генератор псевдовипадкових чисел
2.1 Генератор псевдовипадкових чисел стосовно методу Монте - Карло.
2.2 Алгоритм генератора псевдовипадкових чисел
2.3 Перевірка рівномірності розподілу генератора псевдовипадкових чисел.
ВИСНОВОК
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ
ВСТУП
Метою даної роботи є створення програмного продукту для участі в конкурсі, проведеному групою компаній «Траст» зі створення програмних розробок. Для реалізації було вибрано наступне технічної завдання:
Завдання 12 Обчислення інтегралів методом Монте - Карло.
Мета:
Реалізація генератора випадкових чисел для методу Монте - Карло.
Порівняння рівномірного розподілу і спеціально розробленого.
Обчислення тестового багатовимірного інтеграла в складній області.
Продукт:
Програмний код у вигляді функції на мові С + + або Fortran.
Тестові приклади у вигляді програми, що викликають реалізовані функції.
Огляд використаної літератури.
Для реалізації даного технічного завдання була обрана мова C + +. Код реалізований в інтегрованому середовищі розробки додатків Borland C + + Builder Enterprises і математично обгрунтований відповідний спосіб обчислення інтеграла.
1. МАТЕМАТИЧНЕ ОБГРУНТУВАННЯ АЛГОРИТМУ ОБЧИСЛЕННЯ ІНТЕГРАЛА
1.1 Принцип роботи методу Монте - Карло
Датою народження методу Монте - Карло визнано вважати 1949 рік, коли американські учені Н. Метрополіс і С. Услам опублікували статтю під назвою «Метод Монте - Карло», в якій були викладені принципи цього методу. Назва методу походить від назви міста Монте - Карло, який славився своїми гральними закладами, неодмінним атрибутом яких була рулетка - одне з найпростіших засобів отримання випадкових чисел з хорошим рівномірним розподілом, на використанні яких заснований цей метод.
Метод Монте - Карло це статистичний метод. Його використовують при обчисленні складних інтегралів, рішення систем алгебраїчних рівнянь високого порядку, моделюванні поведінки елементарних частинок, в теоріях передачі інформації, при дослідженні складних економічних систем.
Суть методу полягає в тому, що в завдання вводять випадкову величину , Що змінюється по якому те правилом . Випадкову величину вибирають таким чином, щоб бажана в задачі величина стала математичним очікування від , Тобто .
Таким чином, шукана величина визначається лише теоретично. Щоб знайти її чисельно необхідно скористатися статистичними методами. Тобто необхідно взяти вибірку випадкових чисел обсягом . Потім необхідно обчислити вибіркове середнє варіанту випадкової величини за формулою:
. (1)
Обчислене вибіркове середнє приймають за наближене значення .
Для отримання результату прийнятної точності необхідна велика кількість статистичних випробувань.
Теорія методу Монте - Карло вивчає способи вибору випадкових величин для вирішення різних завдань, а також способи зменшення дисперсії випадкових величин.
1.2 Застосування методу Монте - Карло для обчислення n - мірного інтеграла.
Розглянемо n - мірний інтеграл
для . (2)
Будемо вважати, що область інтегрування , І що обмежене безліч в . Отже, кожна точка х безлічі має n координат: .
Функцію візьмемо таку, що вона обмежена зверху і знизу на безлічі : .
Скористаємося обмеженістю безлічі і впишемо його в деякий n - мірний паралелепіпед , Наступним чином:
,
де - Мінімуми і максимуми, відповідно, - Ой координати всіх точок безлічі : .
Доопределяется подинтегральную функцію таким чином, щоб вона зверталася в нуль в точках паралелепіпеда , Які не належать :
(3)
Таким чином, рівняння (2) можна записати у вигляді
. (4)
Область інтегрування являє собою n - мірний паралелепіпед зі сторонами паралельними осям координат. Даний паралелепіпед можна однозначно задати двома вершинами , Які мають наймолодші та найстарші координати всіх точок паралелепіпеда.
Позначимо через n-мірний вектор, що має рівномірний розподіл у паралелепіпеді : , Де .
Тоді її щільність ймовірностей буде визначена таким чином
(5)
Значення подинтегральной функції від випадкового вектора буде випадковою величиною , Математичне очікування якої є середнім значенням функції на безлічі :
. (6)
Середнє значення функції на безлічі дорівнює відношенню значення шуканого інтеграла до обсягу паралелепіпеда :
(7)
Позначимо обсяг паралелепіпеда .
Таким чином, значення шуканого інтеграла можна виразити як добуток математичного сподівання функції і обсягу n - мірного паралелепіпеда :
(8)
Отже, необхідно знайти значення математичного очікування . Його наближене значення можна знайти провівши n випробувань, отримавши, таким чином, вибірку випадкових векторів, які мають рівномірний розподіл на . Позначимо і . Для оцінки математичного сподівання скористаємося результатом
, (9)
де ,
,
- Квантиль нормального розподілу, що відповідає довірчій ймовірності .
Помноживши подвійне нерівність з (9) на одержимо інтервал для I:
. (10)
Позначимо точкову оцінку . Отримуємо оцінку (з надійністю ):
. (11)
Аналогічно можна знайти вираз для відносної похибки :
. (12)
Якщо задана цільова абсолютна похибка , З (11) можна визначити обсяг вибірки, що забезпечує задану точність і надійність:
. (13)
Якщо задана цільова відносна похибка, з (12) отримуємо аналогічне вираз для об'єму вибірки:
. (14)
1.3 Сплайн - інтерполяція.
У даному програмному продукті реалізована можливість задавати додаткові обмеження області інтегрування двома двовимірними сплайн - поверхнями (для подинтегральной функції розмірності 3). Для завдання цих поверхонь використовуються двовимірні сплайни типу гнучкої пластинки \ 4 \.
Під сплайном (від англ. Spline - планка, рейка) зазвичай розуміють агрегатну функцію, збігається з функціями більш простої природи на кожному елементі розбиття своєї області визначення. Сплайн - функція має наступний вигляд:
. (15)
Вихідні дані є трійок точок .
Коефіцієнти і визначаються із системи:
, (16)
де ,
.
1.4 Алгоритм розрахунку інтеграла
Реалізований алгоритм включає наступні кроки:
вибирається початкове значення , Розігруються випадкові вектори з і визначаються і ;
в залежності від виду похибки (абсолютна, відносна) визначається досягнута похибка; якщо вона менше цільової, обчислення переривається;
за формулами (13) або (14) обчислюється новий обсяг вибірки;
обсяг вибірки збільшується на 20%
перехід до кроку 1;
кінець.
2. Генератор псевдовипадкових чисел
2.1 Генератор псевдовипадкових чисел стосовно методу Монте - Карло.
У будь-якому алгоритмі використовує метод Монте - Карло генератор псевдовипадкових чисел відіграє дуже важливу роль. Ступінь відповідності псевдовипадкових чисел заданому розподілу є важливим фактором проведення якісних статистичних випробувань.
2.2 Алгоритм генератора псевдовипадкових чисел
У програмі реалізований конгруентний метод генерації псевдовипадкових чисел \ 3 \:
, (17)
де = 8192,
= 67101323.
Авторський код, який реалізує захист від переповнення був, реалізований на С + +. Перед використання перші три числа послідовності видаляються. Для отримання чисел з інтервалу (0,1) усі числа діляться на .
2.3 Перевірка рівномірності розподілу генератора псевдовипадкових чисел.
Перевірка рівномірності розподілу псевдовипадкових чисел проводилася за допомогою стандартного критерію χ 2 \ 2 \.
Були використані 3 послідовності псевдовипадкових чисел, що визначаються стартовими значеннями 1, 1001, 1000000 довжиною 300000.
Інтервал (0,1) поділяються на 50 рівних інтервалів і програмно підраховувалися абсолютні частоти (рис. 1).
Рис. 1
Результати перевірки наведено в Таблиці 1.
Таблиця 1
стартове значення ГВЧ | |||
1 | 1001 | 1000000 | |
хі-квадрат | 44.0533333333333 | 45.007 | 48.618 |
df | 50 | 50 | 50 |
p-значення | 0.709735881642893 | 0.673522612551685 | 0.528941919633451 |
Отже, рівномірність розподілу не відкидається на рівні 5%.
ВИСНОВОК
На закінчення можна сказати, що поставлене завдання було повністю виконано. Тобто на мові С + + було розроблено генератор псевдовипадкових чисел, функція розраховує інтеграл методом Монте - Карло (Додаток 1); був проведений розрахунок тестових багатовимірних інтегралів (Додаток 2); в інтегрованому середовищі розробки додатків Borland C + + Builder Enterprises 7.0 був створений програмний продукт «CarloS», який реалізує описані вище алгоритми (Додаток 3).
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ
Бережна Є. В., Бережний В. І. Математичні методи моделювання економічних систем. - М.: Фінанси і статистика, 2001. - 368 с.
Мюллер П., Нойман П., Шторм Р. Таблиці з математичної статистики. - М.: Фінанси і статистика, 1982. - 278 с.
Теннант-Сміт Дж. Бейсік для статистиків. - М.: Мир, 1988. - 208 с.
Baranger J. Analyse numérique. Hermann, 1991.
Маделунга Е. Математичний апарат фізики. Довідкове керівництво. М.: Наука, 1968., С.287.
В.Є. Гмурман Теорія ймовірностей і математична статистика - М.: Вища школа, 2003
ДОДАТОК 1
Лістинг ОСНОВНИХ ФУНКЦІЙ
Лістинг 1 Функція розрахунку інтеграла
void integral ()
{
/ / Обчислення інтеграла методом Монте - Карло
/ / Розмірність області інтегрування
unsigned d_int = fun_dim;
//----- 3 d графік ---------------------------------------- ----------------
/ / Максимальне число трійок
unsigned plot_dim_max = 10000;
/ / Матриця трійок
pmatd xyz, xyz_tmp;
if (d_int == 3) xyz = new matd (plot_dim_max, 3);
//------------------------------------------------ -------------------------
/ / Індикатор відносної похибки
mcres.relok = Read1double ("error_type.txt");
/ / Цільова похибка
mcres.dlt_int = Read1double ("error_value.txt");
/ / Номер стандартного значення довірчої ймовірності (починаючи з 0)
int nome_int = Read1double ("error_omega.txt");
/ / ГВЧ
unsigned long b = m_rng * m_rng-d_rng, c, r, i, PSChunk;
/ / "Паросток" ГВЧ
mcres.rng_seed = Read1double ("rng_seed.txt");
pmatd fun_b, fun_A, con_b, con_A, con_U, con_v, \
a_int, b_int, ba_int, x_int, xyz_top, xyz_bottom;
unsigned j, ii, jj, con_ok;
struct date dat;
struct time tim;
pspl2d sp_top, sp_bottom;
/ / Квантилі нормального розподілу
double omegas _ int [6] = {0.9,0.95,0.99,0.999,0.9999,0.99999};
double zs_int [6] = {1.64485362695147,1.95996398454005,2.5758293035489, \
3.29052673149191, 3.89059188641317, 4.4171734134667};
mcres.omega_int = omegas_int [nome_int];
mcres.z_int = zs_int [nome_int];
double fun_cd, con_wd, fu_int, con_sum, sum1_int, sum2_int;
/ / Вид інтегрованої функції
/ / 0 - постійна
/ / 1 - лінійна
/ / 2 - квадратична
mcres.fun_type = Read1double ("fun_kind.txt");
/ / Вид системи обмежень
/ / 0 - відсутні (весь паралелепіпед)
/ / 1 - лінійні
/ / 2 - квадратичне
/ / 3 - сплайн - поверхні
mcres.con_type = Read1double ("con_type.txt");
/ / Завантаження параметрів інтегрованої функції
switch (mcres.fun_type)
{
case 2: fun_A = new matd ("fun_A.txt");
case 1: fun_b = new matd ("fun_b.txt");
case 0: fun_cd = Read1double ("fun_c.txt");
}
/ / Завантаження параметрів обмежень
switch (mcres.con_type)
{
case 3: / / сплайн - поверхні
/ / Верхня
xyz_top = new matd ("xyz_top.txt");
/ / Нижня
xyz_bottom = new matd ("xyz_bottom.txt");
/ / Двовимірна інтерполяція
sp_top = new spl2d (xyz_top);
sp_bottom = new spl2d (xyz_bottom);
break;
case 2: / / квадратична функція обмежень
con_U = new matd ("con_U.txt");
con_v = new matd ("con_v.txt");
con_wd = Read1double ("con_w.txt");
break;
case 1: / / лінійні обмеження
con_b = new matd ("con_b.txt"); con_A = new matd ("con_A.txt");
}
/ / Осяжний паралелепіпед
a_int = new matd ("con_xmin.txt");
b_int = new matd ("con_xmax.txt");
/ / Різниця меж паралелепіпеда
ba_int = new matd;
ba_int = & (* b_int - (* a_int));
/ / Аргумент інтегрованої функції
x_int = new matd (d_int, 1);
/ / Обсяг осяжний паралелепіпеда
mcres.V0_int = 1;
for (j = 1; j <= d_int; j + +)
{
if (_p (ba_int, j, 1) <= 0)
{
DbBox ("Нижня межа осяжний паралелепіпеда вище верхньої для \
координати ", j);
goto clean_exit;
}
mcres.V0_int = mcres.V0_int * _p (ba_int, j, 1);
}
/ / Початковий обсяг вибірки
mcres.n1_int = 10000;
/ / Основний цикл для досягнення заданої точності
/ / Число ітерацій, що необхідний для досягнення заданої точності
mcres.n_ite = 0;
getdate (& dat); gettime (& tim); mcres.t_start = dostounix (& dat, & tim);
WaitForm-> Show ();
while (1)
{
mcres.n_ite + +;
WaitForm-> Edit1-> Text = mcres.n_ite;
WaitForm-> Edit2-> Text = mcres.n1_int;
WaitForm-> ProgressBar1-> Position = 0;
WaitForm-> Refresh ();
/ / Генерація випадкових точок і накопичення суми
sum1_int = 0; sum2_int = 0;
mcres.in_G_int = 0;
PSChunk = long (mcres.n1_int/50.0);
/ / Запуск ГВЧ
r = mcres.rng_seed;
for (i = 1; i <3; i + +)
{
c = int (r / m_rng);
r = b * c + m_rng * (r-m_rng * c);
if (r> d_rng) r = r-d_rng;
}
for (i = 1; i <= mcres.n1_int; i + +)
{
/ / Випадковий вектор
for (j = 1; j <= d_int; j + +)
{
/ / Випадкове число
c = int (r / m_rng);
r = b * c + m_rng * (r-m_rng * c);
if (r> d_rng) r = r-d_rng;
_p (x_int, j, 1) = _p (a_int, j, 1) + _p (ba_int, j, 1) * double (r) / d_rng;
}
/ / Прогрес
if (! (i% PSChunk))
{
WaitForm-> ProgressBar1-> Position = 100.0 * (i-1) / (mcres.n1_int-1);
WaitForm-> Refresh ();
}
/ / Перевірка обмеження
con_ok = 1;
switch (mcres.con_type)
{
case 3: / / сплайн - поверхні
if ((_p (x_int, 3,1) <sp_bottom-> f (_p (x_int, 1,1), \
_p (x_int, 2,1 )))||(_ p (x_int, 3,1)> sp_top-> f (_p (x_int, 1,1), _p (x_int, 2,1)))) con_ok = 0 ;
break;
case 2: / / квадратична функція обмежень
con_sum = 0;
for (ii = 1; ii <= d_int; ii + +)
for (jj = 1; jj <= d_int; jj + +)
if (_p (con_U, ii, jj)! = 0)
con_sum + = _p (x_int, ii, 1) * _p (con_U, ii, jj) * _p (x_int, jj, 1);
for (ii = 1; ii <= d_int; ii + +)
if (_p (con_v, ii, 1)! = 0)
con_sum + = _p (con_v, ii, 1) * _p (x_int, ii, 1);
if (con_sum> con_wd) con_ok = 0;
break;
case 1: / / лінійна функція обмежень
for (ii = 1; ii <= con_A-> nl; ii + +)
{
con_sum = 0;
for (jj = 1; jj <= d_int; jj + +)
con_sum + = _p (con_A, ii, jj) * _p (x_int, jj, 1);
if (con_sum> _p (con_b, ii, 1)) {con_ok = 0; break;}
}
}
fu_int = 0;
if (con_ok! = 0)
{
mcres.in_G_int + +;
/ / Точки 3d графіка
if (d_int == 3)
if (mcres.in_G_int <= plot_dim_max)
{
_p (xyz, mcres.in_G_int, 1) = _p (x_int, 1,1);
_p (xyz, mcres.in_G_int, 2) = _p (x_int, 2,1);
_p (xyz, mcres.in_G_int, 3) = _p (x_int, 3,1);
}
/ / Значення інтегрованої функції
switch (mcres.fun_type)
{
case 2: / / квадратичний член
for (ii = 1; ii <= d_int; ii + +)
for (jj = 1; jj <= d_int; jj + +)
if (_p (fun_A, ii, jj)! = 0)
fu_int + = _p (x_int, ii, 1) * _p (fun_A, ii, jj) * _p (x_int, jj, 1);
case 1: / / лінійний член
for (ii = 1; ii <= d_int; ii + +)
if (_p (fun_b, ii, 1)! = 0)
fu_int + = _p (fun_b, ii, 1) * _p (x_int, ii, 1);
case 0: / / постійна
fu_int + = fun_cd;
}
}
sum1_int + = fu_int; sum2_int + = fu_int * fu_int;
}
/ / Оцінка мат. очікування і дисперсії
mcres.f1_int = sum1_int/mcres.n1_int;
mcres.vari_int = (sum2_int-sum1_int * sum1_int/mcres.n1_int) / (mcres.n1_int-1);
/ / Розрахунок похибки
if (mcres.relok == 0)
{
/ / Абсолютна похибка
mcres.deltar = mcres.V0_int * mcres.z_int * sqrt (mcres.vari_int/mcres.n1_int);
}
else
{
/ / Відносна похибка
if (mcres.f1_int! = 0)
{
mcres.deltar = mcres.z_int / fabs (mcres.f1_int) * sqrt (mcres.vari_int/mcres.n1_int);
}
else
{
/ / Форма результатів
mcres. inte _ int = 0;
mcres.deltar = 0;
getdate (& dat); gettime (& tim); mcres.t_end = dostounix (& dat, & tim);
mcres.t_calc = mcres.t_end-mcres.t_start;
InfoBox ("Оцінка інтеграла = 0 (обрана относ. Похибка), обчислення \
перервано. ");
ResultForm-> Show ();
WaitForm-> Close ();
goto clean_exit;
}
}
WaitForm-> Edit3-> Text = mcres.deltar;
WaitForm-> Refresh ();
if (mcres.deltar <mcres.dlt_int)
{
/ / Точність достатня
mcres.inte_int = mcres.V0_int * mcres.f1_int;
getdate (& dat); gettime (& tim); mcres.t_end = dostounix (& dat, & tim);
mcres.t_calc = mcres.t_end-mcres.t_start;
ResultForm-> Show ();
break;
}
/ / Обчислення нового обсягу вибірки
if (mcres.relok == 0)
{
/ / Абс. Похибка
mcres.n1_int = ceil (mcres.vari_int * pow (mcres.V0_int * mcres.z_int / mcres.dlt_int, 2));
}
else
{
/ / Отн. Похибка
mcres.n1_int = ceil (mcres.vari_int * pow (mcres.z_int/mcres.dlt_int/mcres.f1_int, 2));
}
/ / Коректування обсягу вибірки в більшу сторону
/ / Для скорочення числа ітерацій
mcres.n1_int = 1.2 * mcres.n1_int;
/ / Мінімальний обсяг вибірки
if (mcres.n1_int <1000) mcres.n1_int = 1000;
} / / Кінець основного циклу
WaitForm-> Close ();
/ / 3d графік
if (d_int == 3)
{
if (mcres.in_G_int == 0)
{
/ / Безліч точок порожньо
Zero_File ("xyz.txt");
}
else
if (mcres.in_G_int <xyz-> nl)
{
/ / Точок не набралося, щоб заповнити матрицю
xyz_tmp = new matd (mcres.in_G_int, 3);
for (i = 1; i <= mcres.in_G_int; i + +)
{
_p (xyz_tmp, i, 1) = _p (xyz, i, 1);
_p (xyz_tmp, i, 2) = _p (xyz, i, 2);
_p (xyz_tmp, i, 3) = _p (xyz, i, 3);
}
xyz_tmp-> txprint ("xyz.txt");
delete xyz_tmp;
}
else
{
/ / Вся матриця заповнена
xyz-> txprint ("xyz.txt");
}
} / / Кінець d_int == 3
clean_exit:
/ / Очищення пам'яті
if (d_int == 3) delete xyz;
switch (mcres.fun_type)
{
case 2: delete fun_A;
case 1: delete fun_b;
}
switch (mcres.con_type)
{
case 3: delete xyz_top, xyz_bottom, sp_top, sp_bottom; break;
case 2: delete con_U, con_v; break;
case 1: delete con_b, con_A;
}
delete a_int, b_int, ba_int, x_int;
} / / Integral
Листинг 2 структура для зберігання результатів розрахунку інтеграла
struct mcres_struct
{
/ / Індикатор відносної похибки
int relok;
/ / Цільова похибка
double dlt_int;
/ / Досягнута похибка
double deltar;
/ / Довірча ймовірність
double omega_int;
/ / Квантиль норм. розподілу
double z_int;
/ / "Паросток" ГВЧ
unsigned long rng_seed;
/ / ÷ число ітерацій, що необхідний для досягнення заданої точності
unsigned n_ite;
/ / Обсяг вибірки на останній ітерації
unsigned long n1_int;
/ / Число точок потрапили в область інтегрування
unsigned in_G_int;
/ / Інтеграл
double inte_int;
/ / Обсяг осяжний паралелепіпеда
double V0_int;
/ / Вибіркове середнє
double f1_int;
/ / Вибіркова дисперсія
double vari_int;
/ / Час початку рахунки
time_t t_start;
/ / Час закінчення рахунку
time_t t_end;
/ / Тривалість обчислення інтеграла
time_t t_calc;
/ / Вид інтегрованої функції
int fun_type;
/ / Вид системи огрніченій
int con_type;
}; / / Mcres_struct
ДОДАТОК 2
ТЕСТОВІ ПРИКЛАДИ
Приклад 1 Інтеграл від квадратичної функції по 3-мірному симплекс.
Точне значення інтеграла:
Наближене значення знайдено для цільової абсолютної похибки 0.00001.
Похибка: 0.000034416630896 або 0.014749984670%.
Приклади 2-10 Обсяги багатовимірних куль
Точні і наближені обсяги багатовимірних куль наведено в таблиці нижче.
| Обсяг точніше 1 | Обсяг наближений 2 | Оцінений CarloS 3 | Відносна похибка,% |
2 |
| 3.1415926535897932385 | 3.1504 | 0.280346543342 |
3 |
| 4.1887902047863909846 | 4.2032 | 0.344008520578 |
4 |
| 4.9348022005446793096 | 4.98099547511312 | .936071451118 |
5 |
| 5.2637890139143245968 | 5.18913116403891 | -1.4183290720439 |
6 |
| 5.1677127800499700296 | 5.16153372226575 | -. 1195704569352 |
7 |
| 4.7247659703314011698 | 4.70163814726423 | -. 4895019819476 |
8 |
| 4.0587121264167682184 | 3.98117943332154 | -1.9102782035357 |
9 |
| 3.2985089027387068695 | 3.30542485033746 | .209668908064 |
10 |
| 2.5501640398773454440 | 2.55096385956571 | .31363460384 E-1 |
1 Джерело [5], с. 287.
2 Обчислено в Maple (20 значущих цифр).
3 Розрахунок з цільовою відносною похибкою 2%