Définir par programme les distributions du simulateur du profileurJ'essaie de créer un profileur avec les options du simulateur activées et certaines des entrées ont des distributions aléatoires. Le type de distribution et les paramètres de cette distribution sont enregistrés en tant que variables de table à interroger si nécessaire. Mais le JSL à l'intérieur de la fonction Profiler () ne semble pas reconnaître les instructions if.
Par exemple, ce code fonctionne bien
Profiler(
Y( :a, :b ),
Profiler(
1,
Simulator(
1,
Factors(
c << Fixed( 3.5 ),
d << Random( Normal( :dist_p1, :dist_p2 ) )
),
Resimulate
)
)
)mais ce code ne charge pas les informations de distribution pour "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
)
)
)
Re: Définir par programme les distributions du simulateur du profileurJ'ai brièvement réfléchi à cette approche, mais dans mon vrai fichier, il dupliquerait plus de 100 lignes de code 9 fois (3 variables aléatoires, 3 types de distribution). Cela devient ingérable très rapidement.
EDIT: Ceci est dû à David_Burnham. Toujours apprendre à utiliser ces forums ...
Re: Définir par programme les distributions du simulateur du profileurOk, si je retourne à la fonction de plus haut niveau (Profiler dans ce cas) et que je l’enveloppe avec Eval, Substitute et Expr, je peux obtenir le comportement que je veux. C'était déroutant pour moi parce que je pensais que le si devait être évalué en premier, puis utilisé comme argument de la fonction dans laquelle il se trouvait, mais je peux maintenant comprendre pourquoi cela ne fonctionne pas.
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 ))" )
)
)
)Re: Définir par programme les distributions du simulateur du profileurProfiler est une fonction. Chaque élément de la fonction devrait contenir les arguments de la fonction nécessaires à son exécution. Vous ne pouvez donc pas y insérer du code JSL arbitraire. Vous devez déplacer la logique conditionnelle à l'extérieur:
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
)
)
)
);