Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Matlab / Лекция 15

.docx
Скачиваний:
134
Добавлен:
19.03.2016
Размер:
55.21 Кб
Скачать

Лекция № 15

Matlab: Дифференцирование и интегрирование

  1. Дифференцирование

  2. Интегрирование

1. Дифференцирование

Аналитическое дифференцирование. Для вычисления производных в символьном виде от выражения служит функция diff(f).

Создадим символьное выражение:

syms a x;

f = sin(a*x);

тогда diff(f) приведет к дифференцированию по ее символьной переменной (в данном случае это ):

ans = cos(a*x)*a

Для взятия производной по переменной , явно укажем: diff(f,a). Данное выражение вернет df/da:

ans = cos(a*x)*x

Чтобы найти производные более высоких порядков, необходимо указать порядок производной. Например, производная второго порядка:

diff(f,2); или diff(f,x,2);

ans = -sin(a*x)*a^2

и

diff(f,a,2);

вернет ans = -sin(a*x)*x^2

Функция diff в качестве входного параметра может принимать символьную матрицу. В таком случае дифференцирование происходит поэлементно:

syms a x;

A = [cos(a*x),sin(a*x);-sin(a*x),cos(a*x)];

Т. е. матрица А имеет вид:

A =

[ cos(a*x), sin(a*x)]

[ -sin(a*x), cos(a*x)]

Тогда результат команды diff(A) будет:

ans =

[ -sin(a*x)*a, cos(a*x)*a]

[ -cos(a*x)*a, -sin(a*x)*a]

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

diff(X) — для вектора X вычисление первых конечных разностей [X(2)-X(1) X(3)-X(2) ... X(n)-X(n-1)], а для матрицы X вычисление первых конечных разностей между столбцами [X(2:n,:) - X(1:n-1,:)];

diff(X, n) — вычисление конечных разностей n-го порядка;

diff(X, n, dim) — вычисление конечных разностей n-го порядка по указанному измерению.

2. Интегрирование

Аналитическое интегрирование. Функция int(f,x) аналитически вычисляет интеграл от функции по символьной переменной :

syms x;

int(sin(x)./x.^2,x)

ans =

-sin(x)/x+cosint(x)

Функция int(f,x,a,b) численно вычисляет интеграл от функции по символьной переменной в границах :

int(sin(x)./x.^2,x,0.1,pi)

ans =

cosint(pi)+10*sin(1/10)-cosint(1/10)

>> cosint(pi)+10*sin(1/10)-cosint(1/10)

ans =

2.7999

Численное интегрирование. Численное интегрирование в Matlab выполняется с помощью функций:

trapz — интегрирование методом трапеций;

quad, quad8 — вычисление интегралов методом квадратур.

Интегрирование методом трапеций.

В Matlab данную формулу реализует функция trapz(x, y), которая вычисляет интеграл от функции y по переменной x, используя метод трапеций. Аргументы x и y могут быть одномерными массивами одинакового размера, либо массив y может быть двумерным, но тогда должно выполняться условие size(y, 1) = length(x). В последнем случае вычисляется интеграл для каждого столбца.

Функция trapz(y) вычисляет интеграл, предполагая, что шаг интегрирования постоянен и равен единице; в случае, когда шаг h отличен от единице, но постоянен, достаточно вычисленный интеграл умножить на h.

Пример 1. Вычислим интеграл: . Его точное значение равно двум.

Выберем равномерную сетку:

x = 0:pi/100:pi;      

y = sin(x);

тогда оба интеграла

I = trapz(x, y)

и

I = pi/100*trapz(y)

дают одинаковый результат:

I =     1.9998

Образуем неравномерную сетку, используя генератор случайных чисел:

x = sort(rand(1,101)*pi);

y = sin(x);

I = trapz(x, y)

I = 1.9987

Результат еще менее точен, поскольку максимальный из шагов max(diff(x)) равен 0,1810.

Вычисление интегралов методом квадратур. Квадратура — это численный метод вычисления площади под графиком функции, то есть вычисление определенного интеграла вида:

.

Функции quad и quad8 используют разные квадратурные формулы. Функция quad использует квадратурные формулы Ньютона-Котеса 2-го порядка (правило Симпсона), а функция quad8 — формулы 8-го порядка. При наличии в подынтегральной функции особенностей типа:

,

предпочтительнее использовать процедуру quad8.

Функции [I, cnt] = quad(‘имя функции‘, a, b) и [I, cnt] = quad8(‘имя функции‘, a, b) вычисляют интеграл от заданной функции. Переменная cnt содержит информацию о том, сколько раз в процессе интегрирования вычислялась подынтегральная функция.

Функции [I, cnt] = quad(‘имя функции‘, a, b, tol) и [I, cnt] = quad8(‘имя функции‘, a, b, tol) вычисляют интеграл с заданной относительной погрешностью tol. По умолчанию tol = 1e-3.

Функции [I, cnt] = quad(‘имя функции‘, a, b, tol, trace) и [I, cnt] = quad8(‘имя функции‘, a, b, tol, trace), когда аргумент trace не равен нулю, строят график, показывающий ход вычисления интеграла.

Пример 2. Вычислим интеграл: . Его точное значение равно двум.

[I, cnt] = quad('sin', 0, pi)

[I, cnt] = quad('sin', 0, pi, 1e-4, 1)

I = 2.0000

I = 2.0000

cnt = 17

cnt = 33

Как следует из анализа полученных данных, при увеличении точности вычисления на порядок почти вдвое увеличивается трудоемкость расчетов. График с результатами промежуточных расчетов показан на рис. 1.

Рис. 1.

Функции quad и quad8 используют рекурсивный вызов. Для того чтобы предотвратить бесконечную рекурсию при вычислении сингулярных интегралов, глубина рекурсии ограничена уровнем 10. При достижении этого ограничения выдается сообщение: «Recursion level limit reached in quad. Singularity likely» (В процедуре quad достигнута предельная глубина рекурсии. Функция, возможно, сингулярная).

Функции quad и quad8 не позволяют интегрировать функции с особенностями типа:

.

В этом случае рекомендуется выделить такие члены и проинтегрировать их аналитически, а к остатку применить процедуры quad и quad8.

6

Соседние файлы в папке Matlab