Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   
Bücher:

Fachkräfte:
weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Kostenfunktional Fminunc

 

Daniel_1904

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.06.2019, 13:03     Titel: Kostenfunktional Fminunc
  Antworten mit Zitat      
Hallo Very Happy
zurzeit komme ich in einem Studiprojekt mit einem Kostenfunktional nicht weiter (Aufgabe 5-Anhang)
Könnte jemand mal drüberschauen, ob die Codes soweit stimmen und was ich falsch mache?
Mein Code "opti" gibt jedes mal die Fehlermeldung , zu wenig Inputargumente.

ins Befehlfenster gebe ich ein k=fminunc(opti,x0)
Da bekomm ich auch nur die Fehlermeldung, zu wenig Inputargumente und Fehler bei opti.
Hab ich da einen Denkfehler? Bin nur leihenhaft in matlab bewandert.
Danke im Voraus Smile

Code:
function J=opti(k)
tspan=[0 10];
x0=[5;0;0;0;0;0];
[x]=ode45(@(x) DLG2(x,k),tspan,x0);
J=x(end,6);


Code:
function dx=DLG2(x,k)
A=[0,0,1,0,0;0,0,0,1,0;-50,50,-5,5,-20;25,-25,2,-2,0;-600,0,20,0,-3];
b=[0;0;0;0;-1.5];
dx=A*x+b*(-k*x);
dx=[dx;x(2)^2];
end
 


Aufgabenstellung_Magnetschwebebahn.pdf
 Beschreibung:

Download
 Dateiname:  Aufgabenstellung_Magnetschwebebahn.pdf
 Dateigröße:  144.2 KB
 Heruntergeladen:  13 mal


Harald
Forum-Meister

Forum-Meister


Beiträge: 20.222
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 24.06.2019, 17:26     Titel:
  Antworten mit Zitat      
Hallo,

ein Problem: ode45 braucht ein Function Handle mit 2 Inputs und sollte auch mit min. 2 Rückgabeargumenten aufgerufen werden, siehe Doku von ode45
Code:
[t,x]=ode45(@(t,x) DLG2(x,k),tspan,x0);


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
 
Daniel1904

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.06.2019, 07:44     Titel: Angepasst
  Antworten mit Zitat      
Hi
Danke für die Hilfe! Hab den Code mal abgeändert aber er spuckt leider immer noch dieselbe Fehlermeldung raus. :/
Es scheint irgendwie auch ein Problem zu sein, das k zu bestimmen.
LG
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 20.222
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 25.06.2019, 09:42     Titel:
  Antworten mit Zitat      
Hallo,

beim Aufruf musst du ein Function Handle angeben:
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
 
Daniel_1904

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.06.2019, 14:27     Titel: Antw.
  Antworten mit Zitat      
Hallo Harald

Gebe ich das Function handle ins Befehlsfenster ein, oder muss ich dafür ein neues "Skript" dafür erstellen? Im Befehlsfenster hatte es bisher nicht funktioniert.
LG Daniel
 
Harald
Forum-Meister

Forum-Meister


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

du kannst den Befehl wie angegeben ins Command Window eingeben.

Zitat:
Im Befehlsfenster hatte es bisher nicht funktioniert.

Bitte die genaue Fehlermeldung angeben. Ohne das @ kann es nicht funktionieren.

Ein Problem, auf das ich nach Umsetzen meiner Vorschläge stoße: A ist eine 5x5-Matrix, x0 aber ein 6x1-Vektor. Das passt nicht zusammen.

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
 
Daniel_1904

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.06.2019, 16:29     Titel: Antw.
  Antworten mit Zitat      
Hi

x0 war ein älterer Fehler, den hab ich bereits schon verbessert Smile

wenn ich den handle :
Code:
>> k=fminunc(@opti,x0)
ins Befehlfenster gebe, kommt erst die Meldung:
Code:
undefined x0
.
Wenn ich x0 separat eingebe, kommt diese Fehlermeldung bei erneutem Problem:
Code:
Error using feval
Undefined function 'opti' for input arguments of type 'double'.

Error in fminunc (line 253)
        f = feval(funfcn{3},x,varargin{:});

Caused by:
    Failure in initial user-supplied objective function evaluation. FMINUNC cannot continue.


Gruß
Daniel
 
Daniel_1904

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.06.2019, 16:33     Titel: Re: Antw.
  Antworten mit Zitat      
Daniel_1904 hat Folgendes geschrieben:
Hi

x0 war ein älterer Fehler, den hab ich bereits schon verbessert Smile

wenn ich den handle :
Code:
>> k=fminunc(@opti,x0)
ins Befehlfenster gebe, kommt erst die Meldung:
Code:
undefined x0
.
Wenn ich x0 separat eingebe, kommt diese Fehlermeldung bei erneutem Problem:

....


Tscchuldige, war außerhalb des Ordners. Das ist die Fehlermeldung:

Code:
Error using  *
Inner matrix dimensions must agree.

Error in DLG2 (line 4)
dx=A*x+b*(-k*x);

Error in opti>@(t,x)DLG2(x,k) (line 4)
[t,x]=ode45(@(t,x) DLG2(x,k),tspan,x0);

Error in odearguments (line 87)
f0 = feval(ode,t0,y0,args{:});   % ODE15I sets args{1} to yp0.

Error in ode45 (line 113)
[neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...

Error in opti (line 4)
[t,x]=ode45(@(t,x) DLG2(x,k),tspan,x0);

Error in fminunc (line 253)
        f = feval(funfcn{3},x,varargin{:});

Caused by:
    Failure in initial user-supplied objective function evaluation. FMINUNC cannot continue.
 
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 20.222
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 25.06.2019, 16:46     Titel:
  Antworten mit Zitat      
Hallo,

die Erklärung dafür habe ich dir oben bereits gegeben:
Zitat:
A ist eine 5x5-Matrix, x0 aber ein 6x1-Vektor. Das passt nicht zusammen.

Mit dem Debugger kannst du solche Fehler auch wunderbar selbst aufspüren.

Bei Veränderungen bitte auch den aktuellen Code posten, sonst kann man das momentane Problem nicht nachvollziehen.

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
 
Daniel_1904

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.06.2019, 17:22     Titel: Antw.
  Antworten mit Zitat      
Hallo Harald,

Mein aktueller code:

Code:
function J=opti(k)
tspan=[0 10];
x0=[5;0;0;0;0];
[t,x]=ode45(@(t,x) DLG2(x,k),tspan,x0);
J=x(end,6);


Code:
function dx=DLG2(x,k)
A=[0,0,1,0,0;0,0,0,1,0;-50,50,-5,5,-20;25,-25,2,-2,0;-600,0,20,0,-3];
b=[0;0;0;0;-1.5];
dx=A*x+b*(-k*x);
dx=[dx;x(2)^2];
end
 


Un der Befehl:
Code:
>> k=fminunc(@opti,x0)


Ich habe im aktuellen Code keine Matrixdimensionsfehler finden können.
Trotzdem bekomm ich dieselbe Fehlermeldung.

Was mir von Matlab angezeigt wird, ist lediglich das:
Code:
[t,x]=ode45(@(t,x) DLG2(x,k),tspan,x0);

Line 4: t might be unused

Danke für deine Hilfe Smile

Gruß Daniel
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Ich habe im aktuellen Code keine Matrixdimensionsfehler finden können.

Hast du denn den Debugger verwendet?

Wenn das eine * nicht fehlerhaft ist, dann vielleicht das andere in derselben Zeile? Sollten b und x nicht eher komponentenweise, also mit .* multipliziert werden?

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
 
Daniel_1904

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.06.2019, 18:33     Titel: Antw.
  Antworten mit Zitat      
Hallo Harald,

ich habe den code
Code:
dx=A*x+b*(-k*x);
bereits in den Aufgaben verwendet und es hat alles funktioniert. Denke mal nicht, dass hier eine komponentweise Multiplikation angewendet werden soll. Hab es zwar getestet ob sich etwas ändert, aber es kam leider nichts anderes dabei heraus.

Ich muss gestehen, dass ich den Debugger bisher nur einmal erklärt bekommen habe und ihn noch nie nutzen musste. Ich hab grad versucht mithilfe eines Tutorials zum Debugger an die vierte Zeile bei opti heranzugehen, verstehe aber leider nicht, was das Programm mir sagen möchte. Confused Lediglich das kommt immer
Code:
Error using opti (line 4)
Not enough input arguments.

Es wird ein weiteres Fenster geöffnet, wenn ich weiter gehen, mit dem Namen fminunc.m an der Stelle:
Code:
catch userFcn_ME
        optim_ME = MException('optim:fminunc:ObjectiveError', ...
            getString(message('optim:fminunc:ObjectiveError')));
        userFcn_ME = addCause(userFcn_ME,optim_ME);
        rethrow(userFcn_ME)
    end

(Den ganzen code der sich öffnet zu posten würde den Rahmen sprengen)

LG Daniel
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
bereits in den Aufgaben verwendet und es hat alles funktioniert.

Auch mit b und x als 5x1-Vektoren? Das wäre extrem verwunderlich.

Zitat:
Denke mal nicht, dass hier eine komponentweise Multiplikation angewendet werden soll.

Ich denke schon. ;)

Zitat:
Ich muss gestehen, dass ich den Debugger bisher nur einmal erklärt bekommen habe und ihn noch nie nutzen musste.

Dann würde ich dringend empfehlen, dass du dich genauer damit auseinander setzt. Aus eigener Erfahrung kann ich sagen, dass man so nicht nur die eigenen Fehler, sondern sogar die anderer findet. :)

Zitat:
Ich hab grad versucht mithilfe eines Tutorials zum Debugger an die vierte Zeile bei opti heranzugehen

Du hast wohl einen Haltepunkt gesetzt? Hast du dann auch wirklich den Code wieder aus dem Command Window ausgeführt? In opti.m auf "Run" zu drücken ist nicht sinnvoll, weil die Funktion ja Inputs benötigt.

Um es abzukürzen: mit .* ist das eine Problem gelöst. Dann gab es noch Probleme damit, dass du J in der DGL nicht konsequent mitgezogen hast. Nun sieht es so aus:
Code:
function J=opti(k)
tspan=[0 10];
x0=[5;0;0;0;0;0]; % J(0) = 0 als 6. Anfangswert?
[t,x]=ode45(@(t,x) DLG2(x,k),tspan,x0);
J=x(end,6);


function dx=DLG2(x,k)
A=[0,0,1,0,0;0,0,0,1,0;-50,50,-5,5,-20;25,-25,2,-2,0;-600,0,20,0,-3];
b=[0;0;0;0;-1.5];
dx=A*x(1:end-1)+b.*(-k.*x(1:end-1)); % 1:end-1 weil J nicht berücksichtigt werden soll
dx=[dx;x(2)^2];


Dann läuft der Code zumindest durch. Allerdings gibt es ja nach Startwert unterschiedliche Lösungen. Du musst also einen ausreichend guten Startwert für k angeben.

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
 
Daniel_1904

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.06.2019, 21:10     Titel: Antw.
  Antworten mit Zitat      
Hallo Harald,
danke für deine Mühen! Smile

Ich werde mich mal in den Debugger mal mehr reinarbeiten xD
Danke für den Tipp!

Ich hab mal deinen Code kopiert und getestet, aber es funktioniert leider immer noch nicht. Ich weiß nicht warum es bei dir klappt und bei mir nicht ^^
Ich werde morgen mich nochmals da dransetzen und es nochmals austesten.

Vielen Dank dir Cool
Gruß Daniel
 
Daniel_1904

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.06.2019, 09:49     Titel: Lösung
  Antworten mit Zitat      
Hallo Harald,
kleines Update
Um das Thema abzuschließen:
Die Vektoren dürfen nicht komponentenweise multipliziert werden und in der Eingabe muss man statt x0, das Anfangs - k nehmen.

Code:
function dx=DLG2(x,k)
A=[0,0,1,0,0;0,0,0,1,0;-50,50,-5,5,-20;25,-25,2,-2,0;-600,0,20,0,-3];
b=[0;0;0;0;-1.5];
dx=A*x(1:end-1)+b*(-k*x(1:end-1));  
dx=[dx;x(2)^2];
 


Code:
function J=opti(k)
tspan=[0 10];
x0=[5;0;0;0;0;0]; % J(0) = 0 als 6. Anfangswert?
[t,x]=ode45(@(t,x) DLG2(x,k),tspan,x0);
J=x(end,6);
 


Code:
>> k=fminunc(@opti,(1000,100,10,10,-100))


Damit funktioniert der Code korrekt.
Vielen Dank nochmal, dass du mir soweit geholfen hast Very Happy
Gruß Daniel
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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


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


Copyright © 2007 - 2019 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.