Адаптивный метод Симпсона
Адаптивный метод Симпсона , также называемый адаптивным правилом Симпсона , — это метод численного интегрирования, предложенный Г. Ф. Кунциром в 1962 году. [ 1 ] Вероятно, это первый рекурсивный адаптивный алгоритм численного интегрирования, появившийся в печати. [ 2 ] более современные адаптивные методы, основанные на квадратуре Гаусса – Кронрода и квадратуре Кленшоу – Кертиса хотя сейчас обычно предпочитаются . Адаптивный метод Симпсона использует оценку ошибки, которую мы получаем при вычислении определенного интеграла с использованием правила Симпсона . Если ошибка превышает заданный пользователем допуск, алгоритм требует разделить интервал интегрирования на два и рекурсивно применить адаптивный метод Симпсона к каждому подинтервалу. Этот метод обычно намного более эффективен, чем составное правило Симпсона , поскольку он использует меньше вычислений функции в тех местах, где функция хорошо аппроксимируется кубической функцией .
Правило Симпсона — это интерполяционное правило квадратур, которое является точным, когда подынтегральная функция является многочленом третьей степени или ниже. Используя экстраполяцию Ричардсона , можно получить более точную оценку Симпсона. для шести значений функции сочетается с менее точной оценкой для трех значений функции, применяя поправку . Таким образом, полученная оценка точна для полиномов пятой и меньшей степени.
Математическая процедура
[ редактировать ]Определение терминов
[ редактировать ]Критерий определения момента прекращения деления интервала, предложенный Дж. Н. Лайнсом, [ 3 ] является
где это интервал с серединой , пока , , и данные по правилу Симпсона являются оценками , , и соответственно, и — желаемая максимальная погрешность для интервала.
Примечание, .
Процедурные действия
[ редактировать ]Чтобы применить адаптивный метод Симпсона, выполните следующие действия: если , добавлять и к сумме правил Симпсона, которые используются для аппроксимации интеграла, в противном случае выполните ту же операцию с и вместо .
Численное рассмотрение
[ редактировать ]Некоторые входные данные не смогут быстро сойтись в адаптивном методе Симпсона, что приведет к выходу за пределы допуска и возникновению бесконечного цикла. Простые методы защиты от этой проблемы включают добавление ограничения глубины (как в образце C и в Маккимане), проверку того, что ε /2 ≠ ε в арифметике с плавающей запятой, или и то, и другое (как в Кунцире). Размер интервала также может приближаться к эпсилону локальной машины , что дает a = b .
Статья Лайнса 1969 года включает «Модификацию 4», которая решает эту проблему более конкретным образом: [ 3 ] : 490–2
- Пусть начальный интервал будет [ A , B ] . Пусть исходный допуск равен ε 0 .
- Для каждого подинтервала [ a , b ] определите D ( a , b ) , оценку ошибки, как . Определить E знак равно 180 ε 0 / ( B - A ) . исходными критериями завершения станут D ≤ E. Тогда
- Если D ( a , m ) ≥ D ( a , b ) , либо достигнут уровень округления, либо нуль для f (4) находится в интервале. изменить допуск ε 0 на ε′ 0 Необходимо .
- Рекурсивным процедурам теперь необходимо возвращать уровень D для текущего интервала. Подпрограммно-статическая переменная E' = 180 ε' 0 / ( B - A ) определяется и инициализируется значением E .
- (Модификация 4 i, ii) Если на интервале используется дальнейшая рекурсия:
- Если кажется, что округление достигнуто, измените E' на D ( a , m ) . [ а ]
- В противном случае настройте E' на max( E , D ( a , m )) .
- Необходим некоторый контроль над корректировками. Значительное увеличение и незначительное уменьшение допусков следует запрещать.
- Чтобы вычислить эффективное ε′ 0 на всем интервале:
- Зарегистрируйте каждый x i, в котором E' изменяется в массив пар ( x i , ε i ' ) . Первая запись должна быть ( a , ε′ 0 ) .
- Фактическое ε eff представляет собой среднее арифметическое всех ε' 0 , взвешенное по ширине интервалов.
- Если текущее E' для интервала выше, чем E , то ускорение/коррекция пятого порядка не будет применяться: [ б ]
- Коэффициент «15» в критериях завершения отключен.
- Поправочный термин использовать не следует.
Маневр повышения эпсилона позволяет использовать программу в режиме «максимальных усилий»: при нулевом начальном допуске программа попытается получить наиболее точный ответ и вернуть фактический уровень ошибки. [ 3 ] : 492
Примеры реализации кода
[ редактировать ]Общий метод реализации, показанный ниже, — это передача f( a ), f( b ), f( m ) вместе с интервалом [ a , b ] . Эти значения, используемые для оценки S ( a , b ) на родительском уровне, снова будут использоваться для подинтервалов. Это сокращает стоимость каждого рекурсивного вызова с 6 до 2 вычислений входной функции. Размер используемого стекового пространства остается линейным в зависимости от уровня рекурсий.
Питон
[ редактировать ]Вот реализация адаптивного метода Симпсона на Python .
from __future__ import division # python 2 compat # "structured" adaptive version, translated from Racket def _quad_simpsons_mem(f, a, fa, b, fb): """Evaluates the Simpson's Rule, also returning m and f(m) to reuse""" m = (a + b) / 2 fm = f(m) return (m, fm, abs(b - a) / 6 * (fa + 4 * fm + fb)) def _quad_asr(f, a, fa, b, fb, eps, whole, m, fm): """ Efficient recursive implementation of adaptive Simpson's rule. Function values at the start, middle, end of the intervals are retained. """ lm, flm, left = _quad_simpsons_mem(f, a, fa, m, fm) rm, frm, right = _quad_simpsons_mem(f, m, fm, b, fb) delta = left + right - whole if abs(delta) <= 15 * eps: return left + right + delta / 15 return _quad_asr(f, a, fa, m, fm, eps/2, left , lm, flm) +\ _quad_asr(f, m, fm, b, fb, eps/2, right, rm, frm) def quad_asr(f, a, b, eps): """Integrate f from a to b using Adaptive Simpson's Rule with max error of eps.""" fa, fb = f(a), f(b) m, fm, whole = _quad_simpsons_mem(f, a, fa, b, fb) return _quad_asr(f, a, fa, b, fb, eps, whole, m, fm) from math import sin print(quad_asr(sin, 0, 1, 1e-09))
С
[ редактировать ]Вот реализация адаптивного метода Симпсона в C99, которая позволяет избежать избыточных оценок f и квадратурных вычислений. Он включает в себя все три «простых» способа защиты от числовых проблем.
Эта реализация была включена в программу трассировки лучей C++, предназначенную для моделирования рентгеновского лазера в Национальной лаборатории Ок-Ридж . [ 4 ] среди других проектов. Версия ORNL дополнена счетчиком вызовов, шаблонами для различных типов данных и оболочками для интеграции по нескольким измерениям. [ 4 ]
Ракетка
[ редактировать ]Вот реализация адаптивного метода Симпсона в Racket с поведенческим программным контрактом. Экспортированная функция вычисляет неопределенный интеграл для некоторой заданной функции f . [ 5 ]
;; ----------------------------------------------------------------------------- ;; interface, with contract (provide/contract [adaptive-simpson (->i ((f (-> real? real?)) (L real?) (R (L) (and/c real? (>/c L)))) (#:epsilon (ε real?)) (r real?))]) ;; ----------------------------------------------------------------------------- ;; implementation (define (adaptive-simpson f L R #:epsilon [ε .000000001]) (define f@L (f L)) (define f@R (f R)) (define-values (M f@M whole) (simpson-1call-to-f f L f@L R f@R)) (asr f L f@L R f@R ε whole M f@M)) ;; the "efficient" implementation (define (asr f L f@L R f@R ε whole M f@M) (define-values (leftM f@leftM left*) (simpson-1call-to-f f L f@L M f@M)) (define-values (rightM f@rightM right*) (simpson-1call-to-f f M f@M R f@R)) (define delta* (- (+ left* right*) whole)) (cond [(<= (abs delta*) (* 15 ε)) (+ left* right* (/ delta* 15))] [else (define epsilon1 (/ ε 2)) (+ (asr f L f@L M f@M epsilon1 left* leftM f@leftM) (asr f M f@M R f@R epsilon1 right* rightM f@rightM))])) ;; evaluate half an interval (1 func eval) (define (simpson-1call-to-f f L f@L R f@R) (define M (mid L R)) (define f@M (f M)) (values M f@M (* (/ (abs (- R L)) 6) (+ f@L (* 4 f@M) f@R)))) (define (mid L R) (/ (+ L R) 2.))
Связанные алгоритмы
[ редактировать ]- Хенрикссон (1961) представляет собой нерекурсивный вариант правила Симпсона. Он «адаптируется», интегрируя слева направо и регулируя ширину интервала по мере необходимости. [ 2 ]
- Алгоритм Кунцира 103 (1962) является оригинальным рекурсивным, делящим пополам, адаптивным интегратором. Алгоритм 103 состоит из более крупной процедуры с вложенной подпрограммой (цикл AA), выполненной рекурсивной за счет использования оператора goto . Он защищает от потери ширины интервала (цикл BB) и прерывается, как только будет превышено заданное пользователем значение eps. Критерием прекращения является , где n — текущий уровень рекурсии, а S (2) это более точная оценка. [ 1 ]
- Алгоритм МакКимана 145 (1962) представляет собой аналогичный рекурсивный интегратор, который делит интервал на три, а не на две части. Рекурсия написана более привычным образом. [ 6 ] Алгоритм 1962 года, оказавшийся слишком осторожным, использует для завершения, поэтому в усовершенствовании 1963 года используется вместо. [ 3 ] : 485, 487
- Лайнесс (1969) — почти нынешний интегратор. Созданный как набор из четырех модификаций МакКимана 1962 года, он заменяет трисекцию на биссекцию для снижения вычислительных затрат (Модификации 1+2, совпадающие с интегратором Кунцира) и улучшает оценки ошибок МакКимана 1962/63 года до пятого порядка (Модификация 3), в способ, связанный с правилом Буля и методом Ромберга . [ 3 ] : 489 Модификация 4, не реализованная здесь, содержит положения об ошибке округления, которые позволяют повысить ε до минимума, допустимого текущей точностью, и вернуть новую ошибку. [ 3 ]
Примечания
[ редактировать ]Библиография
[ редактировать ]- ^ Перейти обратно: а б Г. Ф. Кунчир (1962), «Алгоритм 103: интегратор правил Симпсона», Communications of ACM , 5 (6): 347, doi : 10.1145/367766.368179
- ^ Перейти обратно: а б Информацию о более раннем нерекурсивном адаптивном интеграторе, больше напоминающем решатели ОДУ , см. С. Хенрикссон (1961), «Вклад № 2: Численное интегрирование Симпсона с переменной длиной шага», BIT Numerical Mathematics , 1 : 290
- ^ Перейти обратно: а б с д и ж Дж. Н. Лайнесс (1969), «Заметки об адаптивной квадратурной программе Симпсона», Журнал ACM , 16 (3): 483–495, doi : 10.1145/321526.321537
- ^ Перейти обратно: а б Беррилл, Марк А. «RayTrace-miniapp: src/AtomicModel/interp.hpp · de5e8229bccf60ae5c1c5bab14f861dc0326d5f9» . ОРНЛ GitLab .
- ^ Феллизен, Маттиас. «[рэкет] адаптивная интеграция Симпсона» . Список рассылки рэкета «Пользователи» . Проверено 26 сентября 2018 г.
- ^ Маккиман, Уильям Маршалл (1 декабря 1962 г.). «Алгоритм 145: Адаптивное численное интегрирование по правилу Симпсона» . Коммуникации АКМ . 5 (12): 604. дои : 10.1145/355580.369102 .