JSL Constrained Minimize - Aide du solveur ligne par ligneSalut,
Mon objectif est de faire itérer JSL à travers les valeurs de deux colonnes (x1, x2) qui sont utilisées dans les formules d'autres colonnes jusqu'à ce qu'elle réponde aux critères de [colonne (y1) - colonne (y2) = 0; colonne (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 décomposer l'équation en plusieurs colonnes pour suivre plus facilement s'il y avait des erreurs de calcul entre les deux. Ensuite, parcourez chaque ligne et effectuez un solveur pour itérer x1 et x2 jusqu'à ce que les critères objectifs soient satisfaits.
Dans JMP, j'ai des difficultés à utiliser la fonction de réduction contrainte pour reproduire cela. Chaque fois que j'exécute le script, il n'a pas l'air de 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. Voici un exemple de mon code JSL. Notez que column_y1 et column_y2 sont des colonnes de formule 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 de l'équation imbriquée ENTIÈRE 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!
ScriptingRe: JSL Contrained Minimize - Aide du solveur ligne par ligneLe code ne s'exécute pas. Pouvez-vous préciser? De plus, Contraint Minimize attend une expression, mais expr1 semble être une variable contenant une valeur, il n'y a donc rien à optimiser.Re: JSL Contrained Minimize - Aide du solveur ligne par ligneSalut Peng Liu,
Oui, le code ne fonctionnerait pas de lui-même car il nécessite ma table de données qui contient des données propriétaires que je ne peux malheureusement pas partager.
En termes d'expr1 ne contenant pas le terme à optimiser, je suppose que la question que je me posais était la suivante: si les termes utilisés dans expr1 sont des colonnes FORMULA dans lesquelles la variable d'optimisation est contenue, la minimisation contrainte fonctionnerait-elle encore ou dois-je développer le équation entière dans expr1 (au lieu de l'avoir imbriquée). Notez que je n'ai pas choisi de faire cela car l'équation est très longue.
Veuillez me faire savoir si vous avez besoin de plus de précisions.
Merci.
Re: JSL Contrained Minimize - 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 des variables JSL extérieures, comme celles de votre script.
Enfin, l'exemple montre que expr1 est une valeur, pas 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 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 une valeur d'une colonne Expression. Toute autre opération autre que les opérations d'expression déclenchera l'é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: JSL Constrained Minimize - Aide du solveur ligne par ligneSalut Peng Liu,
Merci pour la réponse. Je pense que je comprends le problème ici:
Pour le scénario où j'ai:
- Table 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 rendre la colonne Z = 0 en définissant une valeur dans la colonne 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 des valeurs dans certaines variables JSL x1 et x2 ne fonctionnerait pas car les colonnes Y1 et Y2 sont des colonnes de formule qui sont évaluées en fonction des valeurs des colonnes X1 et X2, et ne sont pas connectées à tout à la variable 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 pour mon cas est de faire effectuer tous les calculs imbriqués dans JSL plutôt que dans des colonnes de formules dans la table de données. Exécutez la fonction Min contrainte, puis enregistrez les résultats dans les colonnes de la table de données.
Qu'est-ce que tu penses ?
Re: JSL Constrained Minimize - Aide du solveur ligne par ligneSentez-vous comme une approche de travail. Vous n'avez donc qu'une seule expression, car vous avez configuré des colonnes de formules, les expressions doivent être identiques 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, 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: JSL Constrained Minimize - Aide du solveur ligne par ligneSalut 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. J'avais essentiellement besoin d'exécuter tout le calcul dans JSL plutôt que de l'avoir dans des colonnes de formules.
Question - Est-il possible de résoudre deux équations simultanément? Est-il possible d'avoir des contraintes non linéaires?
Re: JSL Constrained Minimize - Aide du solveur ligne par ligneSuivre deux fonctions JSL peut être pertinent pour votre objectif de «résolution d'équations». Ils sont pour les équations linéaires.


Pour résoudre des équations non linéaires, vous pouvez convertir l'objectif en un problème d'optimisation équivalent. Utilisez ensuite la fonction JSL Maximize ou la plate-forme 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, de sorte que certains outils JMP peuvent être utilisés, par exemple la fonction JSL Maximize, la plate-forme non linéaire ou la fonction de désirabilité dans Profiler. D'autres outils JMP peuvent être utiles pour "rechercher" l'optimum, par exemple les plates-formes DOE dans JMP.
Le choix de l'approche dépend de l'objectif réel et des contraintes.
Re: JSL Constrained Minimize - Aide du solveur ligne par ligneSalut Peng Liu,
Merci d'avoir partagé ces options, mais la méthode que je pourrais utiliser n'est pas claire si j'essaie de faire la même chose qu'avant, qui consiste à résoudre x1 et x2 pour chaque ligne de la table de données, mais dans ce cas, résoudre deux équations simultanément, avec certaines contraintes non linéaires.
Savez-vous si nous avons déjà fait des exemples? Il est difficile de croire que c'est si difficile de faire cela par rapport à Excel
Merci
Re: JSL Constrained Minimize - Aide du solveur ligne par ligneQue diriez-vous de publier l'exemple Excel que vous avez dit facile à résoudre, et nous partons de là? Pas nécessairement le problème exact entre vos mains, mais quelque chose ressemble étroitement à votre objectif. Ou juste l'exemple Excel qu'ils vous montrent comment utiliser, et nous verrons si nous pouvons le résoudre en utilisant JMP.