関数内での望ましさの設定と最大化に関する支援をリクエストします。皆さん、こんにちは。ある装備品について、ユーザーが指定した目標値を達成しようとする関数を書こうとしています。引数として、達成したい目標メトリックの名前、達成したい値、装備品の名前、そして目標装備品の重量を指定します。
回答制限とマッチターゲットを使って満足度曲線を設定することで、これを実現したいと考えています。列を指定して関数の外側に独立したコードスニペットとして記述すると、コードが動作することをテストしました。しかし、これを関数でラップしようとしたところ、回答制限を設定する部分のコードが動作しません。どこが間違っているのか、どなたか教えていただけませんか?よろしくお願いします!
グラフ出力は以下の通りです。必要な応答指標、因子値、ロックは正常に機能していますが、望ましさ曲線は変化していません。

dt = currentdatatable();
// FindMatchingAgiSpeed is a function that finds the agitation speed in Brx_B that will
// match the hydrodynamic quantity requested as the input
FindMatchingAgiSpeed = Function( {dt, HydyMetricMixing, valueOfHydyMetric, Brx_Name_B, Brx_Volume_B},
// HydyMetricMixing is a string and can be either "P/V (W/m^3)" or "Top 10% EDR (W/kg)" or "Tip Speed (m/s)" and so on
// valueOfHydyMetric is a float that is the value of the chosen HydyMetricMixing that we want to achieve in Brx_B
// Brx_Name_B is a string which is our target production bioreactor we want to find the agitation setpoint for
// Brx_Volume_B is the amount of liquid in the bioreactor
HydyMetricMixing_col = Column (dt, HydyMetricMixing);
// this part of the code works perfectly
profiler = dt << Profiler(
Y( HydyMetricMixing_col ),
Confidence Intervals( 1 ),
Desirability Functions( 1 ),
Term Value(
:"Bioreactor"n( Brx_Name_B, Lock( 1 ), Show( 1 ) ),
:"Volume (L)"n( Brx_Volume_B, Lock( 1 ), Show( 1 ) ),
:"Agitation (RPM)"n(50, Min(12), Max(263), Lock(0), Show(1))
),
);
// This part of the code does not work at all
profiler << Response Limits(
Eval( Parse( ":" || Char(HydyMetricMixing) ) ), // Convert string to symbol
{
Lower( valueOfHydyMetric*0.8, 0.0183 ),
Middle( valueOfHydyMetric, 1 ),
Upper( valueOfHydyMetric*1.2, 0.0183 ),
Goal( "Target" ), Importance( 1 )
}
);
// Maximize desirability
profiler << Maximize and Remember;<BR /><BR /> // "Agitation (RPM)" obtained after maximization is the result we want to return from this function
);
// call the function to find the optimized value
FindMatchingAgiSpeed(dt, "P/V (W/m^3)", 93.0, "SSB_10kL_ABEC", 9000);
自動化とスクリプトウィンドウズRe: 関数内での望ましさの設定と最大化に関するヘルプをリクエストします。プロファイラーとは別に、このようにレスポンス制限をどのように使用するのかは分かりません。ドキュメントが不足しており、選択された構文は私の意見では非常に不適切です。プロファイラーの式全体を構築し、それにレスポンス制限を含めることは可能です。他の方法としては、レスポンス制限の列プロパティを利用する方法がありますが、これらはプロファイラーを実行する前に設定する必要があると思います。プロファイラーに組み込む関数を見ると、問題なく動作するようです。この投稿では、 モデルを適合させ、望ましさを最大化し、ユーザーが選択できる列で結果を抽出するための基本的なJSLの考え方が示されています。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Tiretread.jmp");
lval = 150;
mval = 200;
uval = 300;
col = "Pred Formula ABRASION";
pf = Eval(Substitute(
Expr(dt << Profiler(
Y(_col_),
_colw_ << Response Limits(
{Lower(_lval_, 0.9819), Middle(_mval_, 0.5), Upper(_uval_, 0.066),
Goal(Maximize), Importance(1)}
)
)),
Expr(_col_), Name Expr(As Column(dt, col)),
Expr(_colw_), Parse(col),
Expr(_lval_), lval,
Expr(_mval_), mval,
Expr(_uval_), uval
));
EvalなしでSubstitute部分を実行するだけで、使用されている式を確認できます。

Re: 関数内での望ましさの設定と最大化に関するヘルプをリクエストします。こんにちは、Jarmoさん。
ご提案ありがとうございます。ご提案いただいたようにプロファイラーを書き直してみます。しかし、構文に関してまだ疑問があります。関数を書き直し、「レスポンス制限」を別のステップではなくプロファイル内で設定するようにしましたが、それでもうまくいきません。ただし、列変数名を置き換えて列名でハードコードすると動作します。何が間違っているのか教えていただけますか?
関数内で定義されたプロファイラー内で、これを実行すると、次のように動作します。
"P/V (W/m^3)"n << Response Limits(
{
Goal("Match Target"),
Importance( 1 ),
Lower(valueOfHydyMetric*0.8, 0.0183),
Middle(valueOfHydyMetric, 1),
Upper(valueOfHydyMetric*1.2, 0.0183)
}
),
しかし、これをやるとうまくいかない
Column (dt, HydyMetricMixing) << Response Limits(
{
Goal("Match Target"),
Importance( 1 ),
Lower(valueOfHydyMetric*0.8, 0.0183),
Middle(valueOfHydyMetric, 1),
Upper(valueOfHydyMetric*1.2, 0.0183)
}
),
I tried everything, parsing, eval, expr, etc. I just want the column name stored as a string to work with the Response Limits message. Here HydyMetricMixing is just a variable that stores the string "P/V (W/m^3)".
Re: 関数内での望ましさの設定と最大化に関するヘルプをリクエストします。応答の制限は実際には列ではなくJMP名に送られます。そのため、Column()/AsColumn()ではなくParse()を使用しています。なぜこのように実装されているのかは分かりません。
あなたの場合、列名には特別な構文 (""n) が必要なので、Parse() の代わりに As Name() を使用してみてください。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Tiretread.jmp");
Column(dt, "Pred Formula ABRASION") << Set Name("Pred Formula ABRASION/123-");
lval = 120;
mval = 150;
uval = 190;
col = "Pred Formula ABRASION/123-";
pf = Eval(Substitute(
Expr(dt << Profiler(
Y(_col_),
_colw_ << Response Limits(
{Lower(_lval_, 0.9819), Middle(_mval_, 0.5), Upper(_uval_, 0.066),
Goal(Maximize), Importance(1)}
)
)),
Expr(_col_), Name Expr(As Column(dt, col)),
Expr(_colw_), As Name(col),
Expr(_lval_), lval,
Expr(_mval_), mval,
Expr(_uval_), uval
));
pf << Desirability Functions(1);
構築している式を確認することをお勧めします。SubstituteとEvalExprを使用すると、強調表示された部分を実行するだけで非常に簡単です。

私もこれを使い始めるつもりです。これははるかに堅牢であり、おそらくこのような場合には正しい方法だからです。
Re: 関数内での望ましさの設定と最大化に関するヘルプをリクエストします。こんにちは、Jarmoさん
完璧に機能しました。Parse() を As Name() に変更するとすべてが修正され、変数に格納されている名前文字列が、応答制限を渡す必要がある列として正しく割り当てられるようになりました。
ご協力に改めて感謝いたします!