JSL Constrained Minimize - Hilfe zum zeilenweisen LöserHallo,
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 von [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, in der
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 in mehrere Spalten aufzuteilen, um leichter nachverfolgen zu können, ob dazwischen Berechnungsfehler aufgetreten sind. Durchlaufen Sie dann jede Zeile und führen Sie einen Löser aus, um x1 und x2 zu wiederholen, bis die Zielkriterien erfüllt sind.
In JMP habe ich Probleme, die Funktion "Eingeschränktes Minimieren" zu verwenden, um dies zu replizieren. Jedes Mal, wenn ich das Skript ausführe, sieht es nicht nach Konvergenz aus, da das Ziel nicht erreicht wird und sich die Werte ständig ändern. Außerdem kann ich nur 1 Zielziel anstelle von 2 festlegen. Unten finden Sie ein Beispiel für meinen JSL-Code. Beachten Sie, dass column_y1 und column_y2 Formelspalten sind, in denen x1- und x2-Variablen enthalten sind.
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 dies funktioniert? Oder stimmt etwas nicht, was ich hier mache?
Jede Hilfe wird sehr geschätzt. Vielen Dank!
SkriptingBetreff: JSL Constrained Minimize - Hilfe zum zeilenweisen LöserDer Code wird nicht ausgeführt. Würden Sie bitte näher darauf eingehen? Auch Constrained Minimize erwartet einen Ausdruck, aber expr1 scheint eine Variable zu sein, die einen Wert enthält, sodass nichts zu optimieren ist.Betreff: JSL Constrained Minimize - Hilfe zum zeilenweisen LöserHallo Peng Liu,
Ja, der Code würde nicht auf sich selbst funktionieren, da er meine Datentabelle erfordert, die proprietäre Daten enthält, die ich leider nicht teilen kann.
In Bezug auf Ausdruck1, der den zu optimierenden Begriff nicht enthält, war die Frage, die ich hatte, dass, wenn die in Ausdruck1 verwendeten Begriffe FORMELspalten sind, in denen die Optimierungsvariable enthalten ist, die eingeschränkte Minimierung noch funktionieren würde oder ich den Begriff erweitern muss gesamte Gleichung in Ausdruck1 (anstatt sie verschachtelt zu haben). Beachten Sie, dass ich mich nicht dafür entschieden habe, da die Gleichung sehr lang ist.
Bitte lassen Sie mich wissen, wenn Sie weitere Erläuterungen benötigen.
Vielen Dank.
Betreff: JSL Constrained Minimize - Hilfe zum zeilenweisen LöserDas folgende Beispiel ist eine hypothetische Situation, die auf Ihrer Beschreibung des Problems basiert.
Die Spalte fcol ist eine Formel aus den beiden anderen Spalten x1 und x2.
Die Auswertung von fcol hängt von zwei Spalten x1 und x2 ab und wird nicht von externen JSL-Variablen wie denen 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 denke, was Sie brauchen, ist eine Ausdrucksspalte, 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 anderen Operationen als Ausdrucksoperationen lösen eine Auswertung aus. Das Folgende 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 Constrained Minimize - Hilfe zum zeilenweisen LöserHallo Peng Liu,
Danke für die Antwort. Ich glaube, ich verstehe das Problem hier:
Für das Szenario, in dem ich 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 ..)
Wobei das Ziel darin besteht, Spalte Z = 0 zu machen, indem für jede Zeile ein Wert in Spalte X1 und X2 festgelegt wird.
Die Verwendung von Constrained Minimize, um den Ausdruck in Spalte Z = 0 durch Iteration von Werten in einigen JSL-Variablen x1 und x2 zu erstellen, würde nicht funktionieren, da die Spalten Y1 und Y2 Formelspalten sind, die basierend auf den Werten in Spalte X1 und X2 ausgewertet werden und bei denen keine Verbindung besteht alles auf die JSL-Variablen x1 und x2.
Wenn ich mir anschaue, wie Sie Ihr Skript eingerichtet haben, kann ich versuchen, es für meinen Fall zum Laufen zu bringen, indem alle verschachtelten Berechnungen in JSL und nicht in Formelspalten in der Datentabelle durchgeführt werden. Führen Sie die eingeschränkte Min-Funktion aus und speichern Sie die Ergebnisse in den Datentabellenspalten.
Was denken Sie ?
Betreff: JSL Constrained Minimize - Hilfe zum zeilenweisen LöserFühlen Sie sich wie ein Arbeitsansatz. Sie haben also nur einen einzigen Ausdruck, da Sie Formelspalten eingerichtet haben, müssen die Ausdrücke für alle Zeilen gleich sein. Sie benötigen die Tabelle nur, weil Sie zeilenweise Werte für x3, x4 usw. benötigen. Ich kann nicht sicher sein, wie eingeschränkt die Optimierung und das Ziel von z = 0 hier sind, aber das folgende Skript zeigt das Gesamtbild des Flusses. 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 Constrained Minimize - Hilfe zum zeilenweisen LöserHallo Peng Liu,
Vielen Dank, ich habe versucht zu verfolgen, wie Sie die Min-Einschränkung festgelegt haben, und es scheint jetzt für mich 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 Constrained Minimize - Hilfe zum zeilenweisen LöserDas Befolgen von zwei JSL-Funktionen kann für Ihr Ziel "Gleichungen lösen" relevant sein. Sie sind für lineare Gleichungen.


Zum Lösen nichtlinearer Gleichungen möchten Sie möglicherweise das Ziel in ein äquivalentes Optimierungsproblem konvertieren. 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 Maximieren, die nichtlineare Plattform oder die Erwünschtheitsfunktion in Profiler. Andere JMP-Tools können nützlich sein, um das Optimum zu "suchen", z. B. DOE-Plattformen in JMP.
Die Wahl des Ansatzes hängt vom tatsächlichen Ziel und den Einschränkungen ab.
Betreff: JSL Constrained Minimize - Hilfe zum zeilenweisen LöserHallo Peng Liu,
Vielen Dank, dass Sie diese Optionen geteilt haben, aber es ist nicht klar, welche Methode ich verwenden könnte, wenn ich im Grunde das Gleiche wie zuvor versuche. Dabei wird für jede Zeile in der Datentabelle nach x1 und x2 aufgelöst, in diesem Fall jedoch nach zwei Gleichungen gleichzeitig mit einigen nichtlinearen Einschränkungen.
Wissen Sie, ob wir schon Beispiele haben? Es ist schwer zu glauben, dass es so schwierig ist, dies gegen Excel zu tun
Vielen Dank
Betreff: JSL Constrained Minimize - Hilfe zum zeilenweisen LöserWie wäre es, wenn Sie das Excel-Beispiel veröffentlichen, von dem Sie sagten, es sei einfach zu lösen, und wir beginnen von dort aus? Nicht unbedingt das genaue Problem in Ihren Händen, aber etwas ähnelt stark Ihrem Ziel. Oder nur das Excel-Beispiel, das Ihnen die Verwendung zeigt, und wir werden sehen, ob wir es mit JMP lösen können.