Численные методы и программирование с Maxima
4.3.5 Численное интегрирование: пакет romberg
Для вычисления определённых интегралов численными методами в Maxima есть простая в использовании и довольно мощная функция (перед использованием её необходимо загрузить).
Синтаксис вызова:
Функция вычисляет определённые интегралы методом Ромберга. В форме возвращает оценку полного интеграла выражения по переменной в пределах от до . Выражение должно возвращать действительное значение (число с плавающей запятой).
В форме функция возвращает оценку интеграла функции по переменной в пределах от до ( представляет собой неназванный, единственный аргумент ; фактический аргумент может быть отличен от ). Функция должна быть функцией Maxima или Lisp, которая возвращает значение с плавающей запятой.
Точностью вычислений при выполнении управляют глобальные переменные , и . Функция заканчивается успешно, когда абсолютное различие между последовательными приближениями — меньше чем , или относительное различие в последовательных приближениях — меньше чем . Таким образом, когда rombergabs равна 0.0 (это значение по умолчанию), только величина относительной ошибки влияет на выполнение функции .
Функция уменьшает шаг интегрирования вдвое по меньшей мере раз, поэтому максимальное количество вычислений подинтегральной функции составляет . Если критерий точности интегрирования, установленный и , не удовлетворен, печатает сообщение об ошибке. Функция всегда делает по крайней мере итерации; это — эвристическое правило, предназначенное, чтобы предотвратить преждевременное завершение выполнения функции, когда подинтегральное выражение является колебательным.
Вычисление при помощи многомерных интегралов возможно, но заложенный разработчиками способ оценки точности приводит к тому, что методы, разработанные специально для многомерных задач, могут привести к той же самой точности с существенно меньшим количеством оценок функции.
Рассмотрим примеры вычисления интегралов с использованием :
(%i1) load (romberg);
(%i2) g(x, y) := x*y / (x + y);
(%i3) estimate : romberg (romberg (g(x, y), y, 0, x/2), x, 1, 3);
(%i4) assume (x > 0);
(%i5) integrate (integrate (g(x, y), y, 0, x/2), x, 1, 3);
(%i6) float(%);
Как видно из полученных результатов вычисления двойного интеграла, точное и приближённое решение совпадают до 7 знака включительно.