Richiedi aiuto per impostare e massimizzare la desiderabilità all'interno di una funzione.Salve a tutti, sto cercando di scrivere una funzione che tenti di raggiungere un valore target specificato dall'utente in un'apparecchiatura. Gli argomenti forniti sono il nome della metrica target da abbinare, il valore da abbinare, il nome dell'apparecchiatura e il peso dell'apparecchiatura target.
Spero di riuscirci impostando curve di desiderabilità utilizzando limiti di risposta e target di corrispondenza. Ho verificato che il codice funziona quando specifico la colonna e al di fuori della funzione come frammento di codice autonomo. Ora che sto cercando di racchiuderlo in una funzione, la parte specifica del codice che imposta i limiti di risposta non funziona. Qualcuno può aiutarmi a capire cosa sto sbagliando? Grazie!
L'output grafico che ottengo è il seguente. La metrica di risposta richiesta, i valori dei fattori e i blocchi funzionano perfettamente, ma la curva di desiderabilità non 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);
Automazione e scriptingFinestreOggetto: Richiesta di aiuto per l'impostazione e la massimizzazione della desiderabilità all'interno di una funzione.Non sono sicuro di come utilizzeresti i limiti di risposta in questo modo, separatamente da Profiler, perché la documentazione è carente e la sintassi scelta è, a mio parere, piuttosto scadente... So che puoi creare l'intera espressione di Profiler e includervi i limiti di risposta. Un'altra opzione sarebbe quella di utilizzare la proprietà di colonna dei limiti di risposta, ma credo che questi debbano essere impostati prima di eseguire Profiler. Analizzare la tua funzione, integrandola in Profiler, dovrebbe funzionare; questo post fornisce l'idea di base JSL per adattare il modello, massimizzare la desiderabilità ed estrarre i risultati con colonne selezionabili dall'utente.
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
));
È possibile controllare l'espressione utilizzata semplicemente eseguendo la parte Sostituisci senza Eval

Oggetto: Richiesta di aiuto per l'impostazione e la massimizzazione della desiderabilità all'interno di una funzione.Ciao Jarmo,
Grazie per il suggerimento. Riscriverò il profiler come hai suggerito. Tuttavia, c'è ancora qualcosa che mi dà fastidio riguardo alla sintassi. Ho riscritto la mia funzione per impostare i "Limiti di risposta" all'interno del profilo invece che in un passaggio separato. Non funziona ancora. Ma se sostituisco il nome della variabile di colonna e lo inserisco nel codice con il nome della colonna, funziona. Potresti dirmi cosa potrei sbagliare?
All'interno del profiler definito all'interno della funzione, quando faccio questo, funziona:
"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)
}
),
Ma quando lo faccio, non funziona
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)".
Oggetto: Richiesta di aiuto per l'impostazione e la massimizzazione della desiderabilità all'interno di una funzione.I limiti di risposta non vengono realmente inviati a una colonna, ma a un nome JMP. Ecco perché uso Parse() e non Column()/AsColumn(). Non ho idea del perché venga implementato in questo modo.
Nel tuo caso, poiché il nome della colonna richiede una sintassi speciale (""n), prova a usare As Name() invece di 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);
Ti suggerisco di controllare l'espressione che stai costruendo, con Substitute ed EvalExpr è abbastanza semplice eseguendo semplicemente la parte evidenziata

Inizierò anche a usarlo perché è molto più solido e molto probabilmente è il modo corretto di procedere con qualcosa del genere.
Oggetto: Richiesta di aiuto per l'impostazione e la massimizzazione della desiderabilità all'interno di una funzione.Ciao Jarmo,
Ha funzionato perfettamente! Modificando Parse() in As Name(), tutto è stato risolto e ora la stringa name memorizzata nella variabile viene assegnata correttamente come colonna a cui passare i limiti di risposta.
Grazie ancora per il tuo aiuto!