3
Введение
Численное интегрирование систем обыкновенных дифференциальных уравнений (ОДУ) — прикладная
задача, относящаяся к традиционному математическому моделированию.
Жёсткой системой называется такая система ОДУ, численное решение которой явными методами
(например, методами Рунге – Кутты или Адамса) является неудовлетворительным из-за резкого увеличения
числа вычислений. Такие системы часто решают неявными методами или явно-неявными схемами типа
Розенброка, которые дают обычно несравненно лучший результат, чем явные методы. Сверхжёсткими
называют системы ОДУ со степенью жёсткости более 10
6
[1].
Стандартная точность чисел с плавающей точкой современных компьютеров: от 15 до 20 цифр в
мантиссе. Этого бывает недостаточно, особенно в плохо обусловленных задачах и в задачах с внутренними
пограничными слоями (контрастными структурами) [2]. В них ошибки начальных данных, а также ошибки
округления, неизбежно возникающие в ходе расчёта, приводят к огромной потере точности. Для них нередко
приходится использовать расширенную точность (30 и более цифр), чтобы единичные округления были как
можно меньше.
При использовании методов Розенброка можно столкнуться с проблемой, когда коэффициенты
приведены с малым числом значащих цифр, рассчитанных на вычисления со стандартной точностью. При
этом приходится обращаться к условиям порядка и устойчивости, чтобы уточнить коэффициенты методов.
Иногда требуется, чтобы решение было непрерывным. В отличие от разностного решения непрерывное
можно вычислять между узлами основной сетки интегрирования. Непрерывное решение необходимо,
например, при решении ОДУ с несколькими некратными запаздываниями. Для того чтобы получился
непрерывный метод можно воспользоваться интерполяцией узлов, или построить решение на основе стадий
численного метода, выбранного для решения системы.
В данной работе описан метод уточнения коэффициентов некоторых методов Розенброка, а так же даны
сами уточнённые коэффициенты, в том числе и для непрерывных методов на основе стадий.
Так же в работе проводится экспериментальное тестирование и сравнение десятка различных методов, и
полученные результаты представлены в виде графиков зависимостей "настраиваемая точность — точность
полученного решения" и "точность полученного решения — трудоёмкость". Тестирование было проведено на
классических сверхжёстких задачах с использованием расширенной точности с получением непрерывного
решения.
1. Современные вычисления
Многие вычисления удобно делать в какой-нибудь системе компьютерной математики, такой как Maple.
Система Maple предназначена для символьных вычислений, обладает развитыми графическими средствами и
имеет собственный язык программирования. Кроме того, она позволяет производить вычисления
произвольной точности с различным количеством значащих цифр.
Ещё активно использовался язык программирования C/C++ и С++ Builder 6 как программная среда
разработки.
1.1. Длинная арифметика
Основная масса библиотек длинной арифметики написана под Unix. К ним относится и библиотеки gmp
(GNU Multi-Precision Library) и mpfr (multiple-precision floating-point computations with correct rounding),
которые позволяют делать вычисления над числами произвольной точности. Библиотека gmp считается самой
быстрой библиотекой чисел произвольной точности.
Под Windows не существует библиотек подобных gmp и mpfr. Но можно найти описание методов,
позволяющих считать числа точности double double [3](как минимум 31 значащая цифра) и quad double [4]
(как минимум 62 значащие цифры). Числа double double работают быстрее, чем числа mpfr той же точности. В
основе обычно используется 64-х битный тип double, но его можно заменить 80-ю битным типом long double
(extended) в 32-х битном приложении, что даст больше значащих цифр. При этом нужно изменить константу
разбиения 134217729 на 8589934593, а так же заменить некоторые формулы (для экспоненты, синуса и гамма-
функции) на более точные. Однако и приложение при этом будет 32-х битное, так как в 64-х битном
приложении нет 80-ти битного типа.