Je soubor elementárních částí, které mají mezi sebou určíté vazby.
Napodobenina systému jiným systémem
Vyrváření modelů systémů
Získávání nových znalostí o systémz experimentováním s jeho modelech
- Vytvoření abstraktního modelu
- Vytvoření simulačního modelu
- Verifikace a validace
- Simulace
- Analýza a interpretace výsledků
Systém
kde:
\[U = \{u_1, u_2, …, u_N\}\]
\[R = \bigcupNi,j=1 Rij\]
\[Rij \subseteq Y_i × X_j\]
Rozlišujeme tři typy času:
- Reálný času Probíháý skutečný děj v reálném systému
- Modelový čas Časová osa modelu, nemusí být synchronní s reálným časem
- Strojový čas Čas spotřebovaný na výpočet programu
Množina všech časových okamžiků, ve kterých jsou definovány hodnoty vstupních, stavových a výstupních proměnných prvku systému
Může být diskrétní nebo spojitá[fn:continuous]
Každému časovému průběhu vstupu přiřazuje časový průběh výstupu. Lze definovat jako zobrazení.
Systémy považujeme za systémy se stejným chováním, vyvolají-li stejné podněty u obou systémů stejné reakce.
Izomorfní systémy jsou systémy, kde prvky systémů navzájem můžeme přiřadit 1:1.
Homomorfní systémy jsou systémy, kde prvky systémů navzájem můžeme přiřadit N:1, ale ne naopak.
Okolí systému zahrnuje vše, co má vliv na chování systému, ale není jeho součástí.
Systémy můžeme rozdělit na uzavřené (nekomunikují s okolím nebo jej zanedbábají) a otevřene (mají definované vstupy a výstupy).
Prvky se spojitým chováním vs prvky s diskrétním chováním
Prvky s deterministickým chováním vs prvky s nedeterministickým chováním
Typ systému závisí na typu jeho prvků
Spojité, Diskrétní, Kombinované
Deterministické, nedeterministické
Cílem simulace je získat nové informace o chování systému v závislosti na vstupních veličinách a na hodnotách parametrů.
Opakovaně vyhodnocujeme model, tak dlouho, dokud nezískáme dostatek informací o chování systému nebo dokud nenalezneme takové hodnoty parametrů, pro něž má systém žádané chování.
Spojitá, diskrétní, kombinovaná. Kvalitativní, kvantitativní.
Na počítači, real-time, paralelní a distribuovaná
Měla by předcházet simulaci. Ověťujeme, zda simulační model odpovídá 1:1 (izomorfně) abstraktnímu modelu.
Jedná se o jeden z nejobtížnějších problémů modelování. Vyžaduje neustálou konfrontaci informací a modelovaném systému a dat ze simulovaného systému.
Nelze absolutně dokázat přesnost modelu. Pokud chování modelu neodpovídá předpokládanému chování systému, musíme model modifikovat.
Nepostihuje reálný svět v celé komplikovanosti. Zajímá se jen o ohraničené, vhodně zvolené části. Identifikuje vhodné sloky systému.
Pro sestavení abstraktního modelu potřebujeme studovat systém pro určitá kritéria a závislosti, predikovat chování systému za určirých podmínek, analyzovat faktory, které jsou pro činnost systému nejvýznamnější a nalézt takové kombinace parametrů, které vedou k nejlepší odezvě systému.
Jedná se o abstraktní model zapsaný formou programu v nějakém programovacím jazyce.
Jejich komponenty zatím nebyly přesně popsány. Používají se v počáteční fázi modelování pro ujasnění souvislostí a komunikaci v týmu.
Má formu textu nebo obrázků.
Popisuje přechody mezi stavy systému.
Je definován stavy a událostmi, které způsobí přechod z jednoho stavu do druhého.
Je vhodný především pro diskrétní modely.
Například konečné automaty, petriho sítě.
Grafy zobrazující funkce a proměnné. Uzel grafu je funkce nebo proměnná.
Například systémy hromadné obsluhy, bloková schemata, grafy signálových toků.
Používají se algebraické, diferenciální, diferenční rovnice.
Mívají podobu neorientovaných grafů.
Například elektrická schemata, systémy dravec kořist, kyvadla, logistické systémy, chaos.
Rozdělují systém na prostorově menší ohraničené podsystémy.
Například parciální diferenciální rovnice difuze nebo proudění, celulární automaty, mechanické modely těles.
Složeny z různých typů modelů, obvykle heterogenních.
Například kombinované modely, fuzzy modely, propojené simulační systémy.
Mohou používat klasické programovací jazyky samy o sobě, nebo s využitím knihoven. Existují specializované simulační jazyky (Simula67, Modellica…)
Poskytují prostředky usnadňující efektivní popis struktury a chování modelů a také popis simulačních experimentů.
Výhodou je jednodušší popis modelu a možnost automatické kontroly popisu modelu.
Nevýhodami jsou náklady na vytvoření překladače, údržbu, výuku…
Celkově nejsou příliš používány.
Náhodná proměnná je taková veličina, která jako výsledek pokusů může nabýt nějakou hodnotu, přičemž předem nevíme jakou.
Rozlišujeme diskrétní a spojité
Náhodné veličiny můžeme zadat distribuční funkcí nebo rozdělením pravděpodobnosti.
Určuje vztah mezi možnými hodnotami náhodné veličiny
Obecně platí vztah: \begin{equation} ∑i=1^∞ p_i = 1 \end{equation}
Lze definovat například tabulkou pravděpodobnosti pro všechny možné hodnoty náhodné proměnné, suma všech pravděpodobností musí být 1.
Distribuční funkce náhodné veličiny
Kde $P(X \leq x) je pravděpodobnost toho, že náhodná veličina X nabude hodnoty menší nebo rovnu zvolenému x.
Platí vztah: \begin{equation} F(x) = ∑x_i \leq x p_i \end{equation}
Kraf distribuční funkce pro diskrétní náhodné proměnné je po částech konstantní.
\begin{equation} F(x) = P(X \leq x) = ∫-∞^x f(x) dx \end{equation}
Distribuční fuknce je neklasající. Roste od 0 do ∞
Pravděpodobnost hodnoty
- Vždy větší než 0
- Vyjádřena jako derivace distribuční funkce
- Integrál funkce hustoty pravděpodobnosti je vždy 1
- Hodnota pravděpodobnosti pro
$x$ mezi$a$ a$b$ je dána jako intergrál hustota pravděpodobnosti mezi$a$ a$b$
Diskrétní rozložení udávající počet nějakých událostí za jednotku času. Vzorec:
\begin{equation}
p_i = \frac{λ^i}{i!} e-λ, λ > 0, i ∈ {0, 1, 2,…}
\end{equation}
Kde
Označujeme
Hodnota distribuční funkce lineárně roste mezi body
Používá se pro dobu mezi dvěma událostmí.
Diskrétní systém můžeme popsat:
- Programem v programovacím jazyce
- Petriho sítí
- Automaty nebo sítěmi automatů
- Procesními algebrami
- …
Proces je posloupnost událostí. Pokud jsou procesy prováděny současně, nazýváme je paralelní. Pokud paralelní procesy provádíme na jednoprocesorovém počítači, jedná se o kvaziparalelní procesy.
V modelovaných systémech často existuje mnoho paralelně probíhajících a vzájemně komunikujících procesů.
Pro zajištění paralelismu je třeba popsat jednotlivé procesy sekvencí kroků (napsat program). Dále je nutné popsat komunikace procesů – zprávy. Rovněž je nutné vyřešit synchronizace při používání sdílených prostředků.
Definice Petriho sítě:
\begin{equation} Σ = (P, T, F, W, C, M_0) \end{equation}
Kde:
-
$P$ je množina míst (stavů) -
$T$ je množina přechodů,$P ∩ T = ∅$ - Incidenční relace
$F \subseteq (P × T) ∪ (T × P)$ - Váhová funkce
$W : F → \{1, 2, …\}$ - Kapacity míst
$C : P → N$ - Počáteční značení
$M_0 : P → N$
Petriho sítě obvykle zadáváme formou grafu, kde:
- Místa = Kružnice
- Přechody = Obdélníky
- Incidenční relace = Šipky
- Váhová funkce = ohodnocení hran
SHO (Queueing systems) jsou systémy obsahující zařízení s frontami, která poskytují obsluhu transakcím.
Typický systém hromadné obsluhy obsahuje:
- Transakce (procesy) a popis jejich příchodů
- Obslužné linky a popis jejich obsluhy
- Fronty různých typů, ve kterých transakce čekají
Při simulaci sledujeme informace o čase stráveném v systému pro konkrétní transakci, doby čekání ve frontách, vytížení obslužných linek. Cílem je odhalit zdržení, optimalizovat výkon …
Obvykle se jedná o proces příchodů do systému. Zadáváme buď střední dobu mezi příchody (exponenciální rozdělení) nebo počet příchodů za jednotku času (Poissonovo rozdělení).
Vytvoří se, když požadavek chce být obsloužen již obsazeným zařízením. Pro fronty jsou typické:
- Způsob řazení požadavků (FIFO, LIFO, …)
- Způsob výběru požadavků z fronty
- Největší možná délka fronty
Definujeme pojmy:
- Nulová fronta - Požadavek nesmí vstoupit do fronty, jedná se o systém se ztrátami
- Konečná fronta - Omezuje kapacitu fronty
- Fronta s netrpělivými požadavky - Netrpělivý požadavek opouští systém, dojde-li k timeoutu.
U jedné obslužné linky může být více front s různými prioritami, prioritních úrovní může být více. Přicházející požadavky nejsou rovnocenné.
Při příchodu požadavku s vyšší prioritou se stane jedna ze 4 věcí:
- Započatá obsluha se ukončí
- Obsluha se přeruší a začne obsluha požadavku s vyšší prioritou. Požadavek, jehož obsluha je přerušena buď opouští systém neobsloužen nebo se znovu vrací do fronty a je obsloužen později.
- Jsou-li všechny linky obsazeny a u každé je fronta, požadavek se sám rozhodne, do které se zařadí.
- Vytvářejí-li požadavky jednu společnou frontu, požadavek vstupuje do té linky, která se nejdříve uvolní.
Vzniká spojením několika obslužných linek. Může být:
- Otevřená – Výměna požadavků mezi sítí a okolím
- Uzavřená – Nedochází k výměně požadavků s okolím
- Smíšená – Pro některé typy požadavků je otevřená, pro jiné uzavřená
Statické vlastnosi obslužné sítě jsou definovány počtem a charakteristikou obslužných linek a topologií obslužné sítě.
Dynamické vlastnosti jsou definovány charakteristikami procesů příchodů, obsluhy, přechodu mezi linkami a strategií obsluhy požadavků v obslužných linkách.
Standard stučného a přehledného vyjádření typu SHO používá tři hlavní hlediska:
- X - Typ procesu popisujícího příchod požadavků k obsluze
- Y - Zákon rozložení délky obsluhy
- c - Počet dostupných obslužných linek.
Například systém M/M/1 značí Poissonovo rozložení příchodu požadavků, exponenciální dobu obsluhy a 1 obslužnou linku.
Popisujeme procesy v systému, stav obslužných linek a front a průběh obsluhy transakcí v zařízeních.
Podle kapacity linek rozlišujeme:
- Zařízení – kapacita 1
- Sklady – kapacita > 1
Modelujeme-li více zařízení stejného typu, pak každé zařízení má vlastní frontu, nebo k zařízením vede jedna fronta.
V knihovně simlib definujeme následující prostředky pro diskrétní modelování:
Process
– Modelování procesůEvent
– Modelování událostíFacility
– Obslužná linka s výlučným přístupemStore
– Obslužná linka s kapacitouQueue
– Fronta- Statistiky
Při modelování je ve funkci main potřeba zavolat funkci Init
,
která inicializuje simulátora a nastaví počáteční a koncový modelový čas.
Pro zahájení simulace se využívá funkce Run
.
Modelový čas programu reprezenutjeme globální proměnnou double Time
,
která je ovládána výhradně jádrem simulátoru a nelze do ní zapisovat.
SIMLIB poskytuje generátory pseudonáhodných čísel:
double Random()
– Rovnoměrné rozdělení mezi 0, 1double Uniform(double L, double H)
– Rovnoměrné rozdělení mezi L a Hdouble Exponential(double E)
– Exponenciální rozdělení se středem Edouble Normal(double M, double S)
– Normální rozložení se středem M a rozptylem S.
Použití událostí je provedeno následovně:
class Udalost : public Event {
void Behavior() {
// Příkazy události
Activate(Time + e); // Periodicky aktivovat po čase e
}
}
(new Udalost)->Activate(); // Naplánuje na čas Time (okamžitě)
(new Udalost)->Activate(t); // Naplánuje na čas Time + t
Generování transakcí se provádí vytvořením události generátoru, která ve svém těle aktivuje nové procesy. Například takto:
class Generator : public Event {
void Behavior() {
(new Proc)->Activate(); // Vytvoří a aktivuje nový proces
Activate(Time+Exponential(2)); // Znovu se aktivuje za čas udaný exponenciálním rozložením
}
}
Procesy jsou odvozeny za abstraktní třídy Process:
class Transakce : public Process {
public:
Transakce (parametry) { // Konstruktor
// Inicializace
}
void Behavior() {
// Popis chování programu
}
}
Po aktivaci procesu se volá metoda Behavior. Provádění je přerušeno při čekání ve frontě (funkce Seize, Enter) nebo při explicitním volání funkce Wait(dt), kde dt je doba čekání.
Kalendář je uspořádaná datová struktura uchovávající aktivační záznamy budoucích událostí. Každá naplánovaná budoucí událost má v kalendáři záznam obsahující aktivační čas, prioritu a samotnou událost. Kalendář umožňuje výběr prvního záznamu s nejmenším aktivačním časem a vkládání/rušení aktivačních záznamů.
Pseudokód:
// Inicializace času, kalendáře, modelu
while ( !empty(kalendar) ) { // Dokud je kalendář neprázdný
item_t item = kalendar.pop(); // Vybere první prvek kalendáře
if ( item.aktivacni_cas > T_END ) { // Prvek by se měl aktivovat po konci simulace
End(); // Ukončení
}
SetTime(item.aktivacni_cas); // Nastaví čas na aktivační čas události
Execute(item); // Provede popis chování události.
}
Spojíté systémy jsou popsány:
- Soustavami obyčejných diferenciálních rovnic
- Soustavami algebraických rovnic
- Algebraicko-diferenciálními rovnicemi
- Blokovými schematy
- Parciálními diferenciálními rovnicemi
- Grafy signálových toků
- Elektrickými schematy
- …
Soustavy diferenciálních rovnic mogou být popsány maticově:
\begin{align*}
\frac{d}{dt}\vec{w}(t) &= A(t)\vec{w}(t) + B(t)\vec{x}(t)
\vec{y}(t) &= C(t)\vec{w}(t) + D(t)\vec{x}(t)
\end{align*}
kde
Koeficienty mohou být nezávislé na čase (stacionární systémy), časové proměnné, konstanty (lineární systémy), nelineární funkce.
Rovnice vyššího řádu musíme převést na soustavu rovnic prvního řádu, pro které máme vhodné numerické metody.
- Osamostatníme nejvyšší řád derivace
- Zapojíme všechny integrátory za sebe a ke vstupu prvního připojíme pravou stranu
Podmínka: nesmí být derivace vstupů
Příklad
\begin{align*}
y” - 2y’ + y &= x
y” &= 2y’ - y’ + x \
y’ &= ∫ y” \
y &= ∫ y’
\end{align*}
Metoda snižování řádu derivace má typický tvar plokového schématu.
Je nutné dát pozor na počáteční podmínky.
Vhodná pro rovnice s derivacemi vstupů.
- Osamostatníme nejvyšší řád derivace
- Postupně integrujeme rovnice a zavádíme nové stavové podmínky
- Vypořítáváme nové počáteční podmínky
Příklad
\begin{align*}
p^2y &= p^2x + p(3x-2y) + (2x-y)
py &= px + (3x-2y) + \frac{1}{p}(2x-y) \text{, proměnná
\end{align*}
Potřebujeme metody pro řešení obyčejných diferenciálních rovnic prvního řádu a řešení algebraických rovnic (hledání kořenů, řešená rychlých smyček)
Hledáme řešení rovnice:
\begin{equation} y’ = f(t,y) \end{equation}
které má tvar:
\begin{equation} y(T) = y_0 + ∫_0^T f(t,y)dt \end{equation}
Na počítači je řešení aproximováno v bodech
Definujeme integrační krok $h_i = ti+1 - t_i$
Rozlišujeme metody jednokrokové (vycházejí jen za aktuálního stavu) a vícekrokové (používají historii stavů a vstupů).
Dále dělíme metody na explicitní (výsledek získán dosazením do vzorce) a implicitní (vyžaduje řešení algebraických rovnic v každém kroku).
\begin{align*}
k_1 &= hf(t,y(t))
k_2 &= hf(t + \frac{h}{2}, y(t) + \frac{k_1}{2}) \
y(t+h) &= y(t) + k_2
\end{align*}
#define SIZE 2
// Popis spojitého systému
// Vstupy: t = začátek kroku
// y = stavový vektor (výstupy integrátoru)
// Výstup: yin = vektor derivací (vstupy integrátoru)
void f(double t, double *y, double *yin);
// Krok metody Runge-Kutta 2. řádu
// Vstupy : t počáteční čas
// h délka kroku
// y stavový vektor
// Výstup : y nový stavový vektor
void RK2step(double t, double h, double *y) {
double yin[SIZE]; // Vstup integrátoru
double ystart[SIZE]; // Počáteční stav
double k1[SIZE];
double k2[SIZE];
int i;
for (i = 0; i < SIZE; i++) {
ystart[i] = y[i];
}
f(t, y, yin); // yin = f(t, y(t))
for (i = 0; i < SIZE; i++) {
k1[i] = h * yin[i]; // k1 = h * f(t, y(t))
y[i] = ystart[i] + k1[i] / 2; // y(t) + k1/2
}
f(t + h / 2, y, yin); // yin = f(t+h/2, y(t)+k1/2)
for (i = 0; i < SIZE; i++) {
k2[i] = h * yin[i]; // k2 = h * f(ft+h/2, y(t)+k1/2)
// Result :
y[i] = ystart[i] + k2[i];
}
}
int main(void) {
double y[SIZE] = {0,1};
double stepsize = 0.1;
double t = 0;
while (t < 20) {
RK2step(t, stepsize, y);
t += stepsize;
}
}
\begin{align*}
k_1 &= hf(t, y(t))
k_2 &= hf(t + \frac{h}{2}, y(t) + \frac{k_1}{2}) \
k_3 &= hf(t + \frac{h}{2}, y(t) + \frac{k_2}{2}) \
k_4 &= hf(t + h, y(t) + k_3) \
y(t+h) &= y(t) + \frac{k_1}{6} + \frac{k_2}{3} + \frac{k_3}{3} + \frac{k_4}{6}
\end{align*}
- Lokální – zaokrouhlovací (round-off) nebo chyba aproximace (truncation)
- Akumulovaná
Stabilita numerického řešení, vliv velikosti integračního kroku na stabilitu. Některé metody mají malou oblast stability.
Tuhé systémy mají problém velmi rozdílných časových konstant. Například:
\begin{equation} y” + 101y’ + 100y = 0 \end{equation}
Pro tuhé systémy se používájí speciální integrační metody.
Nelze použít zkrácení kroku, vede k akumulaci chyb a malé efektivitě výpočtu.
Obvykle vyhovuje některá varianta metody Runge-Kutta 4. řádu. Nespojitosti ve funkci popisující systém snižují efektivitu vícekrokových metod. Pro ověření správosti je třeba vyzkoušet různé integrační metody a různé velikosti kroku. Existuje horní limit velikosti kroku.
Cyklus v grafu závislosti funkčních bloků. Dá se řešit speciálním blokem, který (například iteračně řeší algebraické rovnice) nebo přepracováním na model bez smyček (například vložení integrátoru).
SIMLIB definuje automatickou konstrukci výrazových stromu pmocí třídy
Expression
.
Constant
Parameter
Variable
Function
,Sin
,Exp
…Integrator
Sampler
SetStep(minstep, maxstep
SetAccuracy(abs, rel)
SetMethod
Spojuje diskrétní a spojitou simulaci. Řeší problém kombinace událostí a numerické integrace. Detekuje změny stavových podmínek a na jejich základě způsobuje stavovou událost. Musí provádět zkracování kroku, aby došlo k dokročení na stavovou událost.
Stavovou událost nelze naplánovat, stane se po dosažení zadané hodnoty spojité veličiny. Může nastat problém detekce stavové události na základě nepřesnosti výpočtu nebo při použití příliš dlouhého kroku (překročení).
// Inicializace stavu a podmínek
// ...
while (Time < t_end) {
state.save(); // Uložení stavu
time.save(); // Uložení času
IntegrateStep(); // Krok numerické integrace
time += t; // Posun času
cond.check(); // Vyhodnocení podmínek
if ( cond.changed() ) {
if (step <= min_step) {
cond.confirm(); // Potvrzení změn podmínek
event(); // Stavová událost
step = step_standard; // Nastavení velikosti kroku na běžnou velikosti
}
else {
state.restore(); // Obnovení stavu
time.restore(); // Obnovení času
step = step / 2; // Zkrácení kroku
if ( step < min_step ) {
step = min_step; // Dokročení
}
}
}
}
Tento pseudokód patří do algoritmu next-event místo příkazu Time =
next_event_time
.
Pro vyjádření stavových podmínek se používají speciální abstraktní třídy:
Condition
– Detekuje jakoukoli změnuConditionUp
– Detekuje změnu z false na trueConditionDown
– Detekuje změnu z true na false
Odvozené třídy definují metodu void Action()
s popisem stavové události.
Dle úrovně popisu můžeme dělit:
- Elektrické – Tranzistory, rezistory, kondenzátory
- Logické – Hradla, klopné obvody
- Meziregistrové přenosy – Čítače, řadiče, ALU
- Systémové – Procesory, paměti, periferie
Modely signálů se dělí podle hodnot, kterých může signál nabývat. Nejčastěji se používají dvouhodnotové, třáhodnotové, pětihodnotové a devítihodnotové (VHDL std_logic).
V číslicových systémech modelujeme zpoždění. Zpoždění může být nulové, jednotkové, přiřaditelné nebo přesné.
Simulační algoritmus je řízen událostmi. Může nastat problém velkého množství událostí v kalendáři. Řešením je selektivní sledování pomocí dvoufázového algoritmu, který vyhodnocuje jen prvky, které jsou ovlivněny změnou na vstupu.
Dokud jsou v kalendáři události, vybírej včechny plánované události na čas T. Aktualizuj hodnoty signálu, přidej všechny prvky připojené k signálu do množiny M. Následně pro všechny prvky v množině M vyhodnoť a pokud dojde ke změně jeho výstupu, naplánuj novou událost.
Celulární automat je typicky diskrétní systém, obsahující následující prvky:
- Buňky (cell) – Základní element, který může být v jednom z konečného množství stavů.
- Pole buněk (lattice) – N-rozměrné pole, které může být nekonečné.
- Okolí (neighbourhood) – Liší se počtem a pozicí okolních buněk, se kterými spolupracuje.
- Pravidla (rules) – Funkce stavu buňky a jejího okolí definující nový stav buňky v čase.
Mezi základní typy okolí patří Von Neumannovo 4-okolí, Mooreovo 8-okolí a Margolovo okolí.
Celulární automat s konečným polem buněk musí definovat okrajové podmínky. Mezi typy okrajových podmínek patří periodické (na okraji je hodnota buňky na opačném okraji), pevné (na okraji je pevně zvolená hodnota), adiabatické (na okraji je hodnota vedlejší buňky) a reflektivní (na okraji je hodnota předposlední buňky).
Celulární automaty se mohou implementovat několika způsoby:
- Přímá implementace – Každá buňka uložena zvlášť v poli
- Implementace vyhledávací tabulkou – Tabulka obsahuje jen nenulové buňky
- SIMD styl implementace – Více buněk v jedné proměnné, použití bitových operací
- Hash life implementece – Cachované, velmi optimalizované
Konfigurací CA rozumíme stav všech buněk. Stav se vyvíjí v čase a prostoru podle zadaných pravidel. Čas i prostor jsou diskretizovány. Počet stavů buňky je konečný. Buňky jsou identické. Následující stav buňky závisí pouze na aktuálním stavu.
- Po konečném počtu kroků dosáhnou ustáleného stavu
- Dosáhnou periodického opakování nebo zůstanou stabilní
- Chaotické chování, výsledné posloupnosti konfigurací tvoří fraktální útvary
- Kombinace běžného a chaotického chování. Nejsou reverzibilní
[fn:continuous] Na číslicovém počítači se vždy diskretizuje