Programmgesteuertes Festlegen von Profiler-Simulator-VerteilungenIch versuche, einen Profiler mit aktivierten Simulatoroptionen zu erstellen, und einige der Eingaben haben zufällige Verteilungen. Die Art der Verteilung und die Parameter dieser Verteilung werden als Tabellenvariablen gespeichert, die bei Bedarf abgefragt werden müssen. Die JSL in der Profiler () - Funktion scheint jedoch keine if -Anweisungen zu erkennen.
Dieser Code funktioniert beispielsweise einwandfrei
Profiler(
Y( :a, :b ),
Profiler(
1,
Simulator(
1,
Factors(
c << Fixed( 3.5 ),
d << Random( Normal( :dist_p1, :dist_p2 ) )
),
Resimulate
)
)
)aber dieser Code lädt nicht die Distributionsinformationen für "d"
Profiler(
Y( :a, :b ),
Profiler(
1,
Simulator(
1,
Factors(
c << Fixed( 3.5 ),
if(
dist_type == "Normal", d << Random( Normal( :dist_p1, :dist_p2 ) ),
dist_type == "Weibull", d << Random( Weibull( :dist_p1, :dist_p2 ) )
)
),
Resimulate
)
)
)
Betreff: Programmgesteuertes Festlegen von Profiler-Simulator-VerteilungenIch habe kurz über diesen Ansatz nachgedacht, aber in meiner realen Datei würden mehr als 100 Codezeilen neunmal dupliziert (3 Zufallsvariablen, 3 Verteilungstypen). Es wird sehr schnell unhandlich.
EDIT: Dies ist in Relply zu David_Burnham. Ich lerne noch, wie man diese Foren benutzt ...
Betreff: Programmgesteuertes Festlegen von Profiler-Simulator-VerteilungenOk, wenn ich zur höchsten Funktionsebene (in diesem Fall zum Profiler) zurückkehre und sie mit Eval, Substitute und Expr abschließe, kann ich das gewünschte Verhalten erzielen. Es war verwirrend für mich, weil ich dachte, dass das if zuerst ausgewertet und dann als Argument der Funktion verwendet werden sollte, in der es sich befand, aber ich kann jetzt verstehen, warum das nicht funktioniert.
Eval(
Substitute(
Expr(
Profiler(
Y( :a, :b ),
Simulator(
Factors(
c << Fixed( 3.5 ),
d_
),
Resimulate
)
)
),
Expr( _d_ ),
if (:dist_type == "Normal", Parse( "d << Random( Normal( :dist_p1, :dist_p2 ))" ),
:dist_type == "Weibull", Parse( "d << Random( Weibull( :dist_p2, :dist_p1 ))" )
)
)
)Betreff: Programmgesteuertes Festlegen von Profiler-Simulator-VerteilungenProfiler ist eine Funktion. Alles in der Funktion sollte Funktionsargumente enthalten, die für die Ausführung der Funktion erforderlich sind. Sie können also nicht einfach beliebigen JSL-Code hineinstecken. Sie müssen die bedingte Logik nach außen verschieben:
type = "Normal";
p1 = 3.0;
p2 = 0.5;
If (type == "Normal",
Profiler(
Y( :a, :b ),
Profiler(
1,
Simulator(
1,
Factors(
c << Fixed( 3.5 ),
d << Random( Normal( p1, p2 ) ),
),
Resimulate
)
)
)
);