JSL Constrained Minimize - Aide du solveur ligne par ligneSalut,
Mon objectif est que JSL parcoure les valeurs de deux colonnes (x1, x2) qui sont utilisées dans les formules d'autres colonnes jusqu'à ce qu'elles répondent aux critères de [column(y1)- column(y2) = 0 ;column(z1)- colonne (z2) = 0]. Notez que l'équation que j'essaie de résoudre est une équation non linéaire imbriquée où
y1 = f1(x1, x2, x3, x4...)
y2 = f2(x1, x2, x3, x4...)
z1 = y1+y2
z2 = valeur indépendante
Dans Excel, il était assez simple de simplement diviser l’équation en plusieurs colonnes pour suivre plus facilement s’il y avait des erreurs de calcul entre les deux. Parcourez ensuite chaque ligne et effectuez un solveur pour parcourir x1 et x2 jusqu'à ce que les critères objectifs soient remplis.
Dans JMP, j'ai des difficultés à utiliser la fonction Constrained Minimize pour reproduire cela. Chaque fois que j'exécute le script, il ne semble pas converger car l'objectif cible n'est pas atteint et les valeurs changent constamment. De plus, je ne peux définir qu'un seul objectif cible au lieu de 2. Vous trouverez ci-dessous un exemple de mon code JSL. Notez que column_y1 et column_y2 sont des colonnes de formules contenant des variables x1 et x2.
dt = Current Datatable();
expr1 = abs(:column_y1[i] - :column_y2[i]);
x1 = 0.5;
x2 = 0.2;
For Each Row(
i=Row();
minfun = Constrained Minimize (expr1, {x1(0.1,0.8), x2(0.01,0.5)},
<<MAXITER></MAXITER>Pensez-vous que j'ai besoin d'avoir l'équation ENTIÈRE imbriquée dans l'expression pour que cela fonctionne ? Ou y a-t-il quelque chose de mal que je fais ici.
Toute aide est grandement appréciée. Merci!
Conception d'expériencesRe : Réduction contrainte JSL - Aide du solveur ligne par ligneJe vous en prie. Heureux que vous ayez trouvé la solution.Re : Réduction contrainte JSL - Aide du solveur ligne par ligneBonjour Peng Liu,
Merci beaucoup pour votre persévérance à m'aider à résoudre ce problème. J'ai fait référence à la façon dont vous l'avez converti en un problème équivalent sans contrainte, minimisant ensuite la somme des erreurs quadratiques de l'équation cible et de la contrainte. Même si je n’ai pas eu besoin d’utiliser un terme de pénalité, la solution correspond plus ou moins à ce que je vois dans Excel.
Il faut environ 2 à 3 minutes pour résoudre 1 100 lignes de cas (ce qui, je pense, est tout à fait raisonnable étant donné la complexité de mes équations), après l'avoir défini de telle sorte que la valeur de départ commence à partir des valeurs résolues à partir de la ligne de données précédente.
Encore une fois, merci beaucoup.
Re : Réduction contrainte JSL - Aide du solveur ligne par ligneDans ce cas, je ne pense pas que résoudre plusieurs équations simultanément soit la direction à suivre, car chaque ligne de votre tableau implique deux variables : paramètre1 et paramètre2. Et ce sont des variables différentes d'une ligne à l'autre, même si elles portent le même nom d'une équation à l'autre et que vous les placez dans la même colonne.
Pour résoudre simultanément plusieurs équations en utilisant les suggestions que j'ai données, les équations utilisent le même ensemble de variables d'une équation à l'autre. Chaque variable ne doit avoir qu'une seule valeur.
Ce que vous devez faire est de traduire ce que vous avez fait dans les macros Excel en JSL, par exemple, vous devez écrire une boucle JSL plus grande pour parcourir chaque ligne de manière itérative.
Pour résoudre une équation sous contrainte non linéaire, l’une de mes suggestions était de convertir un problème contraint en un problème équivalent sans contrainte. Supposons que votre contrainte soit une égalité, l'exemple suivant tente de trouver la solution à y-exp(x)=0, sous la contrainte y==exp(-x). La solution est l’intersection des deux courbes, qui est en (x,y)=(0,1). L'objectif minimisant est la somme des erreurs quadratiques de l'équation cible y-exp(x), et la violation de la contrainte y-exp(-x)=0. Notez que k est une pénalité pour la violation et k est plutôt important.
Notez également que j'ai intentionnellement placé les valeurs initiales loin de la solution et augmenté MaxIter, juste au cas où vous ne pourriez pas identifier les valeurs initiales qui ne sont pas proches de la solution.
x = 100;
y = 100;
k = 10000;
minFun = Minimize( (y - exp(x))^2 + k*(y - exp(-x))^2, {x, y} , MaxIter(1000));
Eval List( {x, y, minFun} );
show(x, y, y-exp(x),y - exp(-x))
C'est une approche réalisable si votre objectif réel peut l'utiliser.
Re : Réduction contrainte JSL - Aide du solveur ligne par ligneBonjour Peng Liu,
Je ne sais pas si cela aide car je dois anonymiser les données, mais c'est essentiellement ce que j'essayais de reproduire ou d'améliorer à partir d'Excel :
Dans ce cas, j'utilise une macro + le solveur Excel pour itérer le paramètre 1 et le paramètre 2 pour atteindre l'objectif 1 et l'objectif 2

Merci
Re : Réduction contrainte JSL - Aide du solveur ligne par ligneQue diriez-vous de publier l’exemple Excel que vous avez dit facile à résoudre, et on part de là ? Ce n’est pas nécessairement le problème exact entre vos mains, mais quelque chose qui ressemble beaucoup à votre objectif. Ou simplement l'exemple Excel qu'ils vous montrent comment utiliser, et nous verrons si nous pouvons le résoudre en utilisant JMP.
Re : Réduction contrainte JSL - Aide du solveur ligne par ligneBonjour Peng Liu,
Merci d'avoir partagé ces options, mais je ne sais pas quelle méthode je pourrais utiliser si j'essaie essentiellement de faire la même chose qu'avant, c'est-à-dire résoudre x1 et x2 pour chaque ligne du tableau de données, mais dans ce cas, résoudre deux équations. simultanément, avec quelques contraintes non linéaires.
Savez-vous si nous avons déjà réalisé des exemples ? Il est difficile de croire qu'il soit si difficile de faire cela par rapport à Excel
Merci
Re : Réduction contrainte JSL - Aide du solveur ligne par ligneSuivre deux fonctions JSL peut être pertinent pour votre objectif de « résolution d’équations ». Ils concernent les équations linéaires.


Pour résoudre des équations non linéaires, vous souhaiterez peut-être convertir l'objectif en un problème d'optimisation équivalent. Utilisez ensuite la fonction JSL Maximize ou la plateforme non linéaire pour le résoudre.
Pour l'optimisation avec des contraintes non linéaires, il est possible de construire un objectif d'optimisation équivalent sans contraintes, donc certains outils JMP peuvent être utilisés, par exemple la fonction JSL Maximize, la plateforme non linéaire ou la fonction de désirabilité dans Profiler. D'autres outils JMP pourraient être utiles pour "rechercher" l'optimal, par exemple les plates-formes DOE dans JMP.
Le choix de l'approche dépend de l'objectif réel et des contraintes.
Re : Réduction contrainte JSL - Aide du solveur ligne par ligneBonjour Peng Liu,
Merci, j'ai essayé de suivre la façon dont vous avez défini la contrainte minimale et cela semble fonctionner pour moi maintenant. En gros, j'avais besoin d'exécuter tous les calculs en JSL plutôt que de les avoir dans des colonnes de formule.
Question - Est-il possible de résoudre deux équations simultanément ? Est-il possible d'avoir des contraintes non linéaires ?
Re : Réduction contrainte JSL - Aide du solveur ligne par ligneSentez-vous comme une approche de travail. Vous n’avez donc qu’une seule expression, car vous configuriez des colonnes de formules, les expressions doivent être les mêmes pour toutes les lignes. Vous avez besoin du tableau, uniquement parce que vous avez besoin de valeurs pour x3, x4, etc., ligne par ligne. Je ne peux pas être sûr de la pertinence de l'optimisation contrainte et de l'objectif cible de z=0 ici, mais le script suivant montre une vue d'ensemble du flux. Remplacez la configuration et l'optimisation en conséquence.
dt = New Table( "Untitled",
Add Rows( 3 ),
New Column( "x1",
Set Values( [.,.,.] )
),
New Column( "x2",
Set Values( [.,.,.] )
),
New Column( "x3",
Set Values( [2,2,2] )
),
);
expr0 = expr( (x3 * x1 ^ 2 + 2 * x2 ^ 2) - 2 * x1 * x2 - 4 * x1 - 6 * x2 );
for (irow = 1, irow<=nrow(dt), irow++,
expr1 = substitute(name expr(expr0), expr(x3), dt:x3[irow]);
//show(name expr(expr1));
A = [1 1, 1 5];
b = [2, 5];
minFun = Constrained Minimize(
expr1,
{x1( 0, 5 ), x2( 0, 5 )},
<<LESSTHANEQ></LESSTHANEQ>Re : Réduction contrainte JSL - Aide du solveur ligne par ligneBonjour Peng Liu,
Merci pour la réponse. Je pense que je comprends le problème ici:
Pour le scénario où j'ai :
- Tableau de données avec 100 lignes
- Colonne Z = Colonne Y1 - Colonne Y2
- Colonne Y1 = formule (Colonne X1, X2, X3..)
- Colonne Y2 = formule (Colonne X1, X2, X3..)
Où l'objectif est de faire en sorte que la colonne Z = 0 en définissant une valeur dans les colonnes X1 et X2 pour chaque ligne.
L'utilisation de la réduction contrainte pour rendre l'expression dans la colonne Z = 0 en itérant les valeurs dans certaines variables JSL x1 et x2 ne fonctionnerait pas car les colonnes Y1 et Y2 sont des colonnes de formules qui sont évaluées en fonction des valeurs des colonnes X1 et X2 et ne sont pas connectées à le tout aux variables JSL x1 et x2.
En regardant comment vous avez configuré votre script, je pense que la façon dont je peux essayer de le faire fonctionner dans mon cas est d'effectuer tous les calculs imbriqués dans JSL plutôt que dans les colonnes de formule de la table de données. Exécutez la fonction Min contrainte, puis enregistrez les résultats dans les colonnes du tableau de données.
Qu'en penses-tu ?
Re : Réduction contrainte JSL - Aide du solveur ligne par ligneL'exemple suivant est une situation hypothétique basée sur votre description du problème.
La colonne fcol est une formule de deux autres colonnes x1 et x2.
L'évaluation de fcol dépend de deux colonnes x1 et x2, et elle ne sera pas affectée par les variables JSL extérieures, comme celles de votre script.
Enfin, l'exemple montre que expr1 est une valeur et non une expression.
dt = New Table( "Untitled",
Add Rows( 1 ),
New Column( "fcol",
Numeric,
"Continuous",
Format( "Best", 12 )
),
New Column( "x1",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values({.5})
),
New Column( "x2",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values({.5})
),
);
dt:fcol << set formula(
(2 * x1 ^ 2 + 2 * x2 ^ 2) - 2 * x1 * x2 - 4 * x1 - 6 * x2
);
dt:fcol << eval formula;
i=1;
expr1 = abs(dt:fcol[i]);
show(expr1);
Je suppose que vous avez besoin d’une colonne Expression, comme dans l’exemple suivant.
dt = New Table( "Untitled",
Add Rows( 1 ),
New Column( "exprcol",
Expression,
"None",
Set Selected,
Set Values( {(2 * x1 ^ 2 + 2 * x2 ^ 2) - 2 * x1 * x2 - 4 * x1 - 6 * x2} )
)
);
i=1;
expr1 = dt:exprcol[i];
A = [1 1, 1 5];
b = [2, 5];
minFun = Constrained Minimize(
expr1,
{x1( 0, 5 ), x2( 0, 5 )},
<<LESSTHANEQ></LESSTHANEQ>
Et expr1 ne peut qu'extraire la valeur d'une colonne d'expression. Toute autre opération autre que les opérations d’expression déclenchera une évaluation. Par exemple, ce qui suit ne fonctionnera pas comme prévu.
dt = New Table( "Untitled",
Add Rows( 1 ),
New Column( "exprcol",
Expression,
"None",
Set Selected,
Set Values( {(2 * x1 ^ 2 + 2 * x2 ^ 2) - 2 * x1 * x2 - 4 * x1 - 6 * x2} )
)
);
i=1;
x1 = .5;<BR />x2 = .5;<BR />expr1 = dt:exprcol[i]+2*dt:exprcol[i];//trigger evaluation and fail.Re : Réduction contrainte JSL - Aide du solveur ligne par ligneBonjour Peng Liu,
Ouais, le code ne fonctionnerait pas tout seul car il nécessite ma table de données qui contient des données propriétaires que je ne peux malheureusement pas partager.
En ce qui concerne expr1 ne contenant pas le terme à optimiser, je suppose que la question que je me posais était que si les termes utilisés dans expr1 sont des colonnes FORMULE dans lesquelles la variable d'optimisation est contenue, la réduction contrainte fonctionnerait-elle toujours ou dois-je étendre le l'équation entière dans expr1 (au lieu de l'imbriquer). Notez que je n'ai pas choisi de faire cela car l'équation est très longue.
S'il vous plaît laissez-moi savoir si vous avez besoin de plus de précisions.
Merci.
Re : Réduction contrainte JSL - Aide du solveur ligne par ligneLe code ne s'exécute pas. Pourriez-vous s'il vous plaît développer ? Constrained Minimize attend également une expression, mais expr1 semble être une variable contenant une valeur, il n'y a donc rien à optimiser.