Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЧМ_2012 / Лекции / Численные_методы.pdf
Скачиваний:
392
Добавлен:
09.06.2015
Размер:
1.99 Mб
Скачать

33

Применяя к последнему интегралу квадратурную формулу Гаусса (1), будем иметь:

b

 

 

b a

n

 

f (x)dx =

Ai f (xi )

(7)

 

 

a

2

i=1

 

xi =

b + a

+

b a

ti

(i =1, 2, K, n) ,

(8)

 

 

2

2

 

 

 

где ti — нули полинома Лежандра Pn (t) .

5) Методы Монте-Карло

Методы решения задач, использующие случайные величины, называются методами Монте-Карло.

1. Реализация простого метода.

f (x)

a=0 t1 t2 t3

tn-2 tn-1 b=1

Рис. 8. Случайно распределенные точки на [0;1]

b

 

 

x a

 

 

 

 

dx

 

 

 

1

f (x)dx =

t =

 

 

; dt

=

 

 

 

 

 

;

= (b a) f [(b a) *t + a]dt =

b a

 

b a

a

 

 

 

 

 

 

 

0

= (b a) 1 F(t)dt

 

 

 

 

 

 

 

 

 

 

 

 

0

 

 

 

 

 

 

 

 

 

 

 

 

Вычисляем интеграл

1

F(t)dt

методом прямоугольников, только в качестве

точек ti

 

 

 

 

 

 

0

 

 

 

 

 

 

 

 

берутся случайно распределенные точки на [0;1]. Шаг

интегрирования h =

10

=

1 ,

где

n - число отрезков разбиения.

 

 

 

 

 

 

 

 

 

n

 

 

n

 

 

Следовательно, окончательно имеем:

 

b

f (x)dx =

 

(b a)

* 1 F(t)dt ;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

a

 

 

n

0

 

 

 

 

 

 

 

 

 

 

34

2. Расчет методом Монте-Карло с заданной точностью

Отличие данного метода заключается в том, что мы увеличиваем количество случайных узлов ti (в 10 раз), пока не достигнем определенной точности

результата (разность между предыдущим и текущим результатом вычисления).

Задача 4.

Вычислить определенный интеграл

1

x

dx методом Монте-

1

1+ x + x2

Карло с точностью ε = 0.001.

 

 

 

Решение.

Приведем решение данной задачи в системе Scilab.

Листинг 2.6.

a = input('Введите нижний предел интегрирования'); b = input('Введите верхний предел интегрирования'); e = 0.001;

function[value] = f(x) value = x /(1+x+x^2);

endfunction

function[summa] = Monte_Karlo(a, b) n = 20;

summa = 0; for i = 0:n

t = rand();

summa = summa + f((b-a)*t+a); end

summa = summa*(b-a)/n; endfunction

integral = Monte_Karlo(a, b); integral

function[summa, n] = Monte_Karlo_e(a, b, e) n = 20;

prev_summa = 1; summa = 0;

while abs(prev_summa - summa) > e n = n*10;

prev_summa = summa; summa = 0;

for i = 0:n

t = rand();

summa = summa + f((b-a)*t+a); end

summa = summa*(b-a)/n; end

endfunction

[integral, n] = Monte_Karlo_e(a, b, e);

35

integral n

Рис. 9. Результат работы Листинга_2.6

6) Вычисление определенных интегралов в системе Scilab

Пример 2.3. Вычислить определенный интеграл методом трапеций:

1 x

11 + x + x2 dx .

Сначала вычислим данный определенный интеграл вручную. Находим первообразную подынтегральной функции, она равна:

F(x) =

1

ln(1+ x + x2 )

1

 

3 arctg[

1

(1+2x) 3]

 

2

 

3

 

 

3

 

Значение первообразной в точке x = −1:

F(1) = 12 ln(1+(1) +(1)2 ) 13 3 arctg[13 (1+2 (1)) 3] = 0.30229989

Значение первообразной в точке x =1:

F(1) = 12 ln(1+1+12 ) 13 3 arctg[13 (1+ 2 1) 3] = −0.05529364

Получаем ответ:

0.05529364 0.30229989 = −0.35759353

1. В системе Scilab интеграл вычисляется посредством функции integrate(fun, x, a, b, [,er1 [,er2]]),

где:

fun – функция, задающая подынтегральное выражение в символьном виде;

36

x – переменная интегрирования, так же задается в виде символа;

a, b – пределы интегрирования (действительные числа);

er1 и er2 – абсолютная и относительная точность вычислений (по умолчанию порядка 14 десятичных знаков)

Смотрим Рис. 10.

Рис. 10. Вычисление определенного интеграла

2. Наиболее универсальной командой интегрирования в Scilab является:

[I,err] = intg(a, b, name [,er1 [,er2]]),

Где:

name – имя функции, задающей подынтегральное выражение; здесь функция может быть задана в виде набора дискретных точек (как таблица) или с помощью внешней функции;

a, b – пределы интегрирования;

er1 и er2 – абсолютная и относительная точность вычислений

Смотрим Рис. 11.

Рис. 11. Вычисление определенного интеграла

37

Замечание.2.1: Инструкция deff('y=f(x)','y=x/(1+x+x*x)') задает функцию y = f (x) = 1 + xx+ x 2 ;

Аналогично, интеграл можно вычислить и следующим образом:

Листинг 2.7.

function y = f(x)

y = x/(1+x+x*x); endfunction;

[I, er]=intg(-1,1,f) // массив [I, er] – интеграл и погрешность

Рис. 12. Вычисление определенного интеграла