Например, пусть исходно был запрограммирован класс проводника, то есть элемента, который характеризуется сопротивлением и (по)током через него и предназначен для расчёта электрической цепи или, что то же самое, гидродинамической системы жёстких трубок. Если требуется учесть растяжимость трубок, достаточно унаследовать свойства и методы класса проводника, добавив к ним свойство объёма и процедуру расчёта сопротивления трубки через этот объём. (см. рис. 2.4) Далее класс растяжимой трубки (то есть сосуда, если пользоваться терминологией предметной области – физиологии) можно использовать в качестве родительского класса для эластичных, пластичных и других сосудов, различающихся моделью растяжения.
А теперь предположим, что требуется решать не только эллиптическую задачу расчёта потоков и давлений в системе трубок, но и параболическую задачу переноса веществ или тепла в этой системе. Понятно, что методы расчёта конвективного, диффузионного и конвективно-диффузионного переноса должны существовать в специальных элементах-переносчиках независимо от элементов, связанных с моделированием механики сосудов. (см. рис. 2.4) Чтобы использовать эти методы для задачи переноса в сосудах, достаточно создать элемент, наследующийся от сосуда и от переносчика одновременно, причём никакого нового программного кода создавать не требуется. В объектно-ориентированных языках, не поддерживающих множественное наследование, то же самое достигается путём одиночного наследования от одного класса (например, от сосуда) и агрегации экземпляра другого класса (например, переносчика).
Рис. 2.4. Пример иерархии наследования классов модели (в объектной нотации Г. Буча).
Таким образом, наследование даёт возможность быстрого развития не только моделей, но и заложенных в них численных методов. При этом упростить и формализовать изменение кода программной реализации методов можно настолько, чтобы осуществлять его с помощью визуального редактора. Данная возможность отсутствует как в случае трактовки области интегрирования в качестве основного объекта модели (визуальное редактирование её методов не слишком отличается от обычного и не может быть формализовано), так и в случае трактовки в этом качестве параметра или функции (к ним не могут быть привязаны «интеллектуальные» методы, поэтому в них нечего редактировать).
Как было отмечено выше, ООП особенно необходим при совместном использовании разнородных методологий (например, математического и имитационного моделирования) и при описании неоднородных (например, дискретно-непрерывных) систем. Примером такой неоднородной системы, требующей привлечения как современных методов вычислительной математики, так и неточных эмпирических зависимостей, является комплексная модель организма человека.
Безусловно, речь не идет о модели, полностью описывающей все происходящие в организме процессы (даже если предположить, что для всех них могут быть созданы адекватные модели и найдены все необходимые исходные данные, то для компьютерной реализации не хватит ресурсов современной вычислительной техники). Однако многие задачи (например, прогнозирование последствий приёма человеком лекарств) всё-таки требуют одновременного рассмотрения большинства функциональных систем организма. При этом для одних систем (например, для кровообращения) необходимо детальное рассмотрение их анатомической структуры на базе распределённых моделей, для других (например, для выделительной системы) подходят обыкновенные дифференциальные уравнения, а для третьих (например, для нервной регуляции) достаточно использования дискретных моделей и эмпирических зависимостей. Поскольку элементы всех этих систем взаимодействуют между собой, без их объектного представления создать комплексную модель организма практически невозможно.
Ниже данное утверждение иллюстрируется при описании некоторых блоков квазистационарной модели организма, название которой отражает тот факт, что она не рассматривает быстротекущие и колебательные процессы, сосредотачиваясь на расчёте равновесных или осреднённых по времени значениях параметров.
Основой комплексной модели организма человека является модель кровеносной системы: во-первых, она служит посредником между всеми другими системами, осуществляя транспорт веществ в организме, во-вторых, параметры кровообращения являются основными показателями состояния человека. Поскольку кровеносное русло включает сосуды существенно различных размеров, их совместное моделирование требует комбинации различных математических подходов. Достаточно изотропную сеть мелких сосудов корректнее описывать моделью сплошной среды, то есть с помощью дифференциальных уравнений в частных производных. Это позволяет не вводить для таких сосудов лишних анатомических характеристик типа их размеров, сводя их свойства к одному параметру непрерывной задачи – проницаемости ткани по отношению к крови. С другой стороны, модель макроскопических сосудов сводится к системе с сосредоточенными параметрами, гидродинамическая часть которой рассчитывается по алгебраическим уравнениям (Кирхгоффа), а транспортная часть – по обыкновенным дифференциальным уравнениям. Проблема в том, что при попытке учесть в рамках такой дискретной модели большое число сосудистых поколений размерность сосредоточенной системы превысит размерность системы сеточных уравнений, аппроксимирующей непрерывную задачу в мелких сосудах.
Следовательно, даже для моделирования кровеносной системы как таковой (т. е. без её связей с другими системами организма) возникает задача совместного расчёта разнородных (дискретных и непрерывных) моделей. Как показано в [11], чисто математические способы решения проблемы связывания дискретной модели кровообращения с непрерывной моделью приводят к громоздким выкладкам, какими бы хитроумными они ни были (а их процедурно-ориентированная реализация требует не менее громоздких алгоритмов). Поэтому значительно более эффективной представляется объектная формулировка обеих частей модели, унифицирующая представление дискретных элементов и узлов пространственной сетки.
Такой же вывод можно сделать при рассмотрении задачи совместного расчёта параметров сердца и сосудистой системы. Конечно, работа сердца описывается гораздо более сложными уравнениями (см. [11], а также табл. 3 приложения), чем закон пропорциональности между потоком и градиентом давления, характерный для сосудов, поэтому, казалось бы, нельзя рассчитывать их единообразно. Однако если решать задачу отдельно для обоих желудочков сердца при фиксированных свойствах сосудов (интегральном сопротивлении кругов кровообращения) и отдельно – для сосудов при фиксированных параметрах желудочков (артериальном давлении и потоке), то возникает, по крайней мере, два вложенных итерационных процесса (один из них – например, процесс решения задачи в сосудах – должен сходиться на каждой итерации другого процесса – например, процесса расчёта сердечных параметров). Очевидно, эффективность таких расчётов очень низка, и её можно повысить, если объединить итерации схем сердечных и сосудистых уравнений в один процесс. Это возможно только за счёт объектно-ориентированной трактовки элементов сосудистой системы и сердца и их наследования от общего суперкласса (см. раздел 3.4.2). Одновременно такой подход увеличивает гибкость модели: в процедурно-ориентированный алгоритм из двух вложенных процессов весьма затруднительно вставить расчёт дополнительных активных элементов кровеносной системы (например, желудочков сердца, мышечного, дыхательного или других «насосов»).
Ещё более очевидные проблемы, пригодные к решению с помощью объектно-ориентированного подхода, возникают при моделировании транспорта веществ в организме. Вещества могут попадать в организм через дыхательную или пищеварительную систему (в первом случае – за счет конвекции и диффузии, во втором – с участием мышц органов желудочно-кишечного тракта), проникать в кровь (диффузионным путём или за счёт всасывания), транспортироваться кровеносной системой, испытывая по дороге разнообразные превращения и абсорбируясь выделительной системой; наконец, вещества могут разными способами потребляться в органах и тканях. Уравнения для всех этих процессов довольно похожи, однако разные пространственные размерности соответствующих моделей (для пищеварения и выделения – точечные модели, для кровообращения и дыхания – ветвящиеся одномерные и квазитрёхмерные) не позволяют использовать для их расчёта одни и те же процедуры. Особенно сложно при процедурном подходе формализовать условия на границах раздела систем, число типов которых намного больше, чем число самих систем. Однако если представлять организм человека в виде совокупности связанных между собой элементов, то при разработке их методов не нужно заботиться о том, с какой элемент (какой системе принадлежит, является ли «граничным») связан с данным элемент. Кроме того, размерность системы фактически не влияет на объектные методы моделирования (подробнее это описано в разделе 3.2.3), а за счёт наследования алгоритмы расчётов сходных физических процессов в разных функциональных системах организма можно реализовывать только один раз.