Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   
Bücher:

Fachkräfte:
Ingenieur (m/w) für den Bereich modellbasierte Embedded-Softwareentwicklung
Integration von Simulink-Modellen auf die Ziel-Hardware (mit TargetLink) sowie Durchführung von Softwaretests
cbb-Software GmbH - Stuttgart

Softwareentwickler (m/w) automatische Codegenerierung
Umsetzung, Neuprogrammierung und Weiterentwicklung in Simulink, TargetLink und C
EFS - Ingolstadt, Wolfsburg

Informatiker (m/w) für den Bereich Toolkette Embedded Software
Weiterentwicklung einer MATLAB- / Simulink-Toolkette
cbb-Software GmbH - Stuttgart

Entwicklungsingenieur (m/w) Windturbinenregelung
Entwicklung von Regelungsalgorithmen für Windturbinenregler, Einbindung von modernen Sensorsystemen
Enercon GmbH - Aurich, Magdeburg, Kiel, Bremen

Entwicklungsingenieur (m/w) HiL Modellierung Automotive mit Expertenfunktion
Mitwirkung in der Entwicklung von Fahrzeugsystemen in den Bereichen Fahrerassistenzsysteme, eMobility und Komfort
Bertrandt Technikum GmbH - Ehningen

weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

fmincon - Converged to an infeasible point.

 

Neuling89
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 15.12.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.02.2018, 12:57     Titel: fmincon - Converged to an infeasible point.
  Antworten mit Zitat      
Hallo zusammen,

ich habe ein Optimierungs Problem, vielleicht kann mir hier wer helfen.

Ich hab folgende Optionen

Code:

options = optimoptions(@fmincon,'Algorithm','sqp','SpecifyObjectiveGradient',true,'CheckGradients',true,'FiniteDIfferenceType','central','SpecifyConstraintGradient',true);


Und dann folgt

Code:

x = fmincon(Jd0,xstart,[],[],[],[],lb,ub,cons,options);
 

Jd0 ist hierbei lediglich eine einfache Zielfunktion. Lb und Ub sind gesetzt, bei cons definiere ich c und gc = [] und des Weiteren
Code:

% als erste Bedingung
ceq(1:Nu) = u0 - par.U0;
gceq(1:Nu,1:Nu) = eye(Nu);    %Ableitung nach u
 


und
Code:

ceq(Nu+1:2*Nu) = DLd(q,u) + fk(q,tau);   %Bedingung
gceq(Nu+1:2*Nu,2*Nu) =  DuDLd(q,u);   %Ableitung nach u
gceqtau = Dtaufk(q,tau);   %Ableitung nach tau
 


Anschließend füge ich gceqtau an gceq dran. Soweit, so gut. wenn ich die zweite Bedingung auskommentiere kommt keine Fehlermeldung und es heißt

____________________________________________________________
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 = 8.88178e-15.

CheckGradients successfully passed.
____________________________________________________________


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.

CheckGradients successfully passed.
____________________________________________________________


Converged to an infeasible point.

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?

Wäre super wenn wer Bescheid weiß! Liebe Grüße!
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 18.520
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 19.02.2018, 14:25     Titel:
  Antworten mit Zitat      
Hallo,

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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neuling89
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 15.12.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.02.2018, 18:24     Titel: Danke
  Antworten mit Zitat      
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:

Code:


par.N = 50;   %time steps
N = par.N;
par.h = 0.002;
Theta0 = 0;
ThetaN = pi/2;

TauMax = 5000;
TauMin = -5000;

ThetaMax = pi;
ThetaMin = -pi;

options = optimoptions(@fmincon,'Algorithm','sqp','SpecifyObjectiveGradient',true,'SpecifyConstraintGradient',true, 'CheckGradients',true,'FiniteDifferenceType','central');
glg = @(x) constraints(x,par.N,par);
Jd0 = @(x) J0(x);   %Zielfunktion
% Ungleichungsbeschraenkungen
phiU = ThetaMax*ones((par.N+1)*par.Nu,1);
phiL = ThetaMin*ones((par.N+1)*par.Nu,1);
TauU = TauMax*ones((par.N+1)*par.Ntau,1);
TauL = TauMin*ones((par.N+1)*par.Ntau,1);

% Ungleichungsbeschraenkungen - Zusammenbau
ub = [phiU;TauU];
lb = [phiL;TauL];

% Startschaetzung:
u1s = [par.U0,ones(1,N) * (ThetaN - Theta0) / par.N];
Us = u1s';
Ts = ones((par.N+1),par.Ntau);
xstart = reresort(Us,Ts,par);   %setzt Us und Ts in Vektor xstart

% Optimierung
x = fmincon(Jd0,xstart,[],[],[],[],lb,ub,glg,options);
 


Und dann die constraints
Code:

function [c,ceq,gc,gceq] = constraints(x,N,par)

N = par.N;

Nu = 3;  % Dimension u
Ntau = 3;   % Dimension tau

% 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]
%----------------------------------------------------------------------------------------------------------------

% Allocation of arrays
ceq = zeros((N+1+2)*Nu,1);                      % constraints
gceq = zeros((N+1+2)*Nu,(N+1)*(Nu+Ntau));       % gradient d/du
gceqtau = zeros((N+1+2)*Nu,(N+1)*Ntau);         % gradient d/dtau

%----------------------------------------------------------------------------------------------------------------

% symbolics variables
 % displacement u
syms_u0 = sym('u0','real');                      
% initial symbolic configuration for trajectory and momentum
syms_phi = par.l * [sin(syms_u0);-cos(syms_u0);0];
syms_d1 = [cos(syms_u0);sin(syms_u0);0];
syms_d2 = [-sin(syms_u0);cos(syms_u0);0];
syms_d3 = [0;0;1];

syms_q = [syms_phi;syms_d1;syms_d2;syms_d3];     % location coordinates with minimal coordinates
F_q = matlabFunction(syms_q,'Vars',syms_u0);     % matlab function for qk

%----------------------------------------------------------------------------------------------------------------

% initial displacement and location
u0 = U(1);
q0 = F_q(theta0);

% initial actuation
tau0 = Tau(Nu:Nu);

% first constraint
ceq(1:Nu) = u0 - par.U0;
gceq(1:Nu,1:Nu) = eye(Nu);

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    


gceq(:,(N+1)*Nu+1:end) = gceqtau;

gceq = gceq.';


c = [];
gc = [];
end

 


Leider funktioniert es auch nicht mit anderen Startwerten.. Liebe Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 18.520
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 19.02.2018, 19:04     Titel:
  Antworten mit Zitat      
Hallo,

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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neuling89
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 15.12.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.02.2018, 18:11     Titel: Zu ungenau
  Antworten mit Zitat      
Hallo!

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?

Liebe Grüße!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 18.520
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 20.02.2018, 19:40     Titel:
  Antworten mit Zitat      
Hallo,

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de goPCB.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2018 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.