- •Оглавление
- •Введение
- •Краткий обзор системы
- •Знакомство с интерфейсом Scilab
- •Функции, определяемые пользователем и процедуры
- •Циклы
- •Погрешность результата численного решения задачи
- •Приближенные вычисления определенных интегралов
- •Методы прямоугольников
- •Метод трапеций
- •Метод Симпсона
- •Квадратуры Гаусса
- •Методы Монте-Карло
- •Вычисление определенных интегралов в системе Scilab
- •Решение систем линейных алгебраических уравнений
- •Метод Гаусса
- •Формула Крамера
- •Метод простых итераций
- •Метод Зейделя
- •Метод отражений
- •Метод LU-разложений
- •Решение нелинейных алгебраических уравнений
- •Метод половинного деления
- •Метод секущих
- •Метод секущих (с изменяемым углом)
- •Метод Ньютона (касательных)
- •Метод Бернулли
- •Аппроксимация и интерполирование функций
- •Интерполяционный многочлен Лагранжа
- •Интерполяционная формула Ньютона
- •Интерполяционные формулы Гаусса
- •Линейная аппроксимация по методу наименьших квадратов
- •Кусочно-кубические сплайны
- •Анимация на плоскости
- •Анимация в пространстве
- •Метод Рунге-Кутта
- •Метод Эйлера
- •Метод Прогонки
- •Метод Пикара
- •Возможности Scilab для решения ОДУ
- •Список Литературы
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 = |
1−0 |
= |
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. Вычисление определенного интеграла
