Таким образом мы определяем искомую величину лишь теоретически. А вот чтобы найти ее численно, пользуются статистическими методами: берут выборку случайной величины ξ объемом
элементов. В результате получают вариант случайной величины ξi, для которых вычисляют их среднее арифметическое (выборочное среднее)которое и принимают в качестве приближенного значения (оценки) искомой величины
:Для получения результата приемлемой точности по методу Монте-Карло требуется большое число статистических испытаний. Именно поэтому этот метод иногда так и называют: метод статистических испытаний.
Теория метода Монте-Карло изучает способы выбора случайных величин ξ для решения различных задач, а также способы уменьшения дисперсии используемых случайных величин. Уменьшение дисперсии играет большую роль, поскольку при равных объемах выборок, выборка с меньшей дисперсией имеет меньшую погрешность.
Итак, для вычисления однократного интеграла методом Монте-Карло может быть применена формула
(а)где xi равномерно распределенное на интервале [a, b] случайное число. Справедлива следующая оценка точности вычисления интеграла по формуле (а) с вероятностью p=1-η выполняется неравенство
Например, если положить p=99%, тогда η = 0.01 и можно утверждать, что с вероятностью 99% справедливо неравенство
где
Все, что нужно для вычисления интегральной суммы по формуле (1) - это научиться получать случайные числа, равномерно распределенные на интервале [a, b]. Для этой цели можно использовать генератор случайных чисел, входящий в состав стандартных библиотек, поставляемых с компилятором. С помощью функции random легко получить случайное вещественное число, равномерно распределенное на интервале [0, 1] - например, результатом выполнения оператора x=random является случайное вещественное число из интервала [0, 1]. Имея случайное вещественное число из интервала [0, 1] легко получить случайное число из любого интервала. Например, если z - случайное число из интервала [0, 1] , тогда x=a+(b-a)*z - случайное число из интервала [a, b].
Как видно из приведенных выше оценок погрешности формулы (а) точность вычисления интеграла и в методе Монте-Карло определяется числом слагаемых N в интегральной сумме - чем больше слагаемых, тем точнее результат. Ниже приведен пример и программа, вычисляющая определенный интеграл методом Монте-Карло.
Метод Монте-Карло легко обобщается на интегралы произвольной кратности. Например, двукратный интеграл может быть вычислен по формуле
где xi, yi - случайные числа, равномерно распределенные на интервалах [a, b] и [c, d] соответственно. Оценка точности вычисления интеграла по формуле (b) совершенно аналогично приведенной выше для случая однократного интеграла и поэтому здесь не приводится.
Пример №1: Вычислить определенный интеграл I =
Решение.
Точное значение интеграла I=
, ниже приведены результаты программы.Листинг программы приведен в приложении №1. Программа называется MonteKarlo.
Пример №2: Вычислить определенный интеграл I =
Решение.
Точное значение интеграла I=
, ниже приведены результаты программы.Листинг программы приведен в приложении №2. Программа называется MonteKarlo1.
Приложение №1.
Программа вычисления одномерного определенного интеграла методом Монте-Карло.
program MonteKarlo;
uses crt;
Label l1, l2;
var
j1, j, a, b, c, n1, k, n:integer;
I, Y, x:real;
Begin
randomize;
clrscr;
writeln('Vvod znachenii');
write('a = ');
Read(a);
write('b = ');
Read(b);
write('n = ');
Read(n);
writeln('--------------------------------');
writeln('| k | integral | vsego ispitani|');
for j:=1 to 9 do
begin
I:=0;
for j1:=1 to n do
begin
x:=a+(b-a)*random;
I:=I+x*x+5*x;
end;
I:=I*(b-a)/n;
writeln('--------------------------------');
writeln('| ', j, ' | ', i:2:6, ' | ', n, ' |');
{writeln(' Integral = ', i:6:7, ' vsego ispitani = ', n, ' popalo pod function = ', n1);}
end;
writeln('--------------------------------');
readkey;
end.
Приложение №2.
Программа вычисления многомерного определенного интеграла методом Монте-Карло.
program MonteKarlo2;
uses crt;
Label l1, l2;
var
j1, j, d, a, b, c, n1, k, n:integer;
I, Y, x:real;
Begin
randomize;
clrscr;
writeln('Vvod znachenii');
write('a = ');Read(a);
write('b = ');Read(b);
write('c = ');Read(c);
write('d = ');Read(d);
write('n = ');Read(n);
writeln('--------------------------------');
writeln('| k | integral | vsego ispitani|');
for j:=1 to 9 do
begin
I:=0;
for j1:=1 to n do
begin
x:=a+(b-a)*random;
y:=c+(d-c)*random;
I:=I+sqr(x)+sqr(y)*y;
end;
I:=I*(b-a)*(d-c)/n;
writeln('--------------------------------');
writeln('| ', j, ' | ', i:2:6, ' | ', n, ' |');
{writeln(' Integral = ', i:6:7, ' vsego ispitani = ', n, ' popalo pod function = ', n1);}
end;
writeln('--------------------------------');
readkey;
end.