Demandez de l’aide pour définir et maximiser la désirabilité au sein d’une fonction.Bonjour à tous, j'essaie d'écrire une fonction qui tente d'atteindre une valeur cible spécifiée par l'utilisateur pour un équipement. Les arguments fournis sont le nom de la métrique cible à atteindre, la valeur correspondante, le nom de l'équipement et son poids.
J'espère y parvenir en définissant des courbes de désirabilité à l'aide de limites de réponse et d'une cible de correspondance. J'ai testé le fonctionnement du code en spécifiant la colonne et en dehors de la fonction comme un extrait de code autonome. Maintenant que j'essaie d'encapsuler cela dans une fonction, la partie du code qui définit les limites de réponse ne fonctionne pas. Quelqu'un pourrait-il m'aider à identifier mon erreur ? Merci !
Le résultat graphique que j'obtiens est le suivant : la métrique de réponse requise, les valeurs des facteurs et les verrous fonctionnent parfaitement, mais la courbe de désirabilité ne change pas.

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);
Automatisation et scriptsWindowsRe : Demande d’aide pour définir et maximiser la désirabilité au sein d’une fonction.Je ne vois pas comment utiliser les limites de réponse de cette manière, indépendamment du profileur, car la documentation est insuffisante et la syntaxe choisie est, à mon avis, assez mauvaise… Je sais qu'il est possible de construire l'expression complète du profileur et d'y inclure les limites de réponse. Une autre option serait d'utiliser la propriété de colonne « limite de réponse », mais je pense qu'elle doit être définie avant d'exécuter le profileur. L'intégration de votre fonction dans le profileur devrait fonctionner correctement. Cet article explique le principe de base du JSL pour ajuster le modèle, maximiser la désirabilité et extraire les résultats avec des colonnes sélectionnables par l'utilisateur.
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
));
Vous pouvez vérifier l'expression utilisée en exécutant simplement la partie Substitute sans Eval

Re : Demande d’aide pour définir et maximiser la désirabilité au sein d’une fonction.Salut Jarmo,
Merci pour votre suggestion. Je vais réécrire le profileur comme vous l'avez suggéré. Cependant, un problème de syntaxe persiste. J'ai réécrit ma fonction pour définir les « Limites de réponse » dans le profil au lieu d'une étape séparée. Cela ne fonctionne toujours pas. Mais si je remplace le nom de la variable de colonne et que je le code en dur avec le nom de la colonne, cela fonctionne. Pourriez-vous m'indiquer ce que je fais mal ?
Dans le profileur défini à l'intérieur de la fonction, lorsque je fais cela, cela fonctionne :
"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)
}
),
Mais quand je fais ça, ça ne marche pas
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 : Demande d’aide pour définir et maximiser la désirabilité au sein d’une fonction.Les limites de réponse ne sont pas réellement envoyées à une colonne, mais à un nom JMP. C'est pourquoi j'utilise Parse() et non Column()/AsColumn(). Je ne comprends pas pourquoi c'est implémenté ainsi.
Dans votre cas, étant donné que le nom de votre colonne nécessite une syntaxe spéciale (""n), essayez d'utiliser As Name() au lieu 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);
Je suggère de vérifier l'expression que vous construisez, avec Substitute et EvalExpr c'est assez facile en exécutant simplement la partie en surbrillance

Je vais également commencer à l'utiliser car c'est beaucoup plus robuste et probablement la bonne façon de procéder avec quelque chose comme ça.
Re : Demande d'aide pour définir et maximiser la désirabilité au sein d'une fonction.Salut Jarmo,
Cela a parfaitement fonctionné ! Le remplacement de Parse() par As Name() a résolu le problème et attribue désormais correctement la chaîne de nom stockée dans la variable comme colonne à laquelle les limites de réponse doivent être transmises.
Merci encore pour votre aide !