Grundbeispiel M/M/1
- Grundaufbau:
- Modell mm1A
- wie gehabt, aber generische Grundbausteine
- Generator:
- viele Parameter in mehreren Tabs
- analog bei den meisten Blöcken
- Entity Generation
- Generation method: Time-based/Event-based
- Time source: Dialog/Signal port/MATLAB action
- exponentiell verteilte Zeiten über MATLAB action und
Variable dt
- lambda = 1;
dt = -(1/lambda)*log(rand());
- Entity type
- Grundtypen: Anonymous/Structured/Bus object
- Anonymous (≡ Message): enthält nur einfachen
Zahlenwert
- Structured: bekommt hier
Attribute
- Event actions: Generate, Exit
- Statistics: wie gehabt
- Server:
- exponentiell verteilte Zeiten wie beim Generator
- mu = 1.2;
dt = -(1/mu)*log(rand());
- für komplexere Verteilungen Statistic Toolbox nötig!
- Statistikdaten:
- sind vom Typ event-driven
- können in einfachem Osci direkt angezeigt werden
- werden von vielen Simulink-Blöckenautomatisch in
time-driven umgewandelt
- manchmal klappt das nicht, z.B. bei Anzeige in Viewer
- Trick 1: Block Gain=1 dahinter → time-driven
- Trick 2: verstecken in Block "E→T" (in eigener
Library)
- Ergebnis:
-
- Viewer
- Ergebnis unplausibel
- Queue zu kurz
- Server zu oft ausgelastet
- Ursache (Geheimwissen, steht nicht im Manual!)
- rand() in Action verwendet nicht
den Random-Standard-Stream
- jedes rand() hat seinen eigenen Stream, jeweils
mit gleicher Seed (wegen Übersetzung nach C++)
- → Generator und Server verwenden identische
Zufallszahlen!
- überprüfe mit fprintf in den beiden Actions!
- Verbessern:
- Modell mm1B
- Action im Generator
- seed = 1;
persistent isSeedSet;
if isempty(isSeedSet)
rng(seed);
isSeedSet = true;
end
lambda = 1;
dt = -(1/lambda)*log(rand());
- analog im Server mit anderer seed
- Ergebnis ok
- Was tun bei vielen Blöcken mit Zufallszahlen:
- brauchen verschiedene Seeds
- häufiger Trick: eine Seed vorgeben, andere Blöcke
addieren Konstanten
- bei vielen Blöcken unübersichtlich und
fehleranfällig
- bessere Lösung im Modell mm1C:
verwendet Matlabs globalen rand-Stream
- modell-globale Seed setzen per InitFcn()
- Coder anweisen, Matlabs rand-Funktion direkt zu
nehmen
- coder.extrinsic('rand');
lambda = 1;
dt = 1.0; % tell coder type of result
dt = -(1/lambda)*log(rand());
- ist langsamer
- braucht Info über Datentyp des Rückgabewerts
- sonst Standardtyp mxArray → Fehler
- alternative Möglichkeit
- globale Simulink-Funktion (s.u.) als rand-Server
verwenden