Обыкновенные дифференциальные уравнения

Все методы решения обыкновенных дифференциальных уравнений (ОДУ) делятся на одношаговые и многошаговые, и их объектная реализация существенно различается.

В принципе, при объектном представлении параметров очень удобно хранить в них любое требуемое число их значений на последовательных шагах по времени, что создаёт предпосылки для реализации многошаговых схем. Однако правая часть уравнений обычно состоит не только из параметров, но и из объектов-функций и объектов-операций, для которых хранение истории своего изменения во времени является избыточным. Поэтому целесообразно создавать специальные объекты (класса «параметр»), в каждом из которых хранить последовательность значений одного компонента вектора правой части. Кроме того, сложные задачи, для которых имеет смысл применять объектно-ориентированный подход, обычно приводят к жёстким системам уравнений, в связи с чем необходимо изменять шаг по времени в ходе расчётов, а к этому многошаговые схемы можно приспособить только за счёт существенного усложнения алгоритма. Такие задачи также часто содержат не только сосредоточенные, но и распределённые подсистемы, для расчёта которых многослойные схемы применяются редко. Поэтому использование многошаговых схем для ОДУ нецелесообразно и с точки зрения единообразия расчётов всех частей рассматриваемой системы.

С другой стороны, в пользу объектного представления таких схем можно привести тот факт, что по сравнению с процедурным представлением достаточно просто можно реализовать переход от одношаговых схем к многошаговым (это необходимо для «разгона» многошаговых схем на первых шагах) и обратный переход в процессе расчётов. Для этих переходов достаточно только поменять в объекте-системе ссылку на объект-схему. Следует также обратить внимание, что значения правой части системы ОДУ в случае использования многошаговых схем вычисляются при тех значениях аргументов, которые соответствуют решению системы: .

В случае одношаговых схем порядок их аппроксимации можно сделать выше первого только за счёт вычисления правой части при значениях аргументов, рассчитываемых по сложным формулам: , . При условии объектного представления аргументов (параметров) это приводит к необходимости присваивать им рассчитанные значения непосредственно перед вычислением правой части, после чего нужно «стирать» эти значения из истории изменения аргументов. К счастью, это можно делать чисто техническими способами (не пересматривая саму объектную модель): так как аргументы правой части являются одновременно параметрами элемента, представляющего систему уравнений, он может их изменять без особых проблем. В целом, использование объектно-ориентированных одношаговых методов решения ОДУ (схем типа Рунге-Кутты) предпочтительнее многошаговых (схем Адамса или Гира): не нужно «разгонять» метод на первых шагах и создавать специальные объекты для хранения динамики изменения правой части уравнения, легче изменять шаг по времени и связывать систему с другими расчётными элементами.

Ещё один эффективный метод решения ОДУ, связанный с переходом к продолженным системам (например, схемы Обрешкова), вряд ли имеет смысл рассматривать с точки зрения ООП, который целесообразно применять, прежде всего, для сочетания математических методов с имитационными моделями. Дело в том, что схемы типа Обрешкова предполагают аналитическое дифференцирование правой части системы, что невозможно в имитационных моделях, содержащих большое количество экспертных зависимостей.

Наконец, необходимо описать алгоритм реализации неявных схем решения ОДУ. Независимо от того, относятся ли они к одношаговым или многошаговым схемам, возникает необходимость решения на каждом шаге системы нелинейных алгебраических уравнений. Как было указано в разделе 3.2.5, для этого целесообразно привязать к каждому элементу, решающему ОДУ, элемент алгебраической системы. Если для каждой дифференциальной системы имеется своя алгебраическая, то начальное приближение для её решения никуда не исчезает в промежутке между шагами по времени дифференциальной системы, что повышает скорость сходимости (хотя и увеличивает расходование памяти). Кроме того, множественность алгебраических систем имеет смысл, когда не требуется на каждом шаге пересчитывать матрицу Якоби правой части исходной системы (с этой матрицей однозначно связана итерационная матрица алгебраической системы).

Таким образом, объектная реализация численных методов решения систем обыкновенных дифференциальных уравнений не приводит к непреодолимым трудностям, однако и не имеет принципиальных преимуществ. Предпочтение следует отдавать одношаговым схемам (типа Рунге-Кутты), хотя комбинирование их с многошаговыми схемами с помощью объектно-ориентированного программирования реализуется относительно просто.

Более оптимистичный вывод можно сделать при анализе дифференциально-разностных уравнений (точнее, дифференциально-разностных уравнений запаздывающего типа). Как было отмечено в разделе 3.2.2, объектная трактовка параметров расчётного элемента позволяет хранить в них совершенно разное количество их значений, относящихся к различным моментам времени. Соответственно, те параметры, входящие в дифференциально-разностное уравнение с запаздыванием, могут хранить историю своего изменения ровно такой длины, которая нужна для нахождения их значения в момент времени, отстоящий на величину максимального запаздывания от текущего момента. Для вычисления (интерполяции) значения в произвольный момент времени такие параметры должны также иметь ссылку на объект, хранящий моменты времени, которые соответствуют их истории (такой объект часто бывает один и тот же для многих параметров). Отсюда видно, что относительно простые дифференциально-разностные уравнения при условии применения ООП и при достаточном количестве памяти компьютера можно решать, не прибегая к сложным численным методам.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: