Verfasst am: 07.03.2012, 20:47
Titel: Aus Funktion eine andere Funktion aufrufen
Hallo Zusammen,
Ich habe drei Verfahren erstellt welche Planetenbahnen simulieren. Zum einen mit Hilfe des Euler-Verfahrens, des Verlet-Verfahrens und Runge-Kutta.
Alle drei Verfahren sind in verschiedenen Funktionen angelegt.
Nun möchte ich eine Funktion schreiben, die mir mit Hilfe einer Varaiblen, der ich einen String zuweise auf die jeweilige Funktion (euler, verlet, runge) zugreift.
Das hatte ich zunächst so gelöst:
Code:
function aufgabe1(k,N,m,eta,flex,tmax,r0,v0,xmin,xmax,ymin,ymax,zmin,zmax)
ifstrcmp(k, 'euler')
euler(N,m,eta,flex,tmax,r0,v0,xmin,xmax,ymin,ymax,zmin,zmax);
end
ifstrcmp(k, 'verlet')
verlet(N,m,eta,flex,tmax,r0,v0,xmin,xmax,ymin,ymax,zmin,zmax);
end
ifstrcmp(k, 'runge')
runge(N,m,eta,flex,tmax,r0,v0,xmin,xmax,ymin,ymax,zmin,zmax);
end
Dies auch recht gut funktioniert, bis ich eine kleine Änderung vorgenommen habe.
Manchmal ist es von nöten, dass die einzelnen Funktionen euler, verlet... keinen Plot erstellen. Dies ist in den Funktionen so realisiert, dass man einfach die Achsengrenzen xmax, xmin etc nicht angibt.
Also im Programm mit dem "nargin" Befehl umgesetzt.
Ich dachte ich könnte dies auch im Programm aufgabe1 so umsetzten - hat leider nicht funktioniert und nun funktioniert auch aufgabe1 nichtmal mehr so, wie es oben aufgeführt ist.
Wie würdet ihr das Problem lösen?
Aus dem "handle" Befehl bin ich nicht so ganz schlau geworden.
welche Änderung hast du an dem Code vorgenommen, so dass er nicht mehr funktioniert? Und was funktioniert daran nicht? Bekommst du Fehlermeldungen? Welche?
Was spricht dagegen, in k direkt ein Function Handle zu übergeben und sich so die lästigen Fallunterscheidungen zu ersparen? Davon abgesehen, dass es dann ein Einzeiler ist und man es sich schenken kann, dafür überhaupt eine Funktion zu schreiben.
Üblicherweise sammelt man derartig viele Eingabeargumente auch in Vektoren oder Strukturen, damit die Aufrufe nicht so länglich werden.
das Problem scheint eher in der Art als in der Anzahl der Argumente zu liegen. Und es würde mich ziemlich wundern, wenn das Problem durch diese Code-Änderung entstanden ist. Arbeiten mit Handles:
Code:
k = @euler % oder @verlet oder @runge
k(N,m,eta,flex,tmax,r0,v0,xmin,xmax,ymin,ymax,zmin,zmax);
Ich hab die Konstruktion mit dem handle leider noch nicht verstanden.
aufgabe1 soll die funktion euler ja nicht als Argument nutzen, sondern sie unter bestimmten Bedingugen ausführen.
So wie du es oben beschrieben hast, wäre k eine Variable (die Funktion "euler").
Was bringt mir das aber nun?
Kannst du deine Konstruktion eventuell etwas weiter ausführen?
Was sind die Argumente von aufgabe1?
Ich hab die Konstruktion mit dem handle leider noch nicht verstanden.
Vielleicht hilft es, die Dokumentation zum Thema Function Handles zu lesen. In wenigen Worten: Ein Function Handle ist ein Verweis auf eine Funktion und ermöglicht Flexibilität bzgl. der aufzurufenden Funktion.
Zitat:
aufgabe1 soll die funktion euler ja nicht als Argument nutzen, sondern sie unter bestimmten Bedingugen ausführen.
So wie du es oben beschrieben hast, wäre k eine Variable (die Funktion "euler").
Was bringt mir das aber nun?
Probiers doch mal aus. Wenn ich mich nicht vollkommen irre, kannst du einen Aufruf von aufgabe1 durch meine beiden Zeilen ersetzen, womit es überflüssig wird, diese lästigen Fallunterscheidungen zu machen.
Zitat:
Was sind die Argumente von aufgabe1?
Die Funktion aufgabe1 ist durch die beiden Code-Zeilen überflüssig. Argumente können einfach direkt an k übergeben werden.
Grüße,
Harald
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.