Initial point is a local minimum that satisfies the constraints.
Optimization completed because at the initial point, the objective function is non-decreasing
in feasible directions to within the default value of the optimality tolerance, and
constraints are satisfied to within the default value of the constraint tolerance.
<stopping criteria details>
Wenn ich aber die zweite Bedingung mit aufnehme kommt
____________________________________________________________
CheckGradients Information
Objective function derivatives:
Maximum relative difference between supplied
and finite-difference derivatives = 0.
Nonlinear equality constraint derivatives:
Maximum relative difference between supplied
and finite-difference derivatives = 5.10039e-07.
fmincon stopped because the size of the current step is less than
the default value of the step size tolerance but constraints are not
satisfied to within the default value of the constraint tolerance.
<stopping criteria details>
Scheinbar sind die Gradienten ja richtig, also wo liegt das Problem?
die Abhilfe dürfte ein besserer Startpunkt sein.
Auch die Wahl eines anderen Algorithmus kann helfen.
Bitte Code möglichst am Stück und reproduzierbar posten anstatt zu "erzählen", was du machst. Das erleichtert es erheblich, das Problem nachzuvollziehen und somit bei der Lösung zu helfen.
Falls du mit deiner Frage vom Dez. '17 nicht weitergekommen bist, kann das auch dort einen Versuch wert sein.
Hallo Harald!
Erstmal danke für die schnelle Antwort.
Der Code ist bloß ziemlich lang, ich versuche es immer auf das Notwendige zu kürzen. Also hier ein etwas längerer Ausschnitt:
% Extraction displacements
U = x(1:Nu*(N+1)); % all [u0,u1,...,uN] % Extraction actuation momentum
Tau = x(Nu*(N+1)+1:end); % all [tau0,tau1,...,tauN]
%----------------------------------------------------------------------------------------------------------------
u1 = U(Nu+1:Nu*2);
q1 = Fd(q0,u1); %q1 ist abhängig von u
ceq(Nu+1:2*Nu) = D1Ld(q0,q1) + fk_m(q0,tau0); %D1Ld ist von u abhängig und fk von tau
gceq(Nu+1:2*Nu,2*Nu) = D2D1LD(q0,q1) ; %Ableitung nach u
gceqtau(Nu+1:2*Nu,1) = D2fk_m(q0,tau0); %Ableitung nach tau
es ist an sich gut, dass du versuchst, das Beispiel kompakt zu halten. Nur kann man halt damit oft wenig anfangen, wenn man es nicht laufen lassen kann.
Hast du mal einen Startvektor angegeben, der die Nebenbedingungen erfüllt? Welchen?
Ich kann den Code noch nicht laufen lassen, da (mindestens) J0 und reresort fehlen. Für den Anfang würde es auch reichen zu wissen, wie der Startvektor xstart aussieht.
Aus Performancegründen würde ich es vermeiden, symbolische Berechnungen wie das Erstellen von F_q wiederholt durchzuführen.
Es sieht so aus, als wenn meine Gradienten zu ungenau sind (etwa um 10e.14 Unterschied zu berechneten Jacobians aus der symbolic toolbox) Wenn ich alle mit der jacobian berechne, ist die Rechenzeit allerdings unglaublich lang. Gibt es da noch eine andere Möglichkeit?
du könntest MATLAB die Gradienten schätzen lassen.
Auch wenn du jacobian nutzt, sollte es möglich sein, die jacobian einmal zu berechnen und dann nur noch einzusetzen.
Grüße,
Harald
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.