Erste Schritte mit dem problembasierten Live-Editor Task „Optimize“
Dieses Beispielskript hilft Ihnen dabei, den problembasierten Live-Editor Task Optimize zur Optimierung oder zur Lösung von Gleichungen zu nutzen. Passen Sie das Skript an Ihre eigene Problemstellung an.
Das Skript löst ein nichtlineares Optimierungsproblem mit nichtlinearen Nebenbedingungen:
Minimieren Sie unter der Nebenbedingung , wobei gilt und der Startpunkt durch gegeben ist. Legen Sie außerdem als Schranken , fest.
Der Code für die Zielfunktion befindet sich am Ende dieses Skripts.
Einfügen von Parametern oder Daten
In der Regel verfügen Sie über Daten oder Werte, die Sie an den Solver übergeben. Geben Sie diese Werte in den Eingabebereich ein (dort, wo x0x und x0y steht) und führen Sie den Abschnitt aus, indem Sie Section > Run Section auswählen oder Control+Enter drücken.
Legen Sie die Komponenten x0x und x0y des Startpunkts fest und skalieren Sie a für die Optimierung.
x0x = -2; x0y = 2; a = 100;
Fügen Sie diese Werte sowie alle weiteren Problemdaten in den Workspace ein, indem Sie diesen Abschnitt ausführen, bevor Sie fortfahren.
Live-Editor Task „Optimize“
In der Regel fügen Sie den Live-Editor Task „Optimize“ in das Skript ein, indem Sie auf der Registerkarte Live-Editor die Option Task > Optimize auswählen oder auf der Registerkarte Insert die Option Task > Optimize auswählen. Anschließend wird Ihnen die folgende Auswahl angezeigt (dies ist nur eine Abbildung, nicht der eigentliche Task):

Um den problembasierten Task aufzurufen, klicken Sie auf Problem-based (recommended).
Beim folgenden problembasierten Task sind die Variablen, die Zielfunktion und die Nebenbedingungen bereits ausgefüllt. Passen Sie ihn an Ihr Problem an oder führen Sie ihn unverändert aus, um zu sehen, wie der Task funktioniert. Um die Problemstellung zu ändern, klicken Sie auf die Schaltfläche Define problem (Problem definieren) am unteren Rand des Tasks. Um den Task auszuführen, klicken Sie auf die Schaltfläche Solve problem (Problem lösen) am unteren Rand des Tasks.
OptimizationProblem :
Solve for:
x, y
minimize :
log(((1 + (100 .* (y - x.^2).^2)) + (1 - x).^2))
subject to :
(x.^2 + y.^2) <= 1
variable bounds:
-3 <= x <= 3
-2 <= y <= 9
Solving problem using fmincon. Local minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. <stopping criteria details>
solution = struct with fields:
x: 0.7864
y: 0.6177
reasonSolverStopped =
OptimalSolution
objectiveValue = 0.0447
Interpretieren der Ergebnisse
Der Task ruft zur Lösung des Problems die Funktion solve auf, die wiederum fmincon aufruft. Am oberen Rand des Tasks ist ersichtlich, dass die Lösung in der solution-Struktur zurückgegeben wird. Die ausgegebene Lösung, x = 0.7864 und y = 0.6177, erfüllt die Nebenbedingung , wie die folgende Berechnung aufzeigt.
solution.x^2 + solution.y^2
ans = 1.0000
Der Solver meldet beim Beenden die Abbruchbedingung OptimalSolution. Um diese Bedingung zu interpretieren, betrachten Sie das exitflag Output Arguments des fmincon-Solvers. In der Beschreibung heißt es: „First-order optimality measure is less than options.OptimalityTolerance, and maximum constraint violation is less than options.ConstraintTolerance.“ (Das Optimalitätsmaß erster Ordnung ist kleiner als options.OptimalityTolerance, und die maximale Überschreitung der Nebenbedingungen ist kleiner als options.ConstraintTolerance.) Mit anderen Worten: Die Lösung ist ein zulässiges lokales Minimum.
Der Wert der Zielfunktion an der Lösung beträgt 0,0457. Dies ist der kleinste Wert der Zielfunktion unter den zulässigen Punkten.
Hilfsfunktionen
Dieser Code erstellt die rosenbrock-Hilfsfunktion.
function objective = rosenbrock(x,y,a) % This function should return a scalar representing an optimization objective. % Example: Concession stand profit % revenue = 3*soda + 5*popcorn + 2*candy; % cost = 1*soda + 2*popcorn + 0.75*candy; % objective = revenue - cost; % profit % Edit the lines below with your calculations. objective = log(1 + a*(y - x^2)^2 + (1 - x)^2); end
