Hauptinhalt

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 rosenbrock(x,y,a)=log(1+a(y-x2)2+(1-x)2) unter der Nebenbedingung x2+y21, wobei a=100 gilt und der Startpunkt x0 durch x=-2,y=2 gegeben ist. Legen Sie außerdem als Schranken -3x3, -2y9 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):

optimizelet_choose.png

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.

Live Task
  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 x2+y21, 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

Siehe auch