В MATLAB нет функции, выполняющей численное дифференцирование. Исключение составляют функции вычисления производной от алгебраического полинома, заданного в символьной форме – diff и заданного в форме вектора – polyder. Функция polyder возвращает вектор коэффициентов производной от многочлена. В первой строке примера 37 был фактически определен многочлен 2x3 + 3x2 + 5x + 7 = 0. При аналитическом дифференцировании этого выражения степень многочлена понижается и число коэффициентов уменьшается на единицу (производная от последнего числа в левой части равна нулю).


Пример 37.
Численное дифференцирование и интегрирование многочлена
1 >> a=[2 3 5 7]
2 a =
3 2 3 5 7
4 >> b=diff(a)
5 b =
6 1 2 2
7 >> polyder(a)
8 ans =
9 6 6 5
10 >> poly=poly2sym(a)
11 poly =
12 2x^3 + 3x^2 + 5x + 7
13 >> int(poly)
14 ans =
15 x^4/2 + x^3 + (5x^2)/2 + 7x

Если в качестве аргумента функции diff передать вектор, то в результате будет вычислен вектор разностей. Причина, по которой численное дифференцирование в MATLAB реализовано только одной функцией, заключается в том, что вычисление производных основано на интерполяции дифференцируемой функции алгебраическими полиномами не очень высоких степеней. Простейший способ вычисления производной с использованием функции diff заключается в простом вычислении отношения приращения функции к приращению аргумента. Понятно, что в определении производной приращение аргумента обязано быть бесконечно малым, и, используя такое приближение для производной, точных результатов ожидать не стоит. Для получения более точных результатов следует использовать специальные формулы (например, Ньютона или Стирлинга) для численного дифференцирования. В примере 38 построен график квадратичной функции и её производной. Как легко убедиться, выполнив этот сценарий, производная будет линейной функцией. Аналитическое нахождение производной приведет к выражению 2*xd, и разность этого значения с приближенным значением производной dxdy будет равна 0.1


Пример 38.
Простейшее численное дифференцирование
1 %исходныйкод сценария
2 x=0:0.1.5;
3 y=x.^2;
4 xd=x(1.length(x)1);
5 dxdy=diff(y)./diff(x);
6 plot(x,y)
7 hold on % длявыводаобоихграфиковвводномграфическомокне
8 grid on %включаемсеткуна графике
9 plot(xd,dxdy)
10 delta=2xddxdy

Численное интегрирование – вычисление площади под графиком функции (в одномерном случае), также реализуется при помощи интерполяции функции различными способами. Для эффективного вычисления интеграла необходимо представлять особенности подынтегральной функции. Например, в случае разрывов (устранимых) функции в некоторой точке следует разбить интеграл на два так, чтобы точка разрыва попала на границу. Для обеспечения нужной точности и скорости сходимости следует выбирать алгоритм интегрирования в соответствии с характером роста интегрируемой функции.

Таблица 10. Функции MATLAB для вычисления определенных интегралов
Название Значение
trapz(y,x) Вычисляет определенный интеграл методом трапеций. Аргументы: y - подынтегральная функция, x - вектор аргумент. Обеспечивает достаточную точность для линейных функций
quad(y(x), xmin, xmax, eps, trace) Вычисляет определенный интеграл по формуле Симпсона, обеспечивает достаточную точность для функций, четвертая производная от которых равна нулю. Обязательными аргументами являются имя функции и границы интегрирования. В качестве дополнительного аргумента можно указать точность вычислений - eps, по умолчанию равна 10-6. Специальная опция trace позволяет включить вывод промежуточных значений на каждой итерации, для этого нужно задать любое ненулевое значение
quadl(y(x), xmin, xmax, eps, tarce) Вычисляет определенный интеграл методом Лобатто. Смысл аргументов, такой же как у quad
quadgk(y(x), xmin, xmax, eps, tarce) Вычисляет определенный интеграл методом Гаусса-Кронрода. Смысл аргументов такой же как у quad
dblquad(z(x,y), xmin, xmax, ymin, ymax, eps, method) Вычисляет двойной определенный интеграл над прямоугольной областью. Необходимо указать границы изменения каждой переменной. Дополнительный параметр method может принимать два значения - quad и quadl
quad2d(z(x,y), xmin, xmax, ymin, ymax) Вычисляет двойной определенный интеграл над плоской областью. Необходимо указать границы изменения каждой переменной
triplequad(z(x,y), xmin, xmax, ymin, ymax, eps, method) Вычисляет тройной определенный интеграл. Необходимо указать границы изменения каждой переменной. Дополнительный параметр method может принимать два значения - quad и quadl

Вызов функций quad и quadl с двумя выходными парметрами приводит к выводу в командное окно числа обращений к вычислению подынтегральной функции. Вызов quadgk с двумя параметрами приводит к выводу приближенного значения погрешности интегрирования


Пример 39.
Итегрирование в MATLAB

1 >> f=@(x)exp(x).cos(x)
2 f =
3 @(x)exp(x).cos(x)
4 >> format longEng
5 >> s=quad(f,0,1)
6 s =
7 555.396877498501e003
8 >> s=quad(f,0,1,1e8)
9 s =
10 555.396882649120e003
11 >> s=quad(f,0,1,1e12)
12 s =
13 555.396882653349e003
14 >> [s,iter]=quad(f,0,1,1e15)
15 s =
16 555.396882653350e003
17 iter =
18 781.000000000000e+000
19 >> [s2,iter2]=quadl(f,0,1,1e15)
20 s2 =
21 555.396882653350e003
22 iter2 =
23 48.0000000000000e+000
24 >> [s3,err]=quadgk(f,0,1)
25 s3 =
26 555.396882653350e003
27 err =
28 21.1636264069171e018
29 >> [s2,iter2]=quadl(f,0,1,1e15,2)
30 18 0.0000000000 5.00000000e01 0.5553968827
31 23 0.0000000000 4.58758548e02 0.0875482138
32 28 0.0917517095 9.23207464e02 0.1510834176
33 33 0.2763932023 1.11803399e01 0.1406211476
34 38 0.5000000000 1.11803399e01 0.0995695619
35 43 0.7236067977 9.23207464e02 0.0561174607
36 48 0.9082482905 4.58758548e02 0.0204570810
37 s2 =
38 555.396882653350e003
39 iter2 =
40 48.0000000000000e+000
41 >> f=@(x)exp(x)
42 f =
43 @(x)exp(x)
44 >> [s,err]=quadgk(f,2,Inf)
45 s =
46 135.335283236613e003
47 err =
48 2.22626006030936e012


Как видно из примера, функция quadgk обеспечивает вычисление интеграла от заданной функции с погрешностью, не превышающей 21.1636264069171 10018, а функции quad и quadl обеспечивают точность 10015 за 781 и 48 итераций соответственно. В фирменной документации утверждается, что quadl обеспечивает более высокую точность, чем quad; а quadgk обеспечивает высокую точность для периодических функций и, кроме этого, поддерживает бесконечные пределы интегрирования.