Solicitar ayuda para establecer y maximizar la deseabilidad dentro de una función.Hola a todos, estoy intentando escribir una función que intenta alcanzar un valor objetivo especificado por el usuario en un equipo. Los argumentos proporcionados son el nombre de la métrica objetivo que debe coincidir, el valor que debe coincidir, el nombre del equipo y su peso.
Espero lograrlo estableciendo curvas de deseabilidad usando límites de respuesta y el objetivo de coincidencia. Comprobé que el código funciona al especificar la columna y fuera de la función como un fragmento de código independiente. Ahora que intento integrar esto en una función, la parte específica del código que establece los límites de respuesta no funciona. ¿Alguien podría ayudarme a identificar el error? ¡Gracias!
El resultado gráfico que obtengo es el siguiente. La métrica de respuesta requerida, los valores de los factores y los bloqueos funcionan correctamente, pero la curva de deseabilidad no cambia.

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);
Automatización y scriptingVentanasRe: Solicitar ayuda para configurar y maximizar la deseabilidad dentro de una función.No estoy seguro de cómo usarías los límites de respuesta de esta manera, independientemente de Profiler, ya que falta documentación y la sintaxis elegida es, en mi opinión, bastante deficiente. Sé que puedes crear la expresión completa de Profiler e incluir los límites de respuesta. Otra opción sería utilizar la propiedad de columna de límite de respuesta, pero creo que debe configurarse antes de ejecutar Profiler. Al analizar tu función, integrarla en Profiler debería funcionar correctamente; esta publicación proporciona la idea básica de JSL para ajustar el modelo, maximizar la conveniencia y extraer resultados con columnas seleccionables por el usuario.
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
));
Puede comprobar la expresión que se está utilizando simplemente ejecutando la parte Sustituir sin Eval

Re: Solicitar ayuda para configurar y maximizar la deseabilidad dentro de una función.Hola Jarmo,
Gracias por tu sugerencia. Reescribiré el generador de perfiles como me sugeriste. Sin embargo, todavía tengo problemas con la sintaxis. Reescribí mi función para establecer "Límites de respuesta" dentro del perfil en lugar de un paso aparte. Sigue sin funcionar. Pero si reemplazo el nombre de la variable de columna y lo incluyo en el código, funciona. ¿Podrías explicarme qué estoy haciendo mal?
Dentro del perfilador definido dentro de la función, cuando hago esto, funciona:
"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)
}
),
Pero cuando hago esto no funciona
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: Solicitar ayuda para configurar y maximizar la deseabilidad dentro de una función.Los límites de respuesta no se envían a una columna, sino a un nombre JMP. Por eso uso Parse() y no Column()/AsColumn(). No tengo ni idea de por qué se implementa así.
En su caso, debido a que el nombre de su columna requiere una sintaxis especial (""n), intente utilizar As Name() en lugar de Parse().
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);
Te sugiero que verifiques la expresión que estás construyendo, con Substitute y EvalExpr es bastante fácil simplemente ejecutando esa parte resaltada

También comenzaré a usar eso, ya que es mucho más sólido y probablemente la forma correcta de proceder con algo como esto.
Re: Solicitar ayuda para configurar y maximizar la deseabilidad dentro de una función.Hola Jarmo,
¡Funcionó a la perfección! Cambiar Parse() a As Name() lo solucionó todo y ahora asigna correctamente la cadena de nombre almacenada en la variable como la columna a la que se deben pasar los límites de respuesta.
¡Gracias de nuevo por tu ayuda!