JSL Constrained Minimize – Hilfe zum zeilenweisen SolverHallo,
Mein Ziel ist es, dass JSL Werte in zwei Spalten (x1, x2) durchläuft, die in Formeln anderer Spalten verwendet werden, bis sie die Kriterien [Spalte(y1)- Spalte(y2) = 0 ;Spalte(z1)- erfüllen. Spalte(z2)=0]. Beachten Sie, dass die Gleichung, die ich zu lösen versuche, eine verschachtelte nichtlineare Gleichung ist
y1 = f1(x1, x2, x3, x4...)
y2 = f2(x1, x2, x3, x4...)
z1 = y1+y2
z2 = unabhängiger Wert
In Excel war es einfach genug, die Gleichung einfach in mehrere Spalten aufzuteilen, um leichter nachvollziehen zu können, ob dazwischen Berechnungsfehler vorlagen. Dann durchlaufen Sie jede Zeile und führen einen Solver durch, um x1 und x2 zu iterieren, bis die objektiven Kriterien erfüllt sind.
In JMP habe ich Schwierigkeiten, dies mit der Funktion „Eingeschränktes Minimieren“ zu reproduzieren. Jedes Mal, wenn ich das Skript ausführe, sieht es nicht so aus, als ob es konvergiert, da das Ziel nicht erreicht wird und sich die Werte ständig ändern. Außerdem kann ich nur 1 Ziel festlegen statt 2. Unten finden Sie ein Beispiel meines JSL-Codes. Beachten Sie, dass es sich bei „column_y1“ und „column_y2“ um Formelspalten handelt, die x1- und x2-Variablen enthalten.
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>Glaubst du, ich muss die GESAMTE verschachtelte Gleichung im Ausdruck haben, damit das funktioniert? Oder mache ich hier etwas falsch?
Jede Hilfe wird sehr geschätzt. Danke!
VersuchsplanungBetreff: JSL-beschränkte Minimierung – Hilfe zum Zeilen-für-Zeilen-SolverGern geschehen. Ich freue mich, dass Sie die Lösung gefunden haben.Betreff: JSL-beschränkte Minimierung – Hilfe zum Zeilen-für-Zeilen-SolverHallo Peng Liu,
Vielen Dank für Ihre Beharrlichkeit, mir bei der Lösung dieses Problems zu helfen. Ich habe darauf verwiesen, wie Sie es in ein äquivalentes, uneingeschränktes Problem umgewandelt haben und dann die Summe der quadratischen Fehler sowohl der Zielgleichung als auch der Einschränkung minimiert haben. Obwohl ich keinen Strafbegriff verwenden musste, entspricht die Lösung mehr oder weniger der Lösung, die ich in Excel sehe.
Die Lösung von 1100 Fallzeilen dauert etwa 2–3 Minuten (was meiner Meinung nach angesichts der Komplexität meiner Gleichungen absolut angemessen ist), nachdem ich sie so eingestellt habe, dass der Startwert mit Werten beginnt, die aus der vorherigen Datenzeile gelöst wurden.
Nochmals vielen Dank.
Betreff: JSL-beschränkte Minimierung – Hilfe zum Zeilen-für-Zeilen-SolverIn diesem Fall glaube ich nicht, dass das gleichzeitige Lösen mehrerer Gleichungen der richtige Weg ist, da jede Zeile in Ihrer Tabelle zwei Variablen beinhaltet: Parameter1 und Parameter2. Und es sind von Zeile zu Zeile unterschiedliche Variablen, obwohl sie von Gleichung zu Gleichung denselben Namen haben und Sie sie in derselben Spalte platzieren.
Um mehrere Gleichungen gleichzeitig mit den von mir gegebenen Vorschlägen zu lösen, verwenden Gleichungen von Gleichung zu Gleichung denselben Satz von Variablen. Jede Variable sollte nur einen Wert haben.
Was Sie tun müssen, ist, das, was Sie in Excel-Makros getan haben, in JSL zu übersetzen, z. B. müssen Sie eine größere JSL-Schleife schreiben, um jede Zeile iterativ zu durchlaufen.
Um eine Gleichung unter einer nichtlinearen Einschränkung zu lösen, bestand einer meiner Vorschläge darin, ein eingeschränktes Problem in ein äquivalentes uneingeschränktes Problem umzuwandeln. Angenommen, Ihre Einschränkung ist eine Gleichheit. Im folgenden Beispiel wird versucht, die Lösung für y-exp(x)=0 unter der Einschränkung y==exp(-x) zu finden. Die Lösung ist der Schnittpunkt der beiden Kurven, der bei (x,y)=(0,1) liegt. Das Minimierungsziel ist die Summe der quadratischen Fehler der Zielgleichung y-exp(x) und die Verletzung der Einschränkung y-exp(-x)=0. Beachten Sie, dass k eine Strafe für die Verletzung ist und k ziemlich groß ist.
Beachten Sie auch, dass ich die Anfangswerte absichtlich weit von der Lösung entfernt platziert und MaxIter erhöht habe, nur für den Fall, dass Sie keine Anfangswerte identifizieren können, die nicht nahe an der Lösung liegen.
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))
Es ist ein praktikabler Ansatz, wenn Ihr eigentliches Ziel es nutzen kann.
Betreff: JSL-beschränkte Minimierung – Hilfe zum Zeilen-für-Zeilen-SolverHallo Peng Liu,
Ich bin mir nicht sicher, ob das hilft, weil ich die Daten anonymisieren muss, aber im Grunde habe ich versucht, Folgendes aus Excel zu reproduzieren oder zu verbessern:
In diesem Fall verwende ich ein Makro + den Solver von Excel, um Parameter 1 und Parameter 2 zu iterieren, um Ziel 1 und Ziel 2 zu erreichen

Danke
Betreff: JSL-beschränkte Minimierung – Hilfe zum Zeilen-für-Zeilen-SolverWie wäre es, wenn Sie das Excel-Beispiel veröffentlichen, das Ihrer Meinung nach leicht zu lösen ist, und wir von dort aus beginnen? Nicht unbedingt das genaue Problem, das Sie in der Hand haben, aber etwas, das Ihrem Ziel sehr ähnlich ist. Oder einfach nur das Excel-Beispiel, das Ihnen gezeigt wird, wie man es verwendet, und wir werden sehen, ob wir es mit JMP lösen können.
Betreff: JSL-beschränkte Minimierung – Hilfe zum Zeilen-für-Zeilen-SolverHallo Peng Liu,
Vielen Dank, dass Sie diese Optionen mitgeteilt haben, aber es ist nicht klar, welche Methode ich verwenden könnte, wenn ich im Grunde dasselbe wie zuvor versuche, nämlich für jede Zeile in der Datentabelle nach x1 und x2 aufzulösen, in diesem Fall jedoch zwei Gleichungen zu lösen gleichzeitig, mit einigen nichtlinearen Einschränkungen.
Wissen Sie, ob wir bereits Beispiele erstellt haben? Es ist kaum zu glauben, dass dies im Vergleich zu Excel so schwierig ist
Danke
Betreff: JSL-beschränkte Minimierung – Hilfe zum Zeilen-für-Zeilen-SolverDas Befolgen zweier JSL-Funktionen könnte für Ihr Ziel „Gleichungen lösen“ relevant sein. Sie gelten für lineare Gleichungen.


Um nichtlineare Gleichungen zu lösen, möchten Sie möglicherweise das Ziel in ein äquivalentes Optimierungsproblem umwandeln. Verwenden Sie dann die JSL-Funktion Maximize oder die nichtlineare Plattform, um das Problem zu lösen.
Für die Optimierung mit nichtlinearen Einschränkungen ist es möglich, ein äquivalentes Optimierungsziel ohne Einschränkungen zu erstellen, sodass einige JMP-Tools verwendet werden können, z. B. die JSL-Funktion Maximize, die nichtlineare Plattform oder die Desirability-Funktion im Profiler. Andere JMP-Tools könnten zum „Suchen“ der optimalen Plattformen nützlich sein, z. B. DOE-Plattformen in JMP.
Die Wahl des Ansatzes hängt von der tatsächlichen Zielsetzung und den Randbedingungen ab.
Betreff: JSL-beschränkte Minimierung – Hilfe zum Zeilen-für-Zeilen-SolverHallo Peng Liu,
Vielen Dank, ich habe versucht, zu verfolgen, wie Sie die Mindestbeschränkung festgelegt haben, und es scheint jetzt bei mir zu funktionieren. Grundsätzlich musste ich die gesamte Berechnung in JSL ausführen, anstatt sie in Formelspalten zu haben.
Frage: Ist es möglich, zwei Gleichungen gleichzeitig zu lösen? Ist es möglich, nichtlineare Einschränkungen zu haben?
Betreff: JSL-beschränkte Minimierung – Hilfe zum Zeilen-für-Zeilen-SolverFühlen Sie sich wie ein funktionierender Ansatz. Da Sie also nur einen einzigen Ausdruck haben, müssen die Ausdrücke für alle Zeilen gleich sein, da Sie Formelspalten eingerichtet haben. Sie benötigen die Tabelle nur, weil Sie zeilenweise Werte für x3, x4 usw. benötigen. Ich kann nicht sicher sein, wie relevant die eingeschränkte Optimierung und das Ziel von z=0 hier sind, aber das folgende Skript zeigt das Gesamtbild des Ablaufs. Ersetzen Sie das Setup und die Optimierung entsprechend.
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>Betreff: JSL-beschränkte Minimierung – Hilfe zum Zeilen-für-Zeilen-SolverHallo Peng Liu,
Danke für die Antwort. Ich glaube, ich verstehe das Problem hier:
Für das Szenario, in dem ich Folgendes habe:
- Datentabelle mit 100 Zeilen
- Spalte Z = Spalte Y1 – Spalte Y2
- Spalte Y1 = Formel (Spalte X1, X2, X3..)
- Spalte Y2 = Formel (Spalte X1, X2, X3..)
Das Ziel besteht darin, Spalte Z = 0 zu machen, indem in den Spalten X1 und X2 für jede Zeile ein Wert festgelegt wird.
Die Verwendung von Constrained Minimize, um den Ausdruck in Spalte Z = 0 zu machen, indem Werte in einigen JSL-Variablen x1 und x2 iteriert werden, würde nicht funktionieren, da Spalte Y1 und Y2 Formelspalten sind, die basierend auf Werten in Spalte X1 und X2 ausgewertet werden und nicht miteinander verbunden sind alles an die JSL-Variablen x1 und x2.
Wenn ich mir anschaue, wie Sie Ihr Skript eingerichtet haben, denke ich, dass ich versuchen kann, es für meinen Fall zum Laufen zu bringen, indem ich alle verschachtelten Berechnungen in JSL und nicht in Formelspalten in der Datentabelle durchführen lasse. Führen Sie die eingeschränkte Min-Funktion aus und speichern Sie dann die Ergebnisse in den Datentabellenspalten.
Was denken Sie ?
Betreff: JSL-beschränkte Minimierung – Hilfe zum Zeilen-für-Zeilen-SolverDas folgende Beispiel ist eine hypothetische Situation, die auf Ihrer Beschreibung des Problems basiert.
Die Spalte fcol ist eine Formel der beiden anderen Spalten x1 und x2.
Die Auswertung von fcol hängt von den beiden Spalten x1 und x2 ab und wird nicht durch externe JSL-Variablen wie die in Ihrem Skript beeinflusst.
Schließlich zeigt das Beispiel, dass expr1 ein Wert und kein Ausdruck ist.
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);
Ich vermute, dass Sie eine Ausdrucksspalte benötigen, wie im folgenden Beispiel.
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>
Und expr1 kann nur einen Wert aus einer Ausdrucksspalte extrahieren. Alle weiteren Operationen außer Ausdrucksoperationen lösen eine Auswertung aus. Folgendes funktioniert beispielsweise nicht wie erwartet.
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.Betreff: JSL-beschränkte Minimierung – Hilfe zum Zeilen-für-Zeilen-SolverHallo Peng Liu,
Ja, der Code würde an sich nicht funktionieren, da er meine Datentabelle erfordert, die proprietäre Daten enthält, die ich leider nicht weitergeben kann.
Im Hinblick darauf, dass expr1 den zu optimierenden Begriff nicht enthält, war die Frage, die ich hatte, wohl folgende: Wenn die in expr1 verwendeten Begriffe FORMULA-Spalten sind, in denen die Optimierungsvariable enthalten ist, würde die eingeschränkte Minimierung dann noch funktionieren oder muss ich sie erweitern? gesamte Gleichung in expr1 (anstatt sie zu verschachteln). Beachten Sie, dass ich mich nicht dafür entschieden habe, weil die Gleichung sehr lang ist.
Bitte lassen Sie mich wissen, wenn Sie weitere Erläuterungen benötigen.
Danke.
Betreff: JSL-beschränkte Minimierung – Hilfe zum Zeilen-für-Zeilen-SolverDer Code wird nicht ausgeführt. Könnten Sie das bitte näher erläutern? Auch Constrained Minimize erwartet einen Ausdruck, aber expr1 scheint eine Variable zu sein, die einen Wert enthält, sodass es nichts zu optimieren gibt.