МСС ресурс Freeware Open source Кафедра МСС Факультет
Пакет
"Моделювання
Динамічних Систем"
v5.2
ОПИСИ КЛАСІВ      

Пакет "Моделювання Динамічних Систем" (МДС)

Кафедра МСС

Мова:
С++ (ISO/IEC 14882, Standard for the C++ Programming Language)
Платформа:
мультиплатформений
Містить класи:
model, cauchy_region, calc, dynamo, discrete, integration, integration_rk45, result_manager, mds_exception, mds_exception_message
Файли:
mds.h, model.h, region.h, calc.h, dynamo.h, discrete.h, integr.h, rk45.h, result.h, mds_error.h, mds_assert.h, gnu_std_valarray.h

 


Пакет "Моделювання Динамічних Систем" (МДС) є універсальним програмним інструментарієм для підготовки та проведення обчислювальних експериментів з математичними моделями. МДС дозволяє задавати як одну (цілісну) модель, так і складати із таких моделей комплекси, в якому кожна складова функціонує за своїми власними законами. Надаються засоби для розрахунку динаміки заданих моделей (або комплексів моделей). Передбачено можливість роботи із довільним типом даних (по замовчуванню із типом double), що дозволяє проводити обчислення з підвищеною точністю. У режимі відладки (DEBUG) здійснюється автоматичний контроль допустимості операцій.

Базові компоненти:

Допоміжні компоненти:

 


Розглянемо можливості пакету МДС на простому прикладі: розрахуємо динаміку системи рівнянь при t від 0 до 10 з умовою Коші x1(0)=10, x2(0)=20. Наведений нижче програмний код міститься у файлі main.cpp у директорії mds_example. Додаткова інформація по використанню окремих класів міститься в їх описах.

01. //******* 1-ИЙ КРОК: підключення h-файлів для використання МДС
02. //УВАГА: для gnu c++ v.2.96 НЕОБХІДНО підключити gnu_std_valarray.h у mds.h
03. #include "../mds/mds.h"

04. //додаткові підключення:
05. #include <math.h>
06. #include <valarray>
07. using namespace std;

08. //******* 2-ИЙ КРОК: модель з 2 диф. рівнянь x'1(t)=f1(t,x)=cos(t+1), x'2(t)=f2(t,x)=x1+t
09. class SimpleModel : public Model
10. {
11. public:

12.     SimpleModel() : Model(2) //тобто розмірність 2: f1, f2
13.     { }

14.     void RightPart(valarray<double>& f)
15.     {
16.         f[0] = cos(t + 1); //перше рівняння: cos(t+1)
17.         f[1] = x[0] + t; //друге рівняння: x1+t
18.     }

19. };

20. int main(int argc, char* argv[])
21. {

22. //******* 3-ІЙ КРОК: продовження кроку 2 та створення моделі
23. SimpleModel MyFirstModel; //тепер можна моделювати

24. //******* 4-ИЙ КРОК: підготовка інтегрування (метод Ейлера)
25. Integration integr(0.1); //параметр: крок

26. //******* 5-ИЙ КРОК: підготовка контейнеру результатів
27. ResultManager result("result.txt"); //параметр: файл з результатами

28. //******* 6-ИЙ КРОК: моделювання з ум. Коші x0=x(t0) - 2-вимірний вектор
29. valarray<double> x0(2);
30. x0[0] = 0.5; //x1(t0)
31. x0[1] = -0.5; //x2(t0)
32. //моделювання від t0=0 до T=10.
33. integr.Calculate(MyFirstModel, CauchyRegion(0., x0, 10.), result);

34. cout << "All done! See file result.txt \n";
35. return 0;
36. }

Отже:
Стрічки 01-07. Підключаємо необхідні h-файли.
Стрічки 08-19. Програмуємо математичну модель (точніше праві частини системи рівнянь). Для цього наслідуємося від класу model (Model - це model для типу double з консольними виключеннями mds_exception_message) - стрічка 09, вказуємо розмірність системи рівнянь (в нашому випадку 2) - стрічка 12, перевантажуємо віртуальну функцію RightPart (синтаксис шапки ні в якому разі не можна змінювати!) - стрічки 14-18. Тут x - фазовий вектор (системна змінна, розмірність якої вказується у конструкторі - стрічка 12), t - час (теж системна змінна).
Стрічка 23. Створюємо об'єкт класу SimpleModel (який будемо використовувати у функції інтегрування).
Стрічка 25. Готуємо метод інтегрування.
Стрічка 27. Готуємо контейнер, куди буде записано результати інтегрування на всьому проміжку. Контейнер автоматично запише отримані дані у вказаний файл. Якщо необхідно отримати результати інтегрування тільки в кінцевий момент часу, то контейнер не потрібен.
Стрічки 29-31. Готуємо умову Коші - 2-вимірний valarray, компоненти якого є відповідними компонентами фазового вектору у початковий момент часу.
Стрічка 33. Запуск процесу інтегрування моделі MyFirstModel із записом результатів у контейнер result.
Стрічка 35. Автоматичний запуск авто-запам'ятовування контейнеру result у вказаний файл result.txt.

Певна річ, модель може містити додаткові параметри або функції-члени класу. Головне узагальнення наведеної схеми полягає у використанні довільного базового типу для розрахунків. Стандартним типом є double. Він швидкий, але його точність обмежується 15 знаками після коми, що не завжди прийнятно. Тому інколи доцільно замість double провести розрахунки на типах підвищеної точності (на жаль, такі типи не стандартизовані). Нехай тип обчислень має назву number. Тоді необхідно вказати
У стрічці 09: class SimpleModel : public model<number>
У стрічці 12: SimpleModel() : model<number>(2)
У стрічці 14: virtual void RightPart(valarray<number>& f)
У стрічці 29: valarray<number> x0(2);
У стрічці 33: попіклуватися, щоб часові дані (моменти часу 0 та 10) відповідали типу number.

Наведені зміни доцільно автоматизувати за допомогою шаблонів (template). Оскільки всі операції у МДС проводяться з типом MDS_DEFAULT_TYPE (визначений у mds.h), то зміну типу double на інший можна здійснити корекцією оператора визначення типу у файлі mds.h:

typedef double MDS_DEFAULT_TYPE; //замість double можна використати інший тип

Аналогічна ситуація з виключеннями, які генеруються у разі виконання некорректних операцій у режимі відладки. За замовчуванням використовуються виключення, які виводять повідомлення на консоль (mds_exception_message), але є можливість замінити їх на "мовчазні" виключення (mds_exception). В будь-якому випадку їх можна перехоплювати та обробляти стандартними прийомами.

Додаткова інформація про утворення комплексів моделей, про режими емуляції, формат файлу результатів тощо міститься в описах відповідних класів.

Для ефективної роботи рекомендується застосовувати додаткові сервісні модулі, такі як модуль ініціалізації за допомогою ini-файлів, модуль ведення журналу подій (log-файли), модулі вводу/виводу, матричні обчислення та інші, представлені на сайті МСС ресурс.


Оновлення.


Пакет МДС був використаний при моделюванні обертового руху мікросупутника та розрахунків оптимальних режимів переорієнтації в рамках міжнародного проекту „Програмно-апаратні засоби моделювання та оптимізація систем керування мікросупутників” за участю Київського нацiонального унiверситету iменi Тараса Шевченка, Національного космічного агенства НАН України, КБ „Хартрон" (Запорiжжя), за спiвробiтництва Йельского університету (США), Бруклiнського полiтехнiчного унiверситету (США).

Пакет МДС був використаний при розрахунках оптимальних перевезень збіжжя по теріторії України за замовленням ТОВ "Українська зерноторгівельна компанія".

Пакет МДС був використаний при побудові бібліотеки опорних функцій та розрахунках задач практичної стійкості в рамках державної теми №01БФ015-05 „Розробка структурованих математичних та програмних технологій для моделювання, аналізу, оцінки та оптимізації складних систем”.

 

(c) 2002-2004 Башняков О.М. (bash@unicyb.kiev.ua)
(c) 2003,2004 Поліщук О.А. (zagamuf@ua.fm), class integration_rk45, assertion macro


Будь-ласка, надсилайте пропозиції, питання, зауваження: soft@unicyb.kiev.ua
Запрошуємо також до участі у самому проекті: надсилайте свої матеріали, які, по-можливості, будуть виставлені на сайті (див. Для авторів).

Кафедра Моделювання складних систем факультету кібернетики Київського університету імені Тараса Шевченка
03127, Україна, Київ, просп. Глушкова 2, корп. 6, кафедра МСС тел.: (044) 259-05-31, (044) 259-02-37, e-mail: garash@unicyb.kiev.ua
Всі права застережено.