I am using Constrained Minimize() in JSL and would like to build both the funzione obiettivo and the vincolo impostato dinamicamente, based on which variables appear in the objective equation.
Nei casi più semplici, posso codificare tutto in modo rigido, ad esempio:
R_nom = 0.1;
L_nom = 0.5;
S_nom = 48.2;
B_nom = 0.05;
R_eq = 0.1;
L_eq = 0.5;
S_eq = 48.2;
B_eq = 0.05;
R_sd = :sd_R;
L_sd = :sd_L;
S_sd = :sd_S;
B_sd = :sd_B;
bias_const = 1.5;
R_bias = R_sd * bias_const;
L_bias = L_sd * bias_const;
S_bias = S_sd * bias_const;
B_bias = B_sd * bias_const;
minFun = Constrained Minimize(
(16.388 * Pi() * R_nom ^ 2 * L_nom - B_nom) * S_nom,
{R_nom( R_eq - R_Bias, R_eq + R_Bias ), L_nom( L_eq - L_Bias, L_eq + L_Bias ), S_nom( S_eq - S_Bias, S_eq + S_Bias ),
B_nom( B_eq - B_Bias, B_eq + B_Bias )},
<
<TOLERANCE></TOLERANCE>
<P>Tuttavia, l' <STRONG data-start="1086" data-end="1118">equazione potrebbe cambiare dinamicamente</STRONG> , ad esempio:</P> <CODE class=" language-jsl">R_nom^2 * L_nom // instead of 16.388 * Pi() * R_nom ^ 2 * L_nom - B_nom) * S_nom
In that case, I only want constraints for R_nom and L_nom, not for B_nom or S_nom.
Cosa voglio ottenere
-
Define the objective function as an expression (Expr()).
-
Determinare quali variabili di input vengono utilizzate nell'equazione (ho creato una funzione per questo
varsUsed = {"R_nom","L_nom"}; //when equation is R_nom^2 * L_nom
-
Crea automaticamente l'elenco dei vincoli solo per quelle variabili.
-
Pass the dynamically generated constraint list into Constrained Minimize().
Approccio attuale
Memorizzo i metadati dei parametri (variabile nominale, valore di equilibrio, bias) in un array associativo, ad esempio:
paramInfo = Associative Array();
paramInfo["R_nom"] = {R_nom, R_eq, R_bias};
paramInfo["L_nom"] = {L_nom, L_eq, L_bias};
paramInfo["S_nom"] = {S_nom, S_eq, S_bias};
paramInfo["B_nom"] = {B_nom, B_eq, B_bias};
Dove sono bloccato
I am having trouble costruire espressioni di vincolo valide in modo dinamico in JSL so that they are accepted by Constrained Minimize().
Molto probabilmente avrai bisogno di una valutazione dell'espressione con un po' di Name Expr mescolato. Questo potrebbe darti qualche idea
Names Default To Here(1);
params = Associative Array();
params["R_nom"] = {R_nom, R_eq, R_bias};
params["L_nom"] = {L_nom, L_eq, L_bias};
params["S_nom"] = {S_nom, S_eq, S_bias};
params["B_nom"] = {B_nom, B_eq, B_bias};
vars = {"R_nom","L_nom"};
l = {};
For Each({var}, vars,
e = Substitute(Expr(nom(eq - bias, eq + bias)),
Expr(nom), Name Expr(params[var][1]),
Expr(eq), Name Expr(params[var][2]),
Expr(bias), Name Expr(params[var][3]),
);
Insert Into(l, Name Expr(e));
);
minFun = EvalExpr(
Constrained Minimize(
(16.388 * Pi() * R_nom ^ 2 * L_nom - B_nom) * S_nom,
Expr(l),
<
<TOLERANCE></TOLERANCE>