Вычисление интегралов методом Монте-Карло
Автор работы: Пользователь скрыл имя, 24 Ноября 2013 в 19:41, курсовая работа
Описание работы
Введение…………………………………………………………………..3
1. Моделирование случайных величин
1.1. Распределение случайной величины…………………………4
1.2. Моделирующие формулы……………………………………..5
2. Метод Монте-Карло
2.1. Общая схема метода Монте-Карло…………………………...6
2.2. Оценка погрешности метода…………………………………..7
3. Вычисление интегралов методом Монте-Карло
3.1. Вычисление стандартных интегралов………………………...8
3.2. Вычисление кратных интегралов...…....……………………...9
3.3. Решение интегрального уравнения Вольтерра………………
Содержание работы
Введение…………………………………………………………………..3
1. Моделирование случайных величин
1.1. Распределение случайной величины…………………………4
1.2. Моделирующие формулы……………………………………..5
2. Метод Монте-Карло
2.1. Общая схема метода Монте-Карло…………………………...6
2.2. Оценка погрешности метода…………………………………..7
3. Вычисление интегралов методом Монте-Карло
3.1. Вычисление стандартных интегралов………………………...8
3.2. Вычисление кратных интегралов...…....……………………...9
3.3. Решение интегрального уравнения Вольтерра………………
Файлы: 1 файл
Курсовая работа.doc
— 258.00 Кб (Скачать файл)bord: tBorders; {массив границ интегрирования}
begin
randomize;
writeln('Выберите распределение случайной величины:');
writeln('1 - Равномерное распределение');
writeln('2 - Нормальное распределение');
writeln('3 - Экспоненциальное распределение');
writeln('4 - Бета распределение');
writeln('5 - Гамма-распределение');
readln(r);
Readln(mul);
for i := mul downto 1 do begin
write('нижняя граница: ', mul-i+1, ' = ');
Readln(bord[i].bottom); {i-я нижняя граница интегрирования}
write('верхняя граница ', mul-i+1, ' = ');
Readln(bord[i].top); {i-я верхняя граница интегрирования}
end;
write('Количество испытаний = ');
readln(n);
case r of
1:
{вычисление интеграла по
begin
sum := 0;
sum2 := 0;
for i := 1 to n do
begin
pMult := 1;
for j := 1 to mul do begin
ksi[j]:= bord[j].bottom + (bord[j].top - bord[j].bottom) * random;
pMult := pMult * pMultipleUniformDist(j, bord);
end;
val := f(ksi, bord, mul) / pMult ;
sum := sum + val;
sum2 := sum2 + val * val;
end;
writeln('Результат: ', sum / n: 0: 8);
disp := (sum2 - sum * sum / n) / n;
writeln('Ошибка: ', 3 * sqrt(disp / n): 0: 8);
readln;
end;
2: {вычисление интеграла по нормальному распределению}
begin
sum := 0;
sum2 := 0;
for i := 1 to n do
begin
pMult := 1;
for j := 1 to mul do begin
ksi[j] := randomValueNormDist;
pMult := pMult * pNormDist(ksi[j]);
end;
val := f(ksi, bord, mul) / pMult;
sum := sum + val;
sum2 := sum2 + val * val;
end;
writeln('Результат: ', sum / n: 0: 8);
disp := (sum2 - sum * sum / n) / n;
writeln('Ошибка: ', 3 * sqrt(disp / n): 0: 8);
readln;
end;
3: {вычисление интеграла по экспоненциальному распределению}
begin
write('L = ');
readln(L);
sum := 0;
sum2 := 0;
for i := 1 to n do
begin
pMult := 1;
for j := 1 to mul do begin
alpha := random;
ksi[j] := randomValueExpDist(L);
pMult := pMult * pExpDist(ksi[j], L);
end;
val := f(ksi, bord, mul) / pMult;
sum := sum + val;
sum2 := sum2 + val * val;
end;
writeln('Результат: ', sum / n: 0: 8);
disp := (sum2 - sum * sum / n) / n;
writeln('Ошибка: ', 3 * sqrt(disp / n): 0: 8);
readln;
end;
4:
{вычисление интеграла по бета-
begin
write('p = ');
readln(p);
write('m = ');
readln(m);
sum := 0;
sum2 := 0;
for i := 1 to n do
begin
pMult := 1;
for j := 1 to mul do begin
alpha := random;
ksi[j] := randomValueBetaDist(m, p);
pMult := pMult * pBetaDist(ksi[j], p, m);
end;
val := f(ksi, bord, mul) / pMult;
sum := sum + val;
sum2 := sum2 + val * val;
end;
writeln('Результат: ', sum / n: 0: 8);
disp := (sum2 - sum * sum / n) / n;
writeln('Ошибка: ', 3 * sqrt(disp / n): 0: 8);
readln;
end;
5:
{вычисление интеграла по
begin
write('W= ');
readln(W);
write('B= ');
readln(B);
sum := 0;
sum2 := 0;
for i := 1 to n do
begin
pMult := 1;
for j := 1 to mul do begin
ksi[j] := randomValueGammaDist(W, B);
pMult := pMult * pGammaDist(ksi[j], W, B);
end;
val := f(ksi, bord, mul) / pMult;
sum := sum + val;
sum2 := sum2 + val * val;
end;
writeln('Результат: ', sum / n: 0: 8);
disp := (sum2 - sum * sum / n) / n;
writeln('Ошибка: ', 3 * sqrt(disp / n): 0: 8);
readln;
end;
end;
end;
Пример работы программы:
Вычислим интеграл
Точное значение интеграла: 0,25
Результаты расчётов программы:
Приближённое значение интеграла | ||||||||||
Равномерное распределение |
Нормальное распределение |
Экспоненциальное распределение |
Гамма-распределение |
Бета-Распределение | ||||||
Количество испытаний |
Результат |
Ошибка |
Результат |
Ошибка |
Результат |
Ошибка |
Результат |
Ошибка |
Результат |
Ошибка |
n = 10000 |
0,24817 |
0,00661 |
0,24441 |
0,03325 |
0,24338 |
0,01992 |
0,24791 |
0,00655 |
0,25613 |
0,02060 |
n = 100000 |
0,25088 |
0,00209 |
0,25316 |
0,01058 |
0,25070 |
0,00638 |
0,25013 |
0,00208 |
0,25177 |
0,00641 |
n = 1000000 |
0,25029 |
0,00066 |
0,25021 |
0,00332 |
0,25041 |
0,00202 |
0,25025 |
0,00066 |
0,25126 |
0,00202 |
Приложение 2
Программа для решения интегрального уравнения Вольтерра методом Монте-Карло (Delphi)
var
n: longint; {объём выборки}
t: double; {верхняя граница интегрирования}
sum, sum2: double; {суммы вычисленных значений и квадратов этих значений}
disp: double; {дисперсия}
t0, t1, q: double;
begin
write('top border(t) = ');
readln(t);
sum := 0;
sum2 := 0;
for i := 1 to n do begin
sum := sum + y(t);
sum2 := sum2 + y(t)*y(t);
t0 := t;
t1 := Random;
q := 1;
while (t1 < t0) do begin
q := q * a(t1);
val := y(t1)*q;
sum := sum + val;
sum2 := sum2 + val * val;
t0 := t1;
t1 := Random;
end;
end;
writeln('Результат: ', sum/n : 0: 8);
disp := (sum2 - sum * sum / n) / n;
writeln('Ошибка: ', 3 * sqrt(disp / n): 0: 8);
readln;
end;
Пример работы программы:
Вычислим интегральное уравнение Вольтерра при
Точное значение уравнения:
|
Объём выборки |
Приближённое решение уравнения |
Ошибка |
n = 100000 |
0,35856 |
0,00227 |
n = 1000000 |
0,35995 |
0,00082 |
n = 10000000 |
0,36006 |
0,00008 |
Результаты расчётов программы:
Заключение
В процессе исследований было выяснено, что метод Монте-Карло имеет несколько важных преимуществ:
- Метод прост в реализации;
- Он легко применим без предварительного анализа решаемой задачи;
- Неплохо справляется с вычислением интегралов большой кратности, которые не вычислить другими численными методами.
Также были замечены очевидные недостатки метода:
- По результатам работы программ можно заметить, что для получения хорошего результата нужно проводить сотни тысяч испытаний;
- Без наличия датчика псевдослучайных чисел метод неприменим;
- При увеличении количества испытаний погрешность расчётов убывает медленно.
Литература
- С. М. Ермаков, С. А. Михайлов «Статистическое моделирование», 1982г.
- С. М. Ермаков «Метод Монте-Карло в вычислительной математике», 2009г.