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

Mehrere Rückgabewerte function-function vs. vertcat

 

Karpador
Forum-Newbie

Forum-Newbie



Beiträge: 3
Anmeldedatum: 10.08.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.08.2016, 19:21     Titel: Mehrere Rückgabewerte function-function vs. vertcat
  Antworten mit Zitat      
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:

Code:
function [fx, dfx, ddfx]= myfun(x)

x1 = x(1,1); x2 = x(2,1);
fx = exp(-(x1^2+x2^2))*(x1-1)^2;
dfx = [-2*(x1^3-2*x1^2+1)*exp(-(x1^2+x2^2)),-2*((x1-1)^2)*x2*exp(-(x1^2+x2^2))];
ddfx = [-2*((x1-1)^2)*exp(-(x1^2+x2^2))+4*(x1^2)*((x1-1)^2)...
    *exp(-(x1^2+x2^2))-8*x1*(x1-1)*exp(-(x1^2+x2^2))+2*...
    exp(-(x1^2+x2^2)),4*((x1-1)^2)*x1*x2*exp(-(x1^2+x2^2))...
    -4*(x1-1)*x2*exp(-(x1^2+x2^2));...
    4*((x1-1)^2)*x1*x2*exp(-(x1^2+x2^2))...
    -4*(x1-1)*x2*exp(-(x1^2+x2^2)),4*((x1-1)^2)*(x2^2)*exp(-(x1^2+x2^2))...
    -2*((x1-1)^2)*exp(-(x1^2+x2^2))];
end


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):

Code:
function [x,fx,ef,iter] = newton_opt(f,x,cc)

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;
    if norm(xp-x)<= tole*(1+norm(xp))
        ef = 'Konvergenz d. Inputvektors'
    else
        x = xp;
       [fx, dfx] = f(x);
    end
    if norm(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" ?

Wäre um jede Hilfe dankbar,

Grüße Karpador
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

deine Vermutung ist unzutreffend. Der Fehler tritt bereits auf, wenn man die Funktion ohne Rückgabeargumente aufruft.
Code:
myfun([0;0])

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.

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

Forum-Newbie

Forum-Newbie



Beiträge: 3
Anmeldedatum: 10.08.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.08.2016, 20:43     Titel:
  Antworten mit Zitat      
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 ?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.08.2016, 22:49     Titel:
  Antworten mit Zitat      
Hallo,

ich kann nur empfehlen, Ratschläge auch umzusetzen.

Ich hab mal zwei Minuten drauf verwendet, und schon ist der Fehler weg:
Code:
ddfx = zeros(2,2);
ddfx(1,1) = -2*((x1-1)^2)*exp(-(x1^2+x2^2))+4*(x1^2)*((x1-1)^2)...
    *exp(-(x1^2+x2^2))-8*x1*(x1-1)*exp(-(x1^2+x2^2))+2*...
    exp(-(x1^2+x2^2));
ddfx(1,2) = 4*((x1-1)^2)*x1*x2*exp(-(x1^2+x2^2))...
    -4*(x1-1)*x2*exp(-(x1^2+x2^2));
ddfx(2,1) = 4*((x1-1)^2)*x1*x2*exp(-(x1^2+x2^2))...
    -4*(x1-1)*x2*exp(-(x1^2+x2^2));
ddfx(2,2) = 4*((x1-1)^2)*(x2^2)*exp(-(x1^2+x2^2))...
    -2*((x1-1)^2)*exp(-(x1^2+x2^2));


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

Forum-Newbie

Forum-Newbie



Beiträge: 3
Anmeldedatum: 10.08.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.08.2016, 23:02     Titel:
  Antworten mit Zitat      
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 Smile !
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
.





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

Hosted by:


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