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

Aus Funktion eine andere Funktion aufrufen

 

madde
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 07.03.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.03.2012, 20:47     Titel: Aus Funktion eine andere Funktion aufrufen
  Antworten mit Zitat      
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)

if strcmp(k, 'euler')
    euler(N,m,eta,flex,tmax,r0,v0,xmin,xmax,ymin,ymax,zmin,zmax);
end

if strcmp(k, 'verlet')
    verlet(N,m,eta,flex,tmax,r0,v0,xmin,xmax,ymin,ymax,zmin,zmax);
end

if strcmp(k, 'runge')
    runge(N,m,eta,flex,tmax,r0,v0,xmin,xmax,ymin,ymax,zmin,zmax);
end

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.

Vielen Dank für die Unterstützung.
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.03.2012, 21:03     Titel:
  Antworten mit Zitat      
Hallo,

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.

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

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 07.03.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.03.2012, 21:24     Titel:
  Antworten mit Zitat      
geändert sah die Funktion so aus:

Code:
function aufgabe1(k,N,m,eta,flex,tmax,r0,v0,xmin,xmax,ymin,ymax,zmin,zmax)

if nargin == 14
    if strcmp(k, 'euler')
        euler(N,m,eta,flex,tmax,r0,v0,xmin,xmax,ymin,ymax,zmin,zmax);
    end

    if strcmp(k, 'verlet')
        verlet(N,m,eta,flex,tmax,r0,v0,xmin,xmax,ymin,ymax,zmin,zmax);
    end

    if strcmp(k, 'runge')
        runge(N,m,eta,flex,tmax,r0,v0,xmin,xmax,ymin,ymax,zmin,zmax);
    end
end

if nargin ~= 14
    if strcmp(k, 'euler')
        euler(N,m,eta,flex,tmax,r0,v0);
    end

    if strcmp(k, 'verlet')
        verlet(N,m,eta,flex,tmax,r0,v0);
    end

    if strcmp(k, 'runge')
        runge(N,m,eta,flex,tmax,r0,v0);
    end
end

end


der Teil unter nargin ~=14 hat dann auch funktioniert, allerdings der obere Teil nicht mehr.

Fehlermeldung sah so aus:

Code:

Error using set
Bad property value found.
Object Name :  axes
Property Name : 'XLim'
Values must be increasing and non-NaN.

Error in axis>LocSetLimits (line 208)
    set(ax,...

Error in axis (line 94)
                LocSetLimits(ax(j),cur_arg);

Error in euler (line 31)
    axis([xmin xmax ymin ymax zmin zmax]);

Error in aufgabe1 (line 4)
    euler(N,m,eta,flex,tmax,r0,v0,xmin,xmax,ymin,ymax,zmin,zmax);
 


Wie würde denn der Einzeiler mit Hilfe von "handle" aussehen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.03.2012, 21:53     Titel:
  Antworten mit Zitat      
Hallo,

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


Wenn du das mit weniger Argumenten aufrufen willst, übergibst du einfach entsprechend weniger.

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

Forum-Newbie

Forum-Newbie


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

Forum-Meister


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

Zitat:
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
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 - 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.