Разработка XML-ориентированного языка описания вычислительных моделей (на базе алгебраических и обыкновенных дифференциальных уравнений) 1 Постановка задачи ..........................................................................................................4 1.1 Цели .............................................................................................................................4 1.2 Методы и инструменты .............................................................................................5 2 Обзор ..................................................................................................................................6 3 Язык описания вычислительных моделей ................................................................7 3.1 Структура модели .................................................... Error! Bookmark not defined. 3.2 Описание численных методов ..................................................................................9 3.2.1 Методы решения алгебраических уравнений ................................................10 3.2.1.1 Метод Гаусса ..............................................................................................10 3.2.1.2 Итерационные методы ...............................................................................12 3.2.1.3 Стопперы итерационных методов ............................................................15 3.2.2 Методы решения обыкновенных дифференциальных уравнений ...............16 3.2.2.1 Методы, не имеющие параметров ............................................................16 3.2.2.2 Методы типа Рунге-Кутты ........................................................................16 3.3 Параметры модели и их связь с численными методами .....................................18 3.4 Расширение возможностей MathML ......................................................................20 3.4.1 Новые типы данных ..........................................................................................20 3.4.2 Вспомогательные теги ......................................................................................21 4 Реализация языка и полученные результаты .........................................................23 4.1 Описание структуры системы моделей, состоящих из алгебраических уравнений, и взаимосвязи параметров внутри неё на примере модели кровообращения ...................................................................................................................................................23 4.1.1 Теоретическая модель.......................................................................................23 Модель 1 — Кровообращение ..........................................................................................23 Модель 1.1 — Сосудистая система ..................................................................................24 Модель 1.1.1 — Большой круг ..........................................................................................24 Модель 1.1.2 — Малый круг .............................................................................................24 Модель 1.2 — Сердце ........................................................................................................24 Модель 1.2.1 — Правый желудочек .................................................................................24 Модель 1.2.2 — Левый желудочек ...................................................................................24 4.1.2 Вычислительная модель ...................................................................................29 4.2 Описание модели, состоящей из дифференциальных уравнений, решаемых методами Рунге-Кутты, на примере ”модели экскаватора” ................................................32 4.2.1 Общая структура и системы уравнений модели ............................................33 4.2.2 Численный метод, решающий систему уравнений модели ..........................34 4.2.3 Параметры модели ............................................................................................36 5 Заключение.....................................................................................................................39 1 Постановка задачи 1.1 Цели В глобальном смысле данная работа направлена на повышение уровня воспроизводимости результатов научных исследований в области численного моделирования. С возрастающей сложностью научных исследований в области вычислительных экспериментов обнаружилась проблема невозможности воспроизвести результаты этих экспериментов. Существует множество программных реализаций конкретных вычислительных моделей, но нет единого стандартизованного подхода, который позволял бы воспроизводить эти реализации с целью их проверки или использования для других моделей. Для решения этой проблемы, необходимо выполнение одного из следующих условий. Во-первых, реализация может быть основана на каком-либо стандартном математическом пакете или пакете для моделирования (MathCAD, MATLAB и пр.). Таким образом, можно было бы выделить описание вычислительной модели в отдельный модуль с чётко выраженным интерфейсом и повторно использовать этот модуль по мере надобности. Однако, часто математические пакеты — это средства достаточно низкого уровня, чтобы интерфейс упомянутого модуля был стандартизован. Кроме того, пока не существует стандартного единого языка описания математических алгоритмов (и, тем более, языка описания математических моделей), который понимался бы всеми математическими пакетами. Очевидно, что ни один язык, встроенный в конкретный коммерческий программный продукт, на роль стандартного унифицированного языка претендовать не может. Во-вторых, формализованное описание алгоритмов и моделей может быть выполнено на не зависящем от какого-либо программного продукта языке, на роль которого сейчас претендует XML-ориентированный язык MathML. При таком подходе будет единая, чёткая, понятная всем структура вычислительных моделей и алгоритмов, но с другой стороны будет осложнено воспроизведение результатов вычислений, так как программная реализация должна будет осуществляться людьми, заинтересованными в этом воспроизведении. Идеальным вариантом, совмещающим достоинства обоих подходов, было бы расширение функциональности математических пакетов в сторону создания описаний численных методов, вычислительных моделей с возможностями импорта и экспорта этих описаний в унифицированном формате. Допустим, вычислительная модель описывалась бы в стандартном графическом формате UML, затем экспортировалась (импортировалась) в унифицированный текстовый формат XML и из него в математические пакеты: UML XML Мат. пакеты Однако, до поддержки такой технологии с двумя уровнями стандартизации математическим пакетам пока ещё далеко, и вопрос такой возможности лежит в плоскости научных исследований, а не только технических воплощений. Данная работа представляет собой как раз такое исследование, хотя она не покрывает и не может покрыть все выявленные ранее проблемы. Более конкретной целью этой работы является создание XML-ориентированного языка описания вычислительных моделей, состоящих из систем алгебраических или дифференциальных уравнений и численных методов, решающих эти системы. Назовём этот язык Simulation Markup Language (SimulML). Возможно, SimulML будет являться прослойкой между представлением о вычислительных моделях на семантическом уровне и программной реализацией этих моделей. 1.2 Методы и инструменты Как уже упоминалось, для решения поставленных задач мы будем использовать расширяемый язык разметки XML (Extensible Markup Language). XML является подмножеством стандартного обобщенного языка разметки SGML (Standard Generalized Markup Language) и ориентирован не только на представление содержание текстовых документов (как, например, HTML), но и на хранение структуры документа, что делает XML мощным и гибким инструментом для проектирования информационных систем. Для описания математических выражений будет использоваться XML- ориентированный язык MathML (Mathematical Markup Language). MathML создавался для унифицированного наглядного представления в текстовом формате математических формул. Предполагалось также, что MathML будет описывать логику и смысл математи- ческих выражений, но с этой задачей данный язык не справляется. Допустим, на MathML нельзя нормальным образом показать, что данный набор уравнений является системой и совокупностью. Отсутствуют также возможности циклических построений математических элементов (допустим, представление нескольких уравнений, заданных одной формулой по циклическому принципу) и описание логической последовательности расчётов. К тому же следует заметить, что MathML описывает только одну из трех составляющих современной вычислительной модели: формулы и уравнения, но не структуру модели и не рассчитывающие ее численные методы. Тем не менее, MathML широко применяется для обмена формул между математическими пакетами. Для систем моделирования такого языка не существует, и данная работа ставит целью его создание. 2 Обзор В программных комплексах для моделирования уже применяются различные XMLориентированные языки, которые ориентированы на ту или иную предметную область Эти языки описывают структуру соответствующих моделей, их параметры и зависимости между ними. Начиная с 90-х годов, это направление интенсивно развивается Особенно много подобных языков существует в областях химии, биологии и физиологиии: CellML , AnatML, BIOpolymer Markup Language (BIOML), Chemical Markup Language (CML), PhysioML, TissueML. Есть аналогичные разработки в области экономики: Business Process Modeling Language (BPML). Много языков моделирования существует в очень узких областях, например Face Modeling Language (FML) применяется в компьютерной анимации лица. Все эти языки более или менее предметно зависимы, то есть ориентированы на конкретную предметную область. Пока не решена задача извлечения из этих языков некой независящей от предметной области части. Эта часть достаточно велика: модели в очень многих областях сводятся к системам алгебраических и обыкновенных дифференциальных уравнений (средства для описания которых в существующих языках перемешаны со средствами для описания объектов предметной области). Поэтому одна из задач данной работы - создание предметно-независимого языка описания математических моделей указанного класса – обладает относительной новизной. Ещё большая новизна заключена в формализованном описании на основе XML численных методов для решения систем алгебраических и обыкновенных дифференциальных уравнений. В отличие от языков описания структуры моделей, при поиске литературы не было выявлено XML-ориентированных языков описания численных методов. 3 Язык описания вычислительных моделей Язык SimulML состоит из нескольких связанных между собой частей, описывающих структуру модели, параметры модели и численные методы, используемые для решения уравнений в этой модели. Все математические формулы описаны с помощью MathML, но, однако, возможности этого языка не полностью удовлетворяют нашим задачам, поэтому блок тегов SimulML предназначен для расширения MathML. Таким образом, SimulML имеет блочную структуру и каждый логически выделенный нами блок тегов имеет собственный Document Type Definition (DTD). Такое разделение придаёт языку определённую гибкость и позволяет менять отдельные блоки без изменения структуры самого языка 3.1 Теоретическая модель Теоретическая модель может описываться только формулами и значениями параметров, но она не обязана быть реализована с помощью какого-либо численного метода. Как правило, такие модели создаются не математиками, а экспертами соответствующей предметной области, которые обычно не оперируют с векторами, матрицами и другими сложными математическими объектами, но для них важно наличие у параметров модели определенных характеристик типа размерности, а также семантическая взаимосвязь между разными частями модели. На SimulML структура данных выглядит следующим образом: <!ELEMENT SystemofModels (SystemName, Model+, EquationSet+, Connection+)> <!ELEMENT SystemName (#PCDATA)> <!ELEMENT Model (ModelName,Description, ModelVariables, Model*)> <!ELEMENT ModelName (#PCDATA)> <!ELEMENT Description (#PCDATA)> <!ELEMENT ModelVariables (ModelVariable+)> <!ELEMENT ModelVariable (VariableName,VariableValue?)> <!ATTLIST ModelVariable id CDATA #REQUIRED type (in|out|calculated|regulated|constant) #REQUIRED description CDATA #IMPLIED dimension CDATA #IMPLIED units CDATA #IMPLIED> <!ELEMENT VariableName (ci)> <!ELEMENT VariableValue (#PCDATA)> <!ELEMENT Connection (Variable1,Variable2)> <!ATTLIST Connection model1 CDATA #REQUIRED model2 CDATA #REQUIRED> <!ELEMENT Variable1 (#PCDATA)> <!ELEMENT Variable2 (#PCDATA)> Корневым элементом SimulML является SystemofModels. Этот элемент может содержать несколько элементов Model, описывающих конкретную вычислительную модель, элемент EquationSet, содержащий уравнения, связывающие параметры моделей системы, и элемент Connection, описывающий связи между параметрами в различных моделях. Элемент Model может иметь иерархическую структуру и содержать другие элементы Model. Помимо этого, Model включает в себя элементы с символьным содержанием ModelName (задаёт имя модели) и Description (описание модели); и элемент ModelVariables. В ModelVariables содержатся переменные, которые характеризуют модель на теоретическом(предметном) уровне. Это своего рода внешние переменные модели и именно о них шла речь в начале этого пункта, когда говорилось, что теоретическая модель может описываться только формулами и значениями параметров. Элемент ModelVariables содержит несколько элементов ModelVariable. У ModelVariable есть пять атрибутов атрибута. Атрибут id определяет смысловое значение переменной, (например, давление жидкости на стенки сосуда).Атрибут type определяет тип параметра: входной, выходной, расчетный, регулируемый или константа . Описание переменной может содержаться в атрибуте description; в атрибуте dimension содержится размерность переменной (например, сила, концентрация и пр.); единицы измерения описаны в атрибуте units. Каждый элемент ModelVariable включает в себя элемент VariableName и необязательный элемент VariableValue. VariableName содержит математическое имя переменной, которое может быть задано тегами MathML. VariableValue определяет числовое значение переменной. Параметры различных моделей, объединенных в одну систему, могут быть связаны между собой и эти связи описываются в элементе Connection. Этот элемент содержит два атрибута model1 и model2 , принимающих значения имён связанных моделей (имя модели содержится в элементе ModelName). Внутри элемента указаны имена связанных переменных в первой (Variable1) и второй (Variable2) моделях. Похожий способ связывания существует и в других XML-ориентированных языках, например, в CellML. Но там в теге <connection> задаются дополнительные элементы <map_variables> с атрибутами variable_1 и variable_2 , определяющих имена связанных переменных. В SimulML связывание реализовано, по сути, тем же образом, но более изящно. 3.2 Язык описания численных методов В упомянутых в пункте 2 XML-ориентированных языках встречаются средства для описания расчетных параметров модели (например, шаг по времени), однако они не позволяют судить об использованном при моделировании численном методе и не отделены четко от параметров самой модели. В то же время вычислительный алгоритм часто обладает большей сложностью, чем модель предметной области, и для его описания на XML необходим специальный набор тегов, независимый от средств описания моделей. Описание численных методов предназначено уже не для эксперта предметной области, а для математика и может применяться независимо от задачи описания моделей, поэтому набор тегов, описывающих численные методы, вполне можно выделить в отдельный подъязык, который мы в дальнейшем мы будем именовать SimulNumML. SimulNumML описывает математическую формулировку модели, то есть оперирует не столько с параметрами модели и их взаимоотношениями, сколько с математическими объектами: векторами, вектор-функциями и пр. Опишем DTD этого языка, давая комментарии к нему по ходу описания. <!ELEMENT NumericalMethod ANY> Главный элемент языка NumericalMethod может включать в себя конкретные численные методы. Так как их количество в принципе не ограничено, то содержимое этого элемента обозначено ключевым словом ANY <!ENTITY % NumMethod " id ID #REQUIRED description CDATA #IMPLIED "> В тело главного элемента включена параметрическая сущность %NumMethod. Параметрические сущности обычно используются, когда стандартный набор атрибутов, логически связанных между собой, может часто наследоваться группой элементов. В нашем случае все конкретные численные методы наследуют уникальный идентификатор метода id и описание метода description у параметрической сущности %NumMethod, . 3.2.1 Методы решения алгебраических уравнений Методы решения алгебраических уравнений бывают простыми и итерационными. Рассмотрим по одному методу из каждого типа 3.2.1.1 Метод Гаусса <!ELEMENT GaussAEMethod (Datatype, MathBlock, MainElement?)> <!ATTLIST GaussAEMethod %NumMethod; > Элемент GaussAEMethod включает в себя элемент Datatype, описывающий тип переменных метода, элемент MathBlock, содержащий блоки математических выражений и необязательный элемент MainElement, который нужен для определния главного элемента в случае, если метод Гаусса будет реализовываться с выбором главного элемента. Также элемент GaussAEMethod наследует атрибуты параметрической сущности %NumMethod <!ELEMENT MathBlock (Name, (Math|MathBlock+))> <!ELEMENT Name (#PCDATA)> Структура, создаваемая элементами MathBlock, позволяет указать логику в математических формулах MathML. Например, в случае метода Гаусса можно отделить прямой ход метода от обратного. Каждый MathBlock имеет имя и может содержать как математические выражения в теге Math, так и другие элементы MathBlock. Все математические выражения, описывающие тот или иной численный метод, являются статическими и не зависят от каких-либо внешних параметров. В связи с этим было бы не очень разумно каждый раз включать их в xml-документы, описывающие модель. Правильнее было бы вынести все математические формулы в отдельный xml-документ для каждого численного метода. <!ATTLIST MathBlock XML:LINK CDATA #FIXED "SIMPLE" HREF CDATA #REQUIRED SHOW (EMBED | REPLACE | NEW) "EMBED" ACTUATE (AUTO | USER) "AUTO" > Эта ссылка реализована с помощью XLINK и выглядит следующим образом: <MathBlock HREF="GaussAEMethod.xml"/> Документ GaussAEMethod.xml состоит из нескольких элементов MathBlock и математических выражений на MathML (мы их здесь не будем приводить для экономии места): <MathBlock> <Name>directway</Name> <MathBlock> <Name>a-equation</Name> <Math>…</Math> </MathBlock> <MathBlock> <Name>b-equation</Name> <Math>…</Math> </MathBlock> </MathBlock> <MathBlock> <Name>reverseway</Name> <Math>…</Math> </MathBlock> Прямой ход метода Гаусса определяет переменные a и b, обратный ход определяет переменные x. Таким образом, блочная структура элементов MathBlock даёт нам возможность показать логику вычислений, о чём говорилось ранее <!ELEMENT MainElement (Datatype)> Тег MainElement содержит внутри номер главного элемента В заключение, приведём код на языке SimulNumML, описывающий метод Гаусса. Пример xml-кода, описывающего метод Гаусса: <NumericalMethod> <GaussAEMethod id="GaussAEMethod" description="Direct algebraic method for linear algebraic equations"> <DataType> <Param>A</Param> <ParamType>matrix</ParamType> </DataType> <DataType> <Param>b</Param> <ParamType>vector</ParamType> </DataType> <MathBlock HREF="GaussAEMethod.xml"/> <MainElement> <DataType> <Param>l</Param> <ParamType>int</ParamType> </DataType> </MainElement> </GaussAEMethod> </NumericalMethod> 3.2.1.2 Итерационные методы Итерационные методы решения алгебраических уравнений в отличие от прямых методов характеризуются неким набором условий, при котором метод заканчивают свою работу (назовём этот набор условий стоппером итерационного метода). <!ELEMENT IterativeAEMethod (Datatype, MathBlock, InCondition, MethodParam)> <!ATTLIST IterativeAEMethod %NumMethod; stopper IDREF #REQUIRED type (LinearMethod| UnlinearMethod) #IMPLIED > <!ELEMENT InCondition (math)> <!ELEMENT MethodParam (Param, ParamValue)> <!ELEMENT Param (#PCDATA)> <!ELEMENT ParamValue (cn)> Атрибут stopper в элементе IterativeAEMethod является маркированным и имеет тип IDREF. Атрибуты такого типа указывают на другие элементы в xml-документе и их значения должны совпадать со значениями атрибутов типа ID этих элементов. Атрибут stopper указывает на элемент, определяющий стоппер данного численного метода. Атрибут type определяет, какой тип итерационного метода будет использоваться: для линейных или нелинейных уравнений. Этот атрибут нужен, поскольку имеет место разная математическая реализация численного метода в случае линейной и нелинейной системы уравнений. Элемент IterativeAEMethod включает в себя также элемент InCondition, описывающий начальное условие применимости метода простых итераций (|F’(x)|<1). В элементе MethodParam задаются значения переменных метода, которыми в данном случае являются максимальное число итераций и необходимая точность вычислений, использующиеся в стопперах. Пример xml-кода, описывающего метод простых итераций: <NumericalMethod> <IterativeAEMethod id="SimpleIterativeAEMethod" description="Method of simple iterations for algebraic equations" type="UnlinearMethod" stopper="IterationsCountStopper"> <!-- Method of simple iterations for system of unlinear equations--> <DataType type="out"> <Param>x</Param> <ParamType>vector</ParamType> </DataType> <DataType> <Param>F</Param> <ParamType>fn</ParamType> <ParamType>vector</ParamType> </DataType> <DataType> <Param>x0</Param> <ParamType>vector</ParamType> </DataType> <MathBlock HREF="SimpleIterativeAEMethod.xml"/> <InCondition> <math> <apply> <lt/> <apply> <ceiling/> <apply> <diff/> <bvar> <ci>x</ci> </bvar> <apply> <ci>f</ci> <ci>x</ci> </apply> </apply> </apply> <cn>1</cn> </apply> </math> </InCondition> </IterativeAEMethod> <IterationsStopper> <IterationsCountStopper id="IterationsCountStopper"> <MaxIterationCount> <DataType type=” regulated”> <Param>N</Param> <ParamType>int</ParamType> </DataType> </MaxIterationCount> <MathBlock HREF="IterationsCountStopper.xml"/> </IterationsCountStopper> </IterationsStopper> <MethodParam> <Param>N</Param> <ParamValue/> </MethodParam> </NumericalMethod> В этом примере метод простых итераций использует IterationsCountStopper, останавливающий итерационный процесс, когда число итераций достигнет определённого значения. Подробнее о стопперах расскажем в следующем пункте 3.2.1.3 Стопперы итерационных методов <!ELEMENT IterationsStopper (IterationsCountStopper | ToleranceIterationsStopper | ComplexIterationsStopper)> Стопперы бывают трёх различных видов: по максимальному числу итераций (IterationsCountStopper), по заданной точности (ToleranceIterationsStopper) и комплексный стоппер, учитывающий в совокупности оба этих фактора (ComplexIterationsStopper). <!ELEMENT IterationsCountStopper (MaxIterationCount, Math)> <!ATTLIST IterationsCountStopper id ID #REQUIRED description CDATA #IMPLIED > <!ELEMENT MaxIterationCount (Datatype)> IterationsCountStopper включает в себя элемент MaxIterationCount, определяющий максимальное число итераций. Пример xml-кода данного стоппера был приведен в предыдущем пункте. <!ELEMENT ToleranceIterationsStopper (Math, Tolerance)> <!ATTLIST ToleranceIterationsStopper id ID #REQUIRED description CDATA #IMPLIED > <!ELEMENT Tolerance (Datatype)> В элементе Tolerance задаётся точность, по достижению которой итерации прекращаются <!ELEMENT ComplexIterationsStopper (Math, MaxIterationCount, Tolerance)> <!ATTLIST ComplexIterationsStopper id ID #REQUIRED description CDATA #IMPLIED > Комплексный стоппер определяет как максимальное число итераций, так и точность вычислений. MaxIterationCount и Tolerance объявлены именно элементами, а не атрибутами, поскольку это продиктовано способом передачи значения этих параметров от тега <MethodParam> к численному методу. 3.2.2 Методы решения обыкновенных дифференциальных уравнений 3.2.2.1 Методы, не имеющие параметров <!ELEMENT DefaultODEMethod (Math)> <!ATTLIST DefaultODEMethod %NumMethod; > Методы, не имеющие собственных параметров, просто наследуют атрибуты параметрической сущности %NumMethod 3.2.2.2 Методы типа Рунге-Кутты <!ELEMENT RungeKuttaMethod (MathBlock, ButcherTable)> <!ATTLIST RungeKuttaMethod %NumMethod; type (Explicit | Halfplicit | Implicit) "Explicit" > <!ELEMENT ButcherTable (Datatype)> Методы типа Рунге-Кутты имеют ряд числовых параметров, записываемых в таблицу Бутчера. Для этих параметров мы ввели специальный элемент ButcherTable Элемент RungeKuttaMethod наследует атрибуты параметрической сущности %NumMethod и имеет атрибут type, определяющий является ли этот метод явным, неявным или полуявным Пример xml-кода, описывающего метод Рунге-Кутты: <NumericalMethod> <RungeKuttaMethod id="RungeKuttaMethod" description="RungeKutta method for ordinary differential equations"> <DataType type="out"> <Param>v</Param> <ParamType>vector</ParamType> </DataType> <DataType type="calculated"> <Param>r</Param> <ParamType>vector</ParamType> </DataType> <DataType> <Param>f</Param> <ParamType>fn</ParamType> <ParamType>vector</ParamType> </DataType> <MathBlock HREF="RungeKuttaMethod.xml"/> <ButcherTable> <DataType> <Param>a</Param> <ParamType>vector</ParamType> </DataType> <DataType> <Param>c</Param> <ParamType>vector</ParamType> </DataType> <DataType> <Param>B</Param> <ParamType>matrix</ParamType> </DataType> </ButcherTable> </RungeKuttaMethod> </NumericalMethod> Вначале заданы типы данных, применяемых в методе переменных: входной параметр вектор-функция f, промежуточный параметр вектор r и выходной параметр вектор v. Затем с тега MathBlock стоит ссылка на xml-документ, непосредственно описывающий математические формулы метода. В элементе ButcherTable определены типы данных пере- менных, используемых в таблице Бутчера. Таким образом, элемент ButcherTable является аналогом элемента MethodParam в итерационных методах. 3.3 Параметры модели и их связь с численными методами Для численной реализации созданной экспертами теоретической модели с помощью математических методов необходимо связать воедино структуры данных, описанные в пунктах Error! Reference source not found. и 3.2. Дело в том, что численные методы требуют иной формализации исходных данных, чем модель, описанная на семантическом уровне. Основным содержанием XML-тегов, описанных ниже, является формализованное представление параметров вычислительной модели, которое делает удобным передачу этих параметров численным методам. В принципе, такое представление можно получить и без теоретического описания модели, однако параметры вычислительной модели могут быть связаны с параметрами теоретической модели, которые обладают другими характеристиками и сгруппированы по смыслу, а не по математическим признакам. Кроме того, строгая формализация параметров позволяет универсальным образом описывать соотношения между параметрами в виде систем уравнений; в разделе Error! Reference source not found. намеренно не предусмотрены функциональные соотношения между параметрами, поскольку способ их представления сильно зависит от предметной области. <!ELEMENT EquationSet (EquationSetDescription?, MathBlock,ModelParametres, NumericalMethod)> <!ELEMENT EquationSetDescription (#PCDATA)> <!ELEMENT ModelParametres (ModelParam+)> <!ELEMENT ModelParam (Param, ParamValue) <!ATTLIST ModelParam use_in IDREF #REQUIRED type (in|out|calculated|regulated|constant|def) ”in” > Модель может иметь несколько систем уравнений, поэтому может быть несколько элементов EquationSet. Каждый такой элемент в свою очередь содержит элементы EquationSetDescription (словесное описание данной системы), MathBlock (математические формулы на MathML), ModelParametres (параметры модели, использующиеся в численных методах) и NumericalMethod (численный метод, используемый для решения данной системы уравнений). Элементы ModelParametres и ModelVariables имеют практически одинаковое название, но по содержанию они отличаются. Элемент ModelParametres содержит внутренние параметры моделей, передающиеся численным методам.. Параметры внутри этого тега могут быть различными математическими объектами (вектор, матрица и т.п.) и не обязательно должны иметь числовые значения – они могут задаваться формулой. Различные переменные вполне могут дублироваться в элементах ModelVariables и ModelParametres, но это никоим образом не опровергает объективных различий между этими элементами. В ModelVariables содержатся переменные, характеризующие систему моделей на теоретическом уровне, в то время как ModelParametres содержит параметры, участвующие в вычислительных операциях внутри модели. Элемент ModelParametres состоит из нескольких элементов ModelParam. Каждый элемент ModelParam включает в себя элементы Param (содержит имя параметра) и ParamValue (значение параметра). Атрибут use_in элемента ModelParam ссылается на название метода или части этого метода, где данный параметр используется. Этот атрибут может ссылаться как на сами методы (например, use_in=”RungeKuttaMethod”), так и на их составные части (use_in=”ButcherTable”, например). Атрибут type определяет тип параметра. К значениям этого атрибута, перечисленным в пункте Error! Reference source not found. для элемента ModelVariables, добавилось значение “def” – type принимает это значение, когда параметр определяется математической формулой . По умолчанию type принимает значение ”in”. <!ELEMENT Param (ci)> <!ATTLIST Param overdetermined_name CDATA #IMPLIED> <!ELEMENT ParamValue (cn | vector | matrix | apply)> Элемент Param имеет атрибут overdetermined_name, который при необходимости переопределяет имя параметра, используемое в системе уравнений модели. Дело в том, что в численном методе зарезервированы имена для входящих в него переменных и они могут не совпадать с именем параметра, который модель передаёт численному методу. Чтобы избежать двусмысленности и путаницы можно переопределять имена параметров с помощью атрибута overdetermined_name. Допустим, мы имеем систему уравнений, решаемую методом Рунге-Кутта, в которой искомым параметром является вектор p. Так как в нашем описании метода Рунге-Кутта выходным параметром является вектор v, то мы можем переопределить имя этой переменной следующим образом: <Param overdetermined_name=”v” >p</Param> Элемент ParamValue содержит значение, которое модель передаёт численному методу. Обратим внимание, что это может быть не только численное значение, но и матрица, вектор, вектор-функция, то есть любой математический объект. Описывается этот объект с помощью тегов MathML. 3.4 Расширение возможностей MathML 3.4.1 Новые типы данных В численных методах фигурируют такие параметры как вектор-функция, матрица, элементами которой является функции и т.п. Возможности MathML ограничены и подобные типы данных отсутствуют в этом языке, поэтому приходится доопределять такие переменные с помощью элемента Datatype, уже встречавшегося в пункте 3.2. Опишем этот элемент в DTD: <!ELEMENT DataType (Param, ParamType+)> <!ATTLIST DataType type CDATA (in|out|calculated|regulated|constant) "in" > <!ELEMENT Param (#PCDATA)> <!ELEMENT ParamType (vector | fn | matrix | set | int | real | bool)> Параметр type элемента Datatype может принимать значения, описанные в пункте Error! Reference source not found. для элемента ModelVariables. По умолчанию type принимает значение ”in”, то есть параметр считается входным. Элементы ParamType определяют тип данных параметра и могут принимать значения ”вектор”, ”функция”, ”матрица”, ”множество”, ”целое число”, ”действительное число”, ”булиновская переменная”. Сложные типы данных образуются с помощью комбинации элементов ParamType, причём важна последовательность, в которой эти элементы расположены. Допустим, код <DataType> <Param>f</Param> <ParamType>fn</ParamType> <ParamType>vector</ParamType> </DataType> указывает на то, что f является вектор-функцией, а код <DataType> <Param>f</Param> <ParamType>vector</ParamType> <ParamType>fn</ParamType> </DataType> определяет f как функцию многих переменных. 3.4.2 Вспомогательные теги В MathML отсутствуют теги, направленные на описание логики математических вычислений. С целью элементарного структурирования формул в численных методах мы ввели элемент MathBlock , но его оказалось недостаточно для адекватного описания логики вычислений. Наиболее остро чувствуется невозможность создания циклических построений для более-менее точного описания численных методов и систем уравнений. Эту проблему можно решить с помощью определения в MathML дополнительного элемента <for>. <!ELEMENT for (ci,(apply|ci|cn),(apply|ci|cn),cn,(apply|for))> Как видим, for включает в себя пять элементов. Первый элемент содержит переменную цикла. Очевидно, что только ci может быть таким элементом. Второй и третий элементы задают нижний и верхний предел цикла соответственно. Эти пределы могут быть числом, переменной или формулой. Четвертый элемент в теге <cn> определяет шаг цикла. Наконец, пятый элемент содержит либо тело цикла в теге <apply>, либо новый цикл в теге <for>. Элемент <for> активно используется для описания метода Гаусса. Здесь же приведём более простой пример : допустим нам нужно задать n уравнений ai ak b , где i=1…n; k=0..i-1. Этот цикл будет выглядеть следующим образом: <for> <ci>i</ci> <cn>1</cn> <ci>n</ci> <for> <ci>k</ci> <cn>0</cn> <apply> <minus/> <ci>i</ci> <cn>1</cn> </apply> <apply> <eq/> <ci> <msub> <mrow> <mi>a</mi> </mrow> <mrow> <mi>i</mi> </mrow> <apply> <plus/> <ci> <msub> <mrow> <mi>a</mi> </mrow> <mrow> <mi>k</mi> </mrow>] <ci>b</ci> </apply> </for> </for> 4 Реализация языка и полученные результаты 4.1 Описание структуры системы моделей, состоящих из алгебраических уравнений, и взаимосвязи параметров внутри неё на примере модели сердца 4.1.1 Теоретическая модель В этом пункте будет описание теоретической модели на основе DTD, изложенного в Error! Reference source not found. Модель кровообращения имеет некоторые параметры и включает в себя другие модели: Модель 1 — Кровообращение Значение переменной Тип Имя Величина Единицы Размерность измерения Системный кровоток расчетный Q Давление на выходе из большого расчетный 70 мл/с Поток 1 Pout 3 мм.рт.ст Давление Pin2 13 мм.рт.ст Давление 2 Pout 6 мм.рт.ст Давление круга Давление на входе в малый круг расчетный Давление на выходе из малого расчетный круга Давление на входе в большой круг расчетный Pin1 100 мм.рт.ст Давление Модель 1.1 — Сосудистая система Модель 1.1.1 — Большой круг Общее сопротивление константа R1 1.4 мм.рт.ст/(мл/с) Сопротивление Жесткость (артерий) константа E1 0.8 мм.рт.ст/мл Жесткость Модель 1.1.2 — Малый круг Общее сопротивление константа 0.115 мм.рт.ст/(мл/с) Сопротивление R2 Модель 1.2 — Сердце Частота сердечных сокращений константа ν 65 уд/мин Частота Длительность систолы константа τs 0.28 с Время Модель 1.2.1 — Правый желудочек Сопротивление («ЭДС») константа мм.рт.ст/(мл/с) Сопротивление Rж Модель 1.2.2 — Левый желудочек Жесткость желудочка константа K 0.54 мм.рт.ст/мл Жесткость Выходная жесткость входной E 0.8 мм.рт.ст/мл Жесткость Выходное сопротивление входной R 1.4 мм.рт.ст/ Сопротивление (мл/с) Диастолическое давление входной Pd 6 мм.рт.ст Давление Нижнее артериальное давление выходной Pa 80 мм.рт.ст Давление Систолическое давление расчетный Ps 120 мм.рт.ст Давление систолическое регулиру- Pm 280 мм.рт.ст Давление Максимальное давление емый Систолический объем расчетный Vs 70 мл Объем систолический регулиру- Vm 40 мл Объем Vd 130 мл Объем ΔV 60 мл Объем Минимальный объем емый Диастолический объем регулируемый Ударный объем расчетный Формулизуем эту иерархическую структуру модели на SimulML: <SystemofModels> <SystemName>Организм человека</SystemName> <Model> <ModelName>Кровообращение</ModelName> <ModelVariables> <ModelVariable id="Системный кровоток" type="calculated" dimension="поток" units="мл/с" > <VariableName> <ci>Q</ci> </VariableName> <VariableValue>70</VariableValue> </ModelVariable> <ModelVariable id="Давление на выходе из большого круга" type="calculated" dimension="давление" units="мм.рт.ст"> <VariableName> <ci> <msubsup> <mi>P</mi> <mi>out</mi> <mn>1</mn> </msubsup> </ci> </VariableName> <VariableValue>3</VariableValue> </ModelVariable> <ModelVariable id="Давление на входе в малый круг" type="calculated" dimension="давление" units="мм.рт.ст"> <VariableName> <ci> <msubsup> <mi>P</mi> <mi>in</mi> <mn>2</mn> </msubsup> </ci> </VariableName> <VariableValue>13</VariableValue> </ModelVariable> <ModelVariable id="Давление на выходе из малого круга" type="calculated" dimension="давление" units="мм.рт.ст"> <VariableName> <ci> <msubsup> <mi>P</mi> <mi>out</mi> <mn>2</mn> </msubsup> </ci> </VariableName> <VariableValue>6</VariableValue> </ModelVariable> <ModelVariable id="Давление на входе в большой круг" type="calculated" dimension="давление" units="мм.рт.ст"> <VariableName> <ci> <msubsup> <mi>P</mi> <mi>in</mi> <mn>1</mn> </msubsup> </ci> </VariableName> <VariableValue>100</VariableValue> </ModelVariable> <ModelVariable id="Изменение объема" type="out" dimension="объем" units="мл"> <VariableName> <ci> &delta;V </ci> </VariableName> </ModelVariable> </ModelVariables> <Model> <ModelName>Сосудистая система</ModelName> <Model> <ModelName>Большой круг</ModelName> <ModelVariables> <ModelVariable id="Сопротивление" type="constant" dimension="сопротивление" units="мм.рт.ст/(мл/с)"> <VariableName> <ci> <msup> <mi>R</mi> <mn>1</mn> </msup> </ci> </VariableName> <VariableValue>1.4</VariableValue> </ModelVariable> <ModelVariable id="Жесткость артерий" type="constant" dimension="жесткость" units="мм.рт.ст/мл"> <VariableName> <ci> <msup> <mi>E</mi> <mn>1</mn> </msup> </ci> </VariableName> <VariableValue>0.8</VariableValue> </ModelVariable> </ModelVariables> </Model> <Model> <ModelName>Малый круг</ModelName> <ModelVariables> <ModelVariable id="Общее сопротивление" type="constant" dimension="сопротивление" units="мм.рт.ст/(мл/с)"> <VariableName> <ci> <msup> <mi>R</mi> <mn>2</mn> </msup> </ci> </VariableName> <VariableValue>0.115</VariableValue> </ModelVariable> </ModelVariables> </Model> </Model> <Model> <ModelName>Сердце</ModelName> <ModelVariables> <ModelVariable id="Частота сердечных сокращений" type="constant" dimension="частота" units="уд/мин"> <VariableName> <ci>&nu;</ci> </VariableName> <VariableValue>65 </VariableValue> </ModelVariable> <ModelVariable id="Длительность систолы" type="constant" dimension="время" units="сек"> <VariableName> <ci>&tau;</ci> </VariableName> <VariableValue>0.28 </VariableValue> </ModelVariable> </ModelVariables> <Model> <ModelName>Правый желудочек</ModelName> <ModelVariables> <ModelVariable id="Сопротивление («ЭДС»)" type="constant" dimension="сопротивление" units="мм.рт.ст/(мл/с)"> <VariableName> <ci> <msub> <mi>R</mi> <mi>ж</mi> </msub> </ci> </VariableName> <VariableValue>0.115</VariableValue> </ModelVariable> </ModelVariables> </Model> <Model> <ModelName>Левый желудочек</ModelName> <ModelVariables> <ModelVariable id="Жесткость желудочка" type="constant" " dimension="жесткость" units="мм.рт.ст/мл"> <VariableName> <ci>K</ci> </VariableName> <VariableValue>0.54</VariableValue> </ModelVariable> <ModelVariable id="Выходная жесткость" type="in" dimension="жесткость" units="мм.рт.ст/мл"> <VariableName> <ci>E</ci> </VariableName> <VariableValue>0.8 </VariableValue> </ModelVariable> <ModelVariable id="Выходное сопротивление" type="in" dimension="сопротивление" units="мм.рт.ст/(мл/с)"> <VariableName> <ci>R</ci> </VariableName> <VariableValue>1.4</VariableValue> </ModelVariable> <ModelVariable id="Диастолическое давление" type="in" dimension="давление" units="мм.рт.ст"> <VariableName> <ci> <msub> <mi>P</mi> <mi>d</mi> </msub> </ci> </VariableName> <VariableValue>6 </VariableValue> </ModelVariable> <ModelVariable id="Нижнее артериальное давление" type="out" " dimension="давление" units="мм.рт.ст"> <VariableName> <ci> <msub> <mi>P</mi> <mi>a</mi> </msub> </ci> </VariableName> <VariableValue>80</VariableValue> </ModelVariable> <ModelVariable id="Систолическое давление" type="calculated" dimension="давление" units="мм.рт.ст"> <VariableName> <ci> <msub> <mi>P</mi> <mi>s</mi> </msub> </ci> </VariableName> <VariableValue>120</VariableValue> </ModelVariable> <ModelVariable id="Максимальное систолическое давление" type="regulated" dimension="давление" units="мм.рт.ст"> <VariableName> <ci> <msub> <mi>P</mi> <mi>m</mi> </msub> </ci> </VariableName> <VariableValue>280 </VariableValue> </ModelVariable> <ModelVariable id="Систолический объем" type="calculated" " dimension="объем" units="мл"> <VariableName> <ci> <msub> <mi>V</mi> <mi>s</mi> </msub> </ci> </VariableName> <VariableValue>70 </VariableValue> </ModelVariable> <ModelVariable id="Минимальный систолический объем" type="regulated" dimension="объем" units="мл"> <VariableName> <ci> <msub> <mi>V</mi> <mi>m</mi> </msub> </ci> </VariableName> <VariableValue>40 </VariableValue> </ModelVariable> <ModelVariable id="Диастолический объем" type="regulated" dimension="объем" units="мл"> <VariableName> <ci> <msub> <mi>V</mi> <mi>d</mi> </msub> </ci> </VariableName> <VariableValue>130</VariableValue> </ModelVariable> <ModelVariable id="Ударный объем" type="out" dimension="объем" units="мл"> <VariableName> <ci> &delta;V </ci> </VariableName> <VariableValue>60</VariableValue> </ModelVariable> </ModelVariables> </Model> </Model> </Model> ....... </SystemofModels> Параметры модели в этой системе связаны между собой и мы можем указать эти связи в элементах Connection. Напомним, что теоретическая модель не содержит уравнений и связи переменных просто указаны качественно. В данной модели подобных связей очень много – опишем одну для примера. Так выглядит связь системного кровотока Q с диастолическим давлением Pd : <Connection model1="Кровообращение" model2="Левый желудочек"> <Variable1> <ci>Q</ci> </Variable1> <Variable2> <ci> <msub> <mi>P</mi> <mi>d</mi> </msub> </ci> </Variable2> </Connection> 4.1.2 Вычислительная модель Теперь перейдем непосредственно к описанию зависимостей между параметрами в различных моделях, то есть к системам уравнений. Три уравнения связывают параметры внутри модели ”Левый желудочек”: Vd f1 Pd ; Pm f 2 Vd ; Vm f 3 Pd Описание этих моделей должно производится в элементе EquationSet. Приведем описание первого уравнения и численного метода простых итераций, решающего его. <EquationSet> <EquationSetDescription>Уравнение модели “Левый желудочек”, связывающее диастолический объем и диастолическое давление</EquationSetDesvription> <MathBlock> <math xmlns="http://www.w3.org/1998/Math/MathML"> <apply> <eq/> <ci> <msub> <mrow> <mi>V</mi> </mrow> <mrow> <mi>d</mi> </mrow> </msub> </ci> <apply> <ci> <msub> <mrow> <mi>f</mi> </mrow> <mrow> <mn>1</mn> </mrow> </msub> </ci> <ci> <msub> <mrow> <mi>P</mi> </mrow> <mrow> <mi>d</mi> </mrow> </msub> </ci> </apply> </apply> </math> </MathBlock> <NumericalMethod> <IterativeAEMethod id="SimpleIterativeAEMethod" description="Method of simple iterations for algebraic equations" type="UnlinearMethod" stopper="IterationsCountStopper"> <!-- Method of simple iterations for system of unlinear equations--> <DataType type="out"> <Param>x</Param> <ParamType>vector</ParamType> </DataType> <DataType> <Param>F</Param> <ParamType>fn</ParamType> <ParamType>vector</ParamType> </DataType> <DataType> <Param>x0</Param> <ParamType>vector</ParamType> </DataType> <MathBlock> <Name>SimpleIterativeMethod</Name> <MathBlock> <Name>MainEquation</Name> <for xmlns=”http://www.w3.org/1998/Math/MathML”> <ci>k</ci> <cn>0</cn> <ci>K</ci> <cn>1</cn> <apply> <eq/> <ci> <msub> <mi>x</mi> <mrow> <mi>k</mi> <mo>+</mo> <mn>1</mn> </mrow> </msub> </ci> <apply> <ci>F</ci> <ci> <msub> <mi>x</mi> <mi>k</mi> </msub> </ci> </apply> </apply> </math> </MathBlock> <MathBlock> <Name>InitialCondition</Name> <math xmlns=”http://www.w3.org/1998/Math/MathML”> <apply> <eq/> <apply> <ci>x</ci> <cn>0</cn> </apply> <ci>x0</ci> </apply> </math> </MathBlock> </MathBlock> <InCondition> ................................... </InCondition> </IterativeAEMethod> <IterationsStopper> <IterationsCountStopper id="IterationsCountStopper"> <MaxIterationCount> <DataType type=” regulated”> <Param>N</Param> <ParamType>int</ParamType> </DataType> </MaxIterationCount> <MathBlock> <math xmlns=”http://www.w3.org/1998/Math/MathML”> <apply> <eq/> <ci>K</ci> <ci>N</ci> </apply> </ math> </IterationsCountStopper> </IterationsStopper> <MethodParam> <Param>K</Param> </MethodParam> </NumericalMethod> <ModelParametres> ………………….. </ModelParametres> </EquationSet> В элементе ModelParametres описывается передача параметров модели численным методам. Здесь мы не будем подробно останавливаться на этом процессе: он подробно описан в пункте 4.2. Ряд уравнений связывает параметры в разных моделях: 1 E d P Pd K P Pd Q m m , x R x Vd Vm 1 e Pin1 K 1 1 2 RQ ; Pout Pin1 RQ ; Pin2 Pout RжQ ; Pout Pin2 R 2Q E d 2 Pd Pout Pa Pd PS Pd e x ; ΔV=Vd–VS Эти уравнения также описаны в теге <EquationSet>. Приведём для примера последнее уравнение, не использующее для решения численный метод: <SystemofModels> <SystemName>Организм человека</SystemName> <Model> ………………………….. </Model > <EquationSet> <MathBlock> <Name>Уравнения для определения ударного объема</Name> <math xmlns="http://www.w3.org/1998/Math/MathML"> <apply> <eq/> <ci>&Delta;V</ci> <apply> <minus/> <ci> <msub> <mrow> <mi>V</mi> </mrow> <mrow> <mi>d</mi> </mrow> </msub> </ci> <ci> <msub> <mrow> <mi>V</mi> </mrow> <mrow> <mi>s</mi> </mrow> </msub> </ci> </apply> </apply> </math> </MathBlock> </EquationSet> < EquationSet > …………………….. </EquationSet> </SystemofModels> 4.2 Описание модели, состоящей из дифференциальных уравнений, решаемых методами Рунге-Кутты, на примере ”модели экскаватора” “Модель экскаватора” состоит из одного сервера, обслуживающего N клиентов, причём скорость обслуживания одинакова и клиенты возвращаются к северу за равные промежутки времени. Можно представить, что сервер является экскаватором, нагружающим грузовые машины. Параметрами модели являются скорость обслуживания машин экскаватором μ и скорость передвижения машин ν. Искомыми величинами являются вероятности pk (t ) , k=0,...,N того, что в данный момент времени k клиентов стоят перед экскаватором в очереди. Получается система, состоящая из N дифференциальных уравнений: p0 (t ) N p0 (t ) p1 (t ), pk (t ) ( N k 1) pk 1 (t ) ( ( N k ) ) pk (t ) pk 1 (t ) k 1,..., N 1 (1) pN (t ) pN 1 (t ) pN (t ) 4.2.1 Общая структура и системы уравнений модели <Model> <ModelName>Excavator Model</ModelName> <Description>The model of maintenance of N customers (transport vehicles) by server (excavator). Unknown quantities in this model are probabilities of how many vehicles are waiting in the queue. </Description> <ModelVariables> …………………………………… </ModelVariables> </Model> <EquationSet> <MathBlock> <Name>Excavator Model Equation Set</Name> <MathBlock> <Name> First Equation</Name> <math xmlns="http://www.w3.org/1998/Math/MathML"> …… </MathBlock> <MathBlock> <Name> Middle Equations</Name> <for xmlns="http://www.w3.org/1998/Math/MathML"> …… </MathBlock> <MathBlock> <Name> Last Equation</Name> <math xmlns="http://www.w3.org/1998/Math/MathML"> …… </MathBlock> </MathBlock> <NumericalMethod> <RungeKuttaMethod id="RungeKuttaMethod" description="RungeKutta equations"> …… </NumericalMethod> <ModelParametres> <ModelParam use_in="RungeKuttaMethod" type=”out”> method for ordinary differential <Param overdetermined_name="v"><ci>p</ci></Param> <ParamValue> ….. </ModelParam> <ModelParam use_in="RungeKuttaMethod" type=”def”> <Param><ci>f</ci></Param> <ParamValue> ….. </ModelParam> ……………………………. </ModelParametres> </EquationSet> После тега <Model> следует элемент EquationSet, описывающий систему уравнений (1). Эта система уравнений разбита на три части, каждая из которых описывается в отдельном теге <MathBlock>. Первый элемент MathBlock описывает первое уравнений системы, третий MathBlock – последнее уравнение. Второй MathBlock с помощью цикла описывает оставшиеся (N-1) уравнений. Затем идёт элемент NumericalMethod , описывающий каким численным методом решается данная система уравнений. Эта система решается с помощью метода Рунге-Кутта. Далее в теге <ModelParametres> описываются параметры модели, передаваемые численным методам. На этом описание вычислительной модели с помощью SimulML заканчивается 4.2.2 Численный метод, решающий систему уравнений модели <NumericalMethod> <RungeKuttaMethod id="RungeKuttaMethod" description="RungeKutta method for ordinary differential equations"> Элемент RungeKuttaMethod определяет, каким именно численным методом будет решаться система уравнений. <DataType type="out"> <Param><ci>v</ci></Param> <ParamType>vector</ParamType> </DataType> <DataType type="calculated"> <Param><ci>r</ci></Param> <ParamType>vector</ParamType> </DataType> <DataType> <Param><ci>f</ci></Param> <ParamType>fn</ParamType> <ParamType>vector</ParamType> </DataType> Далее следуют типы данных, используемые в данном численном методе. Мы видим, что метод Рунге-Кутта использует входной параметр вектор-функцию f , промежуточный параметр вектор r и выдаёт на выходе вектор v <MathBlock HREF="RungeKuttaMethod.xml"/> С элемента MathBlock идет Xlink на xml-документ RungeKuttaMethod.xml, в котором описываются математические формулы, используемые в методе Рунге-Кутты. Этот xmlдокумент выглядит следующим образом: <MathBlock> <Name>Runge-Kutta Method</Name> <MathBlock> <Name> Main Equation</Name> <math xmlns="http://www.w3.org/1998/Math/MathML"> …… </MathBlock> <MathBlock> <Name> r equation</Name> <for xmlns="http://www.w3.org/1998/Math/MathML"> …… </MathBlock> <MathBlock> <Name>a equation</Name> <math xmlns="http://www.w3.org/1998/Math/MathML"> …… </MathBlock> </MathBlock> В конце описания численного метода задаются типы данных параметров, используемых в таблице Бутчера: <ButcherTable> <DataType> <Param><ci>a</ci></Param> <ParamType>vector</ParamType> </DataType> <DataType> <Param><ci>c</ci></Param> <ParamType>vector</ParamType> </DataType> <DataType> <Param><ci>B</ci></Param> <ParamType>matrix</ParamType> </DataType> </ButcherTable> </RungeKuttaMethod> </NumericalMethod> 4.2.3 Параметры модели В элементе ModelParametres перечисляются параметры модели, передаваемые численному методу или его составной части. <ModelParametres> <ModelParam use_in="RungeKuttaMethod" type=”out”> <Param overdetermined_name="v"><ci>p</ci></Param> <ParamValue> <vector> <!-- cycle determining vector components--> …………. </ParamValue> </Param> </ModelParam> Вектор p – это выходной параметр метода Рунге-Кутты (в описании самого метода этот параметр назывался v, поэтому нам пришлось переопределить его название с помощью атрибута overdetermined_name). Компоненты вектора задаются с помощью цикла. <ModelParam use_in="RungeKuttaMethod" type=”def”>> <Param><ci>f</ci></Param> <ParamValue> <vector> <apply> <!-- first vector-function component--> .................. </apply> <apply> <!-- middle vector-function components (determined by cycle)--> ………………….. </apply> <apply> <!--last vector-function component--> .................. </apply> </vector> </ParamValue> </ModelParam> Вектор-функция f , передаваемая методу Рунге-Кутта, задаётся по частям : определяется первый компонент вектор функции, затем с помощью цикла последующие (N-1) компонентов и отдельно последний компонент вектор-функции <ModelParam use_in="RungeKuttaMethod" type="regulated" > <Param><ci>N</ci></Param> <!--value of this variable may be determined by user --> <ParamValue/> </ModelParam> <ModelParam use_in="RungeKuttaMethod" type="regulated" > <Param><ci>&nu;</ci></Param> <!--value of this variable may be determined by user --> <ParamValue/> </ModelParam> <ModelParam use_in="RungeKuttaMethod" type="regulated" > <!--value of this variable may be determined by user --> <Param><ci>&mu;</ci></Param> <ParamValue/> </ModelParam> Параметры N, ν, μ также передаются методу Рунге-Кутта. Их значения могут варьироваться пользователем, работающим с программным приложением, использующим SimulML . <ModelParam use_in="ButcherTable"> <Param><ci>B</ci></Param> <ParamValue> <matrix> <matrixrow> <cn> 0 </cn> <cn> 0 </cn> <cn> 0 </cn> </matrixrow> <matrixrow> <cn> 1 </cn> <cn> 0 </cn> <cn> 0 </cn> </matrixrow> <matrixrow> <cn> 2 </cn> <cn> 3 </cn> <cn> 0 </cn> </matrixrow> </matrix> </ParamValue> </ModelParam> <ModelParam use_in="ButcherTable"> <Param><ci>a</ci></Param> <ParamValue> <vector> <cn>1</cn> <cn>1</cn> <cn>1</cn> </vector> </ParamValue> </ModelParam> <ModelParam use_in="ButcherTable"> <Param><ci>c</ci></Param> <ParamValue> <vector> <cn>1</cn> <cn>2</cn> <cn>3</cn> </vector> </ParamValue> </ModelParam> </ModelParametres> В конце описания модели задаются параметры a, c и B , задающие таблицу Бутчера. 5 Заключение В данной работе решена задача создания XML-ориентированного языка описания вычислительных моделей. Язык SimulML описывает модель как на теоретическом уровне (структура модели, параметры модели и зависимости между ними), так и на уровне математических вычислений (численных методов, решающих системы уравнений модели). Связующим звеном между этими описаниями является набор тегов, отвечающих за передачу параметров модели численным методам. Полноту и гибкость созданного языка подтвердила реализация на SimulML двух конкретных вычислительных моделей: в модели кровообращения упор делался на описание структуры системы моделей и связи различных параметров внутри этой системы, в модели экскаватора была наглядным образом показана связь внутренних параметров модели с численными методами. Общим направлением работы являлось повышение уровня воспроизводимости результатов научных исследований в области численного моделирования. В дальнейшем можно решать следующие задачи в этом направлении: импорт/экспорт тегов SimulML в конкретный программный комплекс для моделирования, создание механизма генерации из SimulML исходного кода на языках программирования.