I am using Constrained Minimize() in JSL and would like to build both the 목적 함수 and the 제약 조건이 동적으로 설정됩니다., based on which variables appear in the objective equation.
간단한 경우에는 모든 것을 하드코딩할 수 있습니다. 예를 들면 다음과 같습니다.
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>하지만 <STRONG data-start="1086" data-end="1118">방정식은 동적으로 변경될 수 있습니다</STRONG> . 예를 들면 다음과 같습니다.</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.
내가 이루고 싶은 것
-
Define the objective function as an expression (Expr()).
-
방정식에 사용되는 입력 변수를 결정합니다 (이를 위한 함수를 만들었습니다).
varsUsed = {"R_nom","L_nom"}; //when equation is R_nom^2 * L_nom
-
해당 변수에 대해서만 제약 조건 목록을 자동으로 생성합니다.
-
Pass the dynamically generated constraint list into Constrained Minimize().
현재 접근 방식
매개변수 메타데이터(명목 변수, 평형 값, 편향)는 연관 배열에 저장합니다. 예:
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};
제가 막힌 곳은 어디인가요?
I am having trouble 유효한 제약 조건 표현식을 동적으로 구성 in JSL so that they are accepted by Constrained Minimize().
아마도 이름 표현식이 혼합된 표현식 평가가 필요할 것입니다. 이것이 몇 가지 아이디어를 제공할 수 있습니다.
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>