Метод трапеций является очень универсальным методом и хорошо подходит для интегрирования не слишком гладких функций. Если же функция под знаком интеграла является гладкой (существуют и непрерывны несколько первых производных), то лучше применять методы интегрирования более высоких порядков точности. При одном и том же шаге интегрирования методы более высоких порядков точности достигают более точных результатов. В системе MATLAB методы интегрирования более высоких порядков точности реализуются функциями quadl (метод Симпсона) и quadv (quad16 в более старых версиях пакета ) (метод Ньютона - Котеса 8-го порядка точности). Оба этих метода являются к тому же адаптивными. Последнее означает, что пользователю нет необходимости контролировать достигнутую точность результата путем сравнения последовательных значений, соответствующих разным шагам интегрирования. Все это указанные адаптивные функции выполняют самостоятельно. У функции quadv более высокий порядок точности по сравнению с функцией quadl, что очень хорошо для гладких функций, так как обеспечивается более высокая точность результата при большем шаге интегрирования (меньшем объеме вычислений). Однако функция quadl может иметь не меньшее, а даже большее быстродействие для не слишком гладких функций (разрывные или велики по абсолютной величине вторая или третья производные). В любом случае обе эти функции по умолчанию обеспечивают одинаковую относительную точность результата, равную 0.001. Как и многие другие функции системы MATLAB, функции quadl и quadv могут принимать различное количество параметров. Минимальный формат вызова этих функций включает в себя три параметра: имя подынтегральной функции, нижний предел интегрирования и верхний предел интегрирования. Если применяется четвертый параметр, то он является требуемой относительной точностью результата вычислений. Кстати, если обе эти адаптивные функции не могут обеспечить получение необходимой точности (расходящийся или близкий к этому интеграл), то они возвращают символическую бесконечность Inf.
|
|
Выше в подразделе 3.3 «Поиск минимума функции» мы приводили график функции humps, для которой определялись локальные минимумы. Вычислим теперь определенный интеграл от этой функции в пределах от 0 до 3, воспользовавшись для этого обеими адаптивными функциями:
[ I, cnt ] = quadl('humps', 0, 3);
23.9681
cnt = 468
[ I, cnt8 ] = quadv('humps', 0, 3);
23.9681
cnt8 = 213
Второе из возвращаемых значений (cnt, cnt8) для этих функций означает количество точек, в которых пришлось вычислять подынтегральную функцию. Таким образом, этот параметр характеризует трудоемкость метода. Сравнивая полученные показатели, приходим к выводу, что при интегрировании такой гладкой функции, как humps, преимущество имеет метод quadv, так как для достижения минимальной точности в 0.001 (а по ходу дела может достигаться и более высокая точность) ему требуется меньшее количество вычислений с подынтегральной функцией (213 против 468).
|
|
Из высшей математики известно, что к определенным интегралам могут быть сведены многие другие типы интегралов, например криволинейные интегралы. Таким образом, с помощью функций quadl, quadv (или trapz) можно вычислить и эти интегралы.
Рассмотрим пример для криволинейных интегралов первого рода. Пусть требуется вычислить массу М винтовой линии С:
; ; ; ;
с постоянной линейной плотностью, равной 5. Задача решается с помощью криволинейного интеграла первого рода:
Для вычисления подынтегральной функции создадим следующий текст:
function z = MyFunc321(t)
,
который запишем в файл MyFunc321.m, после чего вызываем функцию quad:
М = 5 * quadl('MyFunc321', 0, 2);
М = 34.2903
Двойные интегралы сводятся к вычислению повторных определенных интегралов, один из которых является внутренним, а другой внешним. Внутренний интеграл является подынтегральной функцией для внешнего интеграла. Можно было бы написать некоторую цепочку вычислений (программу), в которой многократные вычисления подынтегральной функции сводились бы к многократным вызовам функции quadl. Однако нет необходимости делать это самостоятельно, так как в системе MATLAB для этого имеется специальная функция dblquad.