МСС ресурс Freeware Open source Кафедра МСС Факультет  

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

ПРО ПАКЕТ ПОПЕРЕДНІЙ КЛАС НАСТУПНИЙ КЛАС      

integr.h
Клас integration

calc
  |
  +--integration

Використовує класи :
model, cauchy_region, result_manager
 

Якщо у класі model задані праві частини системи диференціальних рівнянь x'=F(t,x), де x n-вимірний вектор (n>0), F - n-вимірна вектор-функція, то за допомогою даного класу можна здійснити чисельне розв’язування задачі Коші. Клас є базовим для цілого ряду методів чисельного інтегрування. Сам він реалізує найпростіший метод – Ейлера (з фіксованим кроком).

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

У файлі mds.h визначено наступні типи.
typedef double MDS_DEFAULT_TYPE;
typedef mds_exception_message MDS_DEFAULT_EXCEPTION;
typedef integration <MDS_DEFAULT_TYPE, MDS_DEFAULT_EXCEPTION> Integration;


 

Члени класу
T step
           Параметр інтегрування: крок методу.

 

Конструктори
integration <class T = MDS_DEFAULT_TYPE, class EXCEPTION = MDS_DEFAULT_EXCEPTION> (const T& userStep)
             Параметр: крок методу userStep. Типи: T - тип обчислень, EXCEPTION - тип винятків.

 

Функції-члени класу
 virtual valarray <T>

Method(const valarray<model*>& pModels, const cauchy_region& region, result_manager& resCalc, bool isEnlargedPhase)
           Алгоритм інтегрування. Покажчики на моделі, які підлягають інтегруванню знаходяться у pModels; границі інтегрування задаються у region; збереження поточних результатів здійснюється за допомогою resCalc. Повертає значення як фазовий вектор у останній точці інтегрування при isEnlargedPhase = false, або розширений фазовий вектор (перша координата - час) при isEnlargedPhase = true.

 

Наслідкові функції-члени класу calc
Calculate, CalcReturnValue

 

Опис

Даний клас є базовим для цілого ряду методів чисельного інтегрування. Сам він реалізує найпростіший метод – Ейлера (з фіксованим кроком step).

Запуск процесу інтегрування здійснюється за допомогою сервісних функцій типу Calculate(const valarray<model*>& pModels, const cauchy_region& region, result_manager& resCalc, bool isEnlargedPhase = false) класу calc. Тут перший параметр – покажчик (або valarray покажчиків) на модель, що підлягає інтегруванню. Коли мова йшла про клас model, зазначалося, що цей клас проектувався, зокрема, для того, щоб компонувати з окремих моделей загальний комплекс, отже логічно припустити наявність можливості проводити інтегрування для всіх моделей комплексу одночасно (через valarray<model*>). Початкові та кінцеві умови задаються у region класу cauchy_region. Проміжні результати (якщо вони потрібні) – у resCalc класу result_manager. Приблизно так:

Integration integr(0.5); //будемо інтегрувати з кроком 0.5
//запуск процесу інтегрування моделі MyModel на області MyCauchyRegion із записом результатів у MyResult
integr.Calculate(MyModel, MyCauchyRegion, MyResult);

Тут MyModel може бути адресою однієї моделі, або ж масивом (точніше valarray'єм) адрес на декілька моделей, MyResult містить всі проміжні результати інтегрування (тобто динаміку моделі), а кінцеві результати інтегрування повертаються самою функцією Calculate(). Якщо проміжні результати не потрібні, то

v = integr.Calculate(MyModel, MyCauchyRegion);

запише результат інтегрування у v (типу valarray).

Зауваження:
1) якщо початкові умови порушують границі інтегрування (тобто алгоритм не зробить жодної ітерації), то контейнер MyResult не поповниться, а результат v не визначений;
2) знак кроку step не важливий, якщо у region умовою виходу є фінальний час. Але якщо умовою виходу є деяка функція користувача, то знак кроку step необхідно вказувати згідно напрямку руху у досліджуваному процесі (додатній, якщо час зростає та від'ємний у протилежному випадку).

Зауваження для розробників. Даний клас проектувався таким чином, щоб використати по можливості світове надбання у чисельних методах інтегрування. Тобто, цей клас можна (і треба) використовувати також як оболонку для готових процедур інтегрування без їхньої переробки. Для цього необхідно забезпечити наявність всіх параметрів (бажано як членів класу) та викликати готову функцію інтегрування з функції Method(). При програмуванні нових методів інтегрування необхідно наслідуватися від даного класу, після чого перевантажити віртуальну функцію Method(). Як основу використовуйте, будь-ласка, код даного методу Ейлера.

Див. також опис класу integration_rk45. Приклад використання МДС знаходиться у файлі main.cpp у директорії mds_example. Додаткова інформація по використанню міститься в описі пакету.


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

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