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

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

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

region.h
Клас cauchy_region

 
Використовується у:
calc::Method, calc::Calculate

Даний клас призначений для функцій обробки моделей, якщо цю обробку необхідно проводити від чогось_початкового і до чогось_фінального. Наприклад, моделювання можна проводити на відрізку часу від t0 до T. Або інтегрування можна задавати початковою умовою Коші (x(t0)=x0) та продовжувати процес доки траєкторія не перетне задану поверхню g(t,x)=0. За допомогою представленого класу можна вказувати границі процесу у вищезазначених випадках.

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

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


 

Члени класу
private T t0
          Початковий час t0.
private valarray <T> x0
          Умова Коші {x1(t0), x2(t0),..., xn(t0)}
private T tFinal
          Фінальний час. Використовується у випадку, якщо не задано функцію виходу Region().
private int(*) (const T&, const valarray<T>&) Region
          Покажчик на функцію, що визначає кінцеву умову, повертаючи 1 – якщо аргумент належить, -1 – не належить, 0 – на границі області. Якщо така функція не задана, буде використано значення tFinal.
private valarray <bool> mask
          Маска для відокремлення фази з розширеного фазового вектору.

 

Конструктори
cauchy_region <class T = MDS_DEFAULT_TYPE, class EXCEPTION = MDS_DEFAULT_EXCEPTION> (const valarray<T>& cauchyCond, int(*f) (const T&, const valarray<T>&))
            Базовий конструктор: умова Коші (як елемент розширеного фазового простору) & функція виходу Region(). Типи: T - тип обчислень, EXCEPTION - тип винятків.
cauchy_region <class T = MDS_DEFAULT_TYPE, class EXCEPTION = MDS_DEFAULT_EXCEPTION> (const valarray<T>& cauchyCond, const T& time)
            Умова Коші (як елемент розширеного фазового простору) & час виходу time. Типи: T - тип обчислень, EXCEPTION - тип винятків.
cauchy_region <class T = MDS_DEFAULT_TYPE, class EXCEPTION = MDS_DEFAULT_EXCEPTION> (const T& t0, const valarray<T>& x0, int(*f) (const T&, const valarray<T>&))
            Умова Коші x(t0)=x0 та функція виходу Region(). Типи: T - тип обчислень, EXCEPTION - тип винятків.
cauchy_region <class T = MDS_DEFAULT_TYPE, class EXCEPTION = MDS_DEFAULT_EXCEPTION> (const T& t0, const valarray<T>& x0, const T& time)
            Умова Коші x(t0)=x0 та час виходу time. Типи: T - тип обчислень, EXCEPTION - тип винятків.
cauchy_region <class T = MDS_DEFAULT_TYPE, class EXCEPTION = MDS_DEFAULT_EXCEPTION> (const T& t0, int(*f) (const T&, const valarray<T>&))
            Початковий час t0 та функція виходу Region(). Типи: T - тип обчислень, EXCEPTION - тип винятків.
cauchy_region <class T = MDS_DEFAULT_TYPE, class EXCEPTION = MDS_DEFAULT_EXCEPTION> (const T& t0, const T& time)
            Початковий час t0 та час виходу time. Типи: T - тип обчислень, EXCEPTION - тип винятків.

 

Функції-члени класу
  int isRegion(const valarray<T>& x) const
          Перевірка належності області розширеного фазового вектору x (перша координата - час).
Повертає:
1 – аргумент належить області,
-1 – аргумент не належить області,
0 – аргумент на границі області.
  int isRegion(const T& t, const valarray<T>& x) const
          Перевірка належності області фазового вектору x у момент часу t.
Повертає:
1 – аргумент належить області,
-1 – аргумент не належить області,
0 – аргумент на границі області.
  T& GetStartTime(T& arg) const
          Записує у arg початковий час. Повертає зсилку на аргумент.
  T GetStartTime() const
          Повертає початковий час.
  T& GetFinalTime(T& arg) const
          Записує у arg фінальний час (якщо він заданий, інакше повертає 0). Повертає зсилку на аргумент.
  T GetFinalTime() const
          Повертає початковий час (якщо він заданий, інакше повертає 0).
  int isFuncFinalCondition() const
          Повертає 1, якщо задана функція виходу Region() або 0 в протилежному випадку.
  valarray <T>& GetCauchyCondition(valarray<T>& arg, bool isEnlargedPhase = false) const
          Записує у arg умову Коші. Якщо isEnlargedPhase = false, то буде записаний вектор x0, в протилежному випадку - розширений фазовий вектор (перша координата - час t0). Повертає зсилку на arg.
  T& GetCauchyCondition(T& arg_t, valarray<T>& arg_x) const
          Записує у arg_t початковий час t0, у arg_x умову Коші x0. Повертає зсилку на arg_t.
  T& GetCauchyCondition(T& arg_t) const
          Записує у arg_t початковий час t0. Повертає зсилку на arg_t.
  valarray <T> GetCauchyCondition(bool isEnlargedPhase = false) const
          Повертає умову Коші. Якщо isEnlargedPhase = false, то буде повернуто вектор x0, в протилежному випадку - розширений фазовий вектор (перша координата - час t0).
  size_t GetCauchyConditionSize() const
          Повертає розмірність вектора x0.

 

Опис

Для використання класу необхідно ініціалізувати змінну одним із конструкторів (ініціалізацію можна проводити прямо у аргументах функції, яка вимагає цей клас в якості вхідного параметру, як, наприклад, при інтегруванні). Отже перший аргумент конструктора може бути або умовою Коші (тобто точкою розширеного фазового простору, оформленою як valarray<T>): t0, x1(t0), x2(t0),..., xn(t0), або просто початковим часом t0, або парою (t0,x0). Кінцева умова може бути або кінцевим часом Т, або функцією (типу характеристичної), що повертає 1 – якщо її аргумент належить області,  -1 – не належить,  0 – знаходиться на границі області. Для будь-якого варіанту кінцевих умов функції

isRegion(const valarray<T>& x);
isRegion(const T& t, const valarray<T>& x);

повертатимуть 1 – якщо аргументи належать розглядуваній області,  -1 – не належать,  0 – знаходяться на границі. Неважко здогадатися, що при заданій функції виходу (замість фінального часу) isRegion() просто „переводить стрілки” на вашу функцію, інакше проводяться перевірки типу , . УВАГА: isRegion() використає вашу функцію виходу, якщо ви її задали, або фінальний час.

Наприклад

//задамо час від 0 до 10:
CauchyRegion mySimpleRegion(0., 10.);

 //задамо умову Коші для 2-вимірного вектора фазових координат та фінальний час 15:
valarray<double> v(2);
v[0] = 3.14;
v[1] = -10.0;
double t0 = 0.0;
CauchyRegion myCauchyRegion(t0, v, 15.0);
 

//добавимо функцію виходу:
int myCondition(const double& t, const valarray<double>& x)
{
    if (t<15
&& x[0] * x[0] + x[1] * x[1] < 0.1)
          return 1;
    return -1;
}

CauchyRegion mySuperPuperRegion (t0, v, myCondition);
 

В останньому прикладі було побудовано спеціальну функцію виходу. Функція-член isRegion() видаватиме 1 поки час не перевалить за 15, або ж квадрат норми фази – за 0.1.

Приклад використання МДС знаходиться у файлі 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
Всі права застережено.