Verfasst am: 10.08.2016, 19:21
Titel: Mehrere Rückgabewerte function-function vs. vertcat
Guten Tag,
ich bin ein Matlab-Neuling und hänge an folgendem Problem fest:
Selbstdefinierte Funktionen, die mehrere Funktionswerte zurückgeben sollen,
also etwa function [a,b,c]=myfun(e,f,d) , tun dies nicht. Konkreter Fall:
Eine Funktion liest einen 2x1 Inputvektor x ein, und gibt einen einzelnen Funktionswert fx, sowie die beiden Ableitungen dfx und die 2x2 Hessematrix ddfx an der Stelle x an:
Nun ist diese Funktion myfun selbst ein function-handle f einer Funktion, die (optimalerweise; andere Fehler der Funktion tun gerade nichts zur Sache) das Newton-Raphton-Verfahren anwendet, wobei die (Input)Vektoren x und cc bereits gegeben sind (d.h im workspace sind):
tole = cc(1,1); told = cc(2,1); maxiter = cc(3,1); ef = 0;
for j1 = 1:maxiter
[fx, dfx, ddfx] = f(x);
xp = x + ddfx\dfx;
ifnorm(xp-x)<= tole*(1+norm(xp))
ef = 'Konvergenz d. Inputvektors'
else
x = xp;
[fx, dfx] = f(x);
end ifnorm(dfx)<=told*(1+abs(fx)) if ef == 'Konvergenz d. Inputvektors'
ef = 'Konvergenz v. Inputvektors & d. Funktionswerte'
iter = j1
break elseif ef ~= 'Konvergenz d. Inputvektors'
ef = 'Konvergenz d. Funktionswerte'
iter = j1
break end else if ef == 'Konvergenz d. Inputvektors'
ef == 'Scheinkonvergenz'
break end end end
Ausführen der Funktion newton_opt(Newton-Raphton-Verfahren) gibt folgende Fehlermeldung wieder:
>> [x,fx,ef,iter] = newton_opt(@myfun,x0,cc);
Error using vertcat
Dimensions of matrices being concatenated are not consistent.
Error in myfun (line 6)
ddfx = [-2*((x1-1)^2)*exp(-(x1^2+x2^2))+4*(x1^2)*((x1-1)^2)...
Error in newton_opt (line 5)
[fx, dfx, ddfx] = f(x);
Was ich also vermute ist Folgendes: der Ausdruck [fx, dfx, ddfx] =f(x); innerhalb der Funktion newton_opt wird fälschlicherweise als die Absicht, eine (einzige) Matrix aus fx, dfx und ddfx per vertcat zu erstellen, interpretiert. Dies aber soll nicht so sein, sondern fx, dfx und ddfx sind der standardmäßige Rückgabewert plus zwei optionale Rückgabewerte, die durch Setzung in [] auch separat, d.h als drei Variablen, verlangt werden...
Wie bekomme ich nun eben das hin: drei separate Werte, anstatt einer (ohnehin sinnlosen) "Verbundmatrix" ?
Irgendwo in dieser Endloszeile ist ein Fehler. Mein Vorschlag wäre, diese Zeile in mehrere Zeilen aufzuspalten, um das Problem einzugrenzen, z.B. jedes Element von ddfx separat zu erstellen.
Übrigens: mit symbolischen Variablen kannst du Ableitungen auch symbolisch berechnen lassen.
Vielen Dank für die Antwort und den Hinweis! Werde mir syms ein wenig anschauen.
Tja, dann heißt es nun, den Fehler finden :/
Dabei habe ich das schon 10 Mal geprüft
Gruß,
Karpador
PS: ddfx ist geprüft und dort dürfte kein Fehler drinn sein (habe die Formeln innerhalb der Matrixdefinition per copy & paste in Wolfram Alpha eingefügt. Wolfram erkennt die einzelnen Elemente problemlos. Auch auf etwaige Leerstellen habe ich geprüft, sodass also eine versehentlich verlängerte Zeile ausgeschlossen werden kann. ; und , sind auch richtig gesetzt...
Kann es an einem anderen Fehler der myfun liegen ?
Ah, okay so meintest du das mit dem separat erstellen. Macht natürlich Sinn. Ich bin nicht auf die Idee gekommen, dass man die Aufteilung ja auch innerhalb von Matlab vornehmen kann, danke dir nochmal und einen schönen Abend noch !
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.