WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

lsqnonlin mit Constraint-Bedingung

 

Osbor

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.11.2023, 09:53     Titel: lsqnonlin mit Constraint-Bedingung
  Antworten mit Zitat      
Hallo zusammen,

ich habe eine Optimierung mit lsqnonlin programmiert, die auch funtkioniert:

Code:

        options = optimoptions('lsqnonlin','Algorithm','trust-region-reflective','Display','none');      
       
        fun = @(x) (exp(x(1)-x(4).*x(2)) .* (u_opt) .^ x(2) .* (x(3) .* (nf_opt - n0_opt) - (nW_opt))) - fW_opt;              
        x0 = [5 0.8 1 11];
        lb = [1 0 0.5 1];
        ub = [10 1.5 1.5 30];
     
        [x, resnorm, residual, exitflag] = lsqnonlin(fun, x0, lb, ub, options, nonlcon);
 


Dabei sind u_opt, nf_opt,n0_opt,nW_opt und fW_opt Vektoren der Größe 1100x1.
Nun möchte ich gerne noch eine Nebenbedingung mit einer fünften Unbekannte x(5) implementieren. Mein Ansatz ist:

Code:

        fun = @(x) (exp(x(1)-x(4).*x(2)) .* (u_opt) .^ x(2) .* (x(3) .* (nf_opt - n0_opt) - (nW_opt))) - fW_opt;                           x0 = [5 0.8 1 11 1];
        lb = [1 0 0.5 1 -5];
        ub = [10 1.5 1.5 30 5];
       
        % Hinzufügen der Nebenbedingungen
        nonlcon = @(x) 2.*x(1) + x(5) - x(4);        
%         [x,resnorm,residual,exitflag] = lsqnonlin(fun,x0,lb,ub,options);
        [x, resnorm, residual, exitflag] = lsqnonlin(fun, x0, lb, ub, options, nonlcon);
 


Allerdings bekomme ich dann immer folgende Fehlermeldung:
Code:

Too many input arguments.

Error in lsqnonlin (line 218)
            initVals.F = feval(funfcn{3},xCurrent,varargin{:});

Caused by:
    Failure in initial objective function evaluation. LSQNONLIN cannot continue.
 


Kann mir jemand helfen, was ich hier falsch mache oder wie man eine Nebenbedingung implemntieren kann?

Besten Dank und viele Grüße
Osbor


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.449
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 14.11.2023, 11:16     Titel:
  Antworten mit Zitat      
Hallo,

wenn du nichtlineare Nebenbedingungen und Optionen übergeben willst, musst du wohl folgende Syntax verwenden:
Code:
x = lsqnonlin(fun,x0,lb,ub,A,b,Aeq,beq,nonlcon,options)

Hier können die Matrizen und Vektoren für lineare Nebenbedingungen auf [] gesetzt werden, also
Code:
x = lsqnonlin(fun,x0,lb,ub,[],[],[],[],nonlcon,options)


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Osbor

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.11.2023, 09:20     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für den Hinweis. Leider erhalte ich aber immer noch dieselbe Fehlermeldung.

Code:

Error using
@(x) (exp(x(1)-x(4).*x(2)) .* (u_opt) .^ x(2) .* (x(3) .* (nf_opt - n0_opt) - (nW_opt))) - fW_opt;
Too many input arguments.

Error in lsqnonlin (line 218)
            initVals.F = feval(funfcn{3},xCurrent,varargin{:});

Caused by:
    Failure in initial objective function evaluation. LSQNONLIN cannot continue.
 
 


Hast Du eventuell noch eine andere Idee woran es liegen könnte?

Viele Grüße
Osbor
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.449
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.11.2023, 09:40     Titel:
  Antworten mit Zitat      
Hallo,

kannst du bitte ein reproduzierbares Beispiel (d.h. insbesondere auch die beteiligten Vektoren als .mat-Datei) zur Verfügung stellen?

Beim nochmaligen Lesen ist mir aufgefallen: nonlcon sollte zwei Rückgabeargumente zurückgeben mit Gleichungen und Ungleichungen.
Zudem ist die Nebenbedingung linear. Soll es eine Gleichung oder Ungleichung sein? : Besser umgesetzt wäre es im Fall einer Gleichung dann so:
Code:
Aeq = [2 0 0 -1 1];
beq = 0;
x = lsqnonlin(fun,x0,lb,ub, [ ], [ ]  ,Aeq,beq,nonlcon,options)


Wenn x(5) ansonsten nicht vorkommst, warum errechnest du es dann nicht einfach aus den anderen Variablen?

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Osbor

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.11.2023, 10:06     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für den Hinweis. Es soll eine Gleichung sein. Ich hatte es auch schon mit Aeq und Beq versucht, das führt aber zum gleichen Fehler.
Die Nebenbedingung an der Stelle ist nur als Versuchsfall und Platzhalter gedacht und wird später durch eine kompliziertere Bedingung ersetzt. Mir ging es erstmal um die grundlegende Systematik.

Anbei die Vektoren.

Viele Grüße und besten Dank,
Osbor

u_opt.mat
 Beschreibung:

Download
 Dateiname:  u_opt.mat
 Dateigröße:  14.74 KB
 Heruntergeladen:  61 mal
nW_opt.mat
 Beschreibung:

Download
 Dateiname:  nW_opt.mat
 Dateigröße:  34.35 KB
 Heruntergeladen:  59 mal
nf_opt.mat
 Beschreibung:

Download
 Dateiname:  nf_opt.mat
 Dateigröße:  20.14 KB
 Heruntergeladen:  63 mal
n0_opt.mat
 Beschreibung:

Download
 Dateiname:  n0_opt.mat
 Dateigröße:  807 Bytes
 Heruntergeladen:  73 mal
fW_opt.mat
 Beschreibung:

Download
 Dateiname:  fW_opt.mat
 Dateigröße:  44.79 KB
 Heruntergeladen:  62 mal
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.449
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.11.2023, 13:32     Titel:
  Antworten mit Zitat      
Hallo,

folgender Code läuft bei mir unter R2023b in beiden Varianten:

options = optimoptions('lsqnonlin','Algorithm','trust-region-reflective','Display','none');

Code:
fun = @(x) (exp(x(1)-x(4).*x(2)) .* (u_opt) .^ x(2) .* (x(3) .* (nf_opt - n0_opt) - (nW_opt))) - fW_opt;
x0 = [5 0.8 1 11 0]; % 5. Anfangswert nötig
lb = [1 0 0.5 1 -5];
ub = [10 1.5 1.5 30 5];
Aeq = [2 0 0 -1 1];
beq = 0;
nonlcon = @constfun;

[x, resnorm, residual, exitflag] = lsqnonlin(fun, x0, lb, ub, [], [], [], [], nonlcon, options); % Variante a
[x, resnorm, residual, exitflag] = lsqnonlin(fun, x0, lb, ub, [], [], Aeq, beq, [], options); % Variante b


function [c, ceq] = constfun(x)

c = [];
ceq = 2.*x(1) + x(5) - x(4);
end


Neben dem schon angesprochenen Problem, dass die nichtlineare Nebenbedingungsfunktion 2 Ausgabeargumente zurückgeben muss, muss x0 entsprechend auch 5 Elemente haben.

Ich muss zugeben, ich verstehe nicht, warum du diese Fehlermeldung bekommst. Noch zwei Rückfragen:
- Welches Release verwendest du?
- Wurden, evtl. versehentlich, Änderungen in lsqnonlin.m vorgenommen? Schau mal, wann die Datei zuletzt geändert wurde. Wo die Datei liegt, findest du heraus mit
Code:


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Osbor

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.11.2023, 14:49     Titel:
  Antworten mit Zitat      
Hallo Harald,

interessant, danke. Ich verwende Release 2021a. Dort läuft der Code leider immer noch nicht.
lsqnonlin wurde auch nicht verändert.
Und auch in 2023a gibt er die Warnung:

Code:
Warning: Constraints not supported by selected algorithm. Switching algorithm to interior-point.
 


Gibt es eine Möglichkeit das im Release 2021a zum laufen zu kriegen oder muss ich dann das Release wechseln?

Viele Grüße
Osbor
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.449
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.11.2023, 16:20     Titel:
  Antworten mit Zitat      
Hallo,

die Warnung besagt "nur", dass trust-region reflective keine Nebenbedingungen unterstützt und stattdessen interior-point verwendet wird. Das finde zumindest ich jetzt aber nicht weiter schlimm.

In R2021a hat lsqnonlin noch keine Nebenbedingungen unterstützt.
Empfehlung: immer die Doku aus MATLAB heraus nutzen oder, wenn du die Online-Doku nutzt, sichergehen, dass du sie dir für das verwendete Release ansiehst.
https://www.mathworks.com/help/rele.....a/optim/ug/lsqnonlin.html

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Osbor

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.11.2023, 16:33     Titel:
  Antworten mit Zitat      
Hallo Harald,

alles klar. Vielen Dank für die Unterstützung und Hilfe.

Beste Grüße
Osbor
 
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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.