quadgk

Численно оцените интеграл, адаптивную Квадратуру Гаусса-Кронрода

Синтаксис

q = quadgk(fun,a,b)
[q,errbnd] = quadgk(fun,a,b)
[q,errbnd] = quadgk(fun,a,b,param1,val1,param2,val2,...)

Описание

q = quadgk(fun,a,b) попытки аппроксимировать интеграл скалярной функции fun от a до b с помощью старшей глобальной адаптивной квадратуры и ошибочных допусков по умолчанию. Функциональный y = fun(x) должен принять аргумент вектора x и возвратить векторный результат y, где y является подынтегральным выражением, оцененным в каждом элементе x. fun должен быть указателем на функцию. Пределами a и b может быть -Inf или Inf. Если оба конечны, они могут быть комплексными. Если по крайней мере один является комплексным, интеграл аппроксимирован по пути к прямой линии от a до b в комплексной плоскости.

Параметризация Функций объясняет, как предоставить дополнительные параметры функциональному fun при необходимости.

[q,errbnd] = quadgk(fun,a,b) возвращает аппроксимированную верхнюю границу на абсолютной погрешности, |Q - I|, где I обозначает точное значение интеграла.

[q,errbnd] = quadgk(fun,a,b,param1,val1,param2,val2,...) выполняет интеграцию с заданными значениями дополнительных параметров. Доступные параметры

ПараметрОписание 

'AbsTol'

Допуск абсолютной погрешности.

Значением по умолчанию 'AbsTol' является 1.e-10 (дважды), (один) 1.e-5.

quadgk пытается удовлетворить errbnd <= max(AbsTol,RelTol*|Q|). Это - управление абсолютной погрешностью, когда |Q| является управлением достаточно маленькой и относительной погрешностью, когда |Q| больше. Для чистой абсолютной погрешности управление используют 'AbsTol' > 0 and'RelTol'= 0. Для чистой относительной погрешности управление используют 'AbsTol' = 0. Кроме тех случаев, когда с помощью чистого управления абсолютной погрешностью, минимальным относительным допуском является 'RelTol' >= 100*eps(class(Q)).

'RelTol'

Допуск относительной погрешности.

Значением по умолчанию 'RelTol' является 1.e-6 (дважды), (один) 1.e-4.

'Waypoints'

Вектор интегрирования waypoints.

Если fun(x) имеет разрывы в интервале интегрирования, местоположения должны быть предоставлены как вектор Waypoints. Когда a, b и waypoints все действительны, только waypoints между a и b используются, и они используются в отсортированном порядке. Обратите внимание на то, что waypoints не предназначаются для особенностей в fun(x). Особые точки должны быть обработаны путем создания их конечными точками отдельных интегрирований и добавления результатов.

Если a, b или какая-либо запись waypoints вектора являются комплексными, интегрирование выполняется по последовательности путей к прямой линии в комплексной плоскости, от a до первого waypoint, сначала waypoint к второму, и т.д, и наконец от последнего waypoint до b.

'MaxIntervalCount'

Максимальное количество интервалов позволено.

Значением по умолчанию является 650.

Параметр 'MaxIntervalCount' ограничивает количество интервалов, которые quadgk использует в любой момент после первой итерации. Предупреждение выдано, если quadgk возвращается рано из-за этого предела. Обычно увеличение этого значения не рекомендуется, но может быть уместно, когда errbnd является достаточно маленьким, что желаемая точность была почти достигнута.

Примеры

 Пример 1. Подынтегральное выражение с особенностью в конечной точке интегрирования

Запишите функциональный myfun, который вычисляет подынтегральное выражение:

function y = myfun(x) 
y = exp(x).*log(x);

Затем передайте @myfun, указатель на функцию к myfun, к quadgk, наряду с пределами интегрирования, 0 к 1:

q = quadgk(@myfun,0,1)

q =

   -1.3179

Также можно передать подынтегральное выражение quadgk как указатель анонимной функции F:

f = (@(x)exp(x).*log(x));
q = quadgk(f,0,1); 
 Пример 2. Колебательное подынтегральное выражение на полубесконечном интервале

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

f = @(x)x.^5.*exp(-x).*sin(x);
[q,errbnd] = quadgk(f,0,inf,'RelTol',1e-8,'AbsTol',1e-12)

q =

  -15.0000

errbnd =

  9.4386e-009

 Пример 3. Контурное интегрирование вокруг полюса

Используйте Waypoints, чтобы объединяться вокруг полюса с помощью кусочного линейного контура:

f = @(z)1./(2*z - 1);
q = quadgk(f,-1-i,-1-i,'Waypoints',[1-i,1+i,-1+i])

q =

   0.0000 + 3.1416i

Диагностика

quadgk может выдать одно из соблюдающих предупреждений:

'Minimum step size reached' указывает, что подразделение интервала произвело подынтервал, длина которого находится на порядке ошибки округления в длине исходного интервала. Неинтегрируемая особенность возможна.

'Reached the limit on the maximum number of intervals in use' указывает, что интегрирование было отключено прежде, чем удовлетворить требования допуска и что продолжение интегрирования потребует больше, чем подынтервалы MaxIntervalCount. Интеграл не может существовать, или может быть трудно аппроксимировать численно. Увеличение MaxIntervalCount обычно не помогает, если требования допуска не были почти удовлетворены, когда интегрирование было ранее отключено.

'Infinite or Not-a-Number function value encountered' указывает на переполнение с плавающей точкой или деление на нуль во время оценки подынтегрального выражения во внутренней части интервала.

Советы

  • Если интервал бесконечен, [a,), затем для интеграла fun(x), чтобы существовать, fun(x) должен затухнуть как бесконечность подходов x, и quadgk требует, чтобы он затух быстро. Специальные методы должны использоваться для колебательных функций на бесконечных интервалах, но quadgk может использоваться, если fun(x) затухает достаточно быстро.

  • Функция quadgk может интегрировать функции, которые сингулярны в конечных конечных точках, если особенности не слишком сильны. Например, это может интегрировать функции, которые ведут себя в конечной точке c как log|x-c| или |x-c|p для p >= -1/2. Если функция сингулярна в точках в (a,b), запишите интеграл как сумму интегралов на подынтервалах с особыми точками как конечные точки, вычислите их с quadgk и добавьте результаты.

Алгоритмы

quadgk реализует адаптивную квадратуру на основе пары Гаусса - Кронрода (15-е и 7-е формулы порядка).

Ссылки

[1] Л.Ф. Шемпин “Векторизовал Адаптивную Квадратуру в MATLAB®”, Журнал Вычислительной и Прикладной математики, 211, 2008, pp.131–140.

Расширенные возможности

Генерация кода C/C++
Генерация кода C и C++ с помощью MATLAB® Coder™.