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

Testfunktion zum Lösen von ODEs

 

Chefkoch

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.12.2013, 00:31     Titel:
  Antworten mit Zitat      
Super, so sieht das ganze schon besser aus.

Ich habe mich am Wochenende ein wenig mit GUIs beschäftigt. Ich würde das jetzt gerne über ein GUI eingeben lassen können.

Das heißt ich habe folgende Bauseteine

1 x listbox - zur Auswahl der verschiedenen solver
3 x edit text - zur Eingabe des Namens einer bereits hinterlegten DGL, sowie die Eingabe von timespan und start

Ich habe dafür mal die verschiedenen Callback Funktionen erstellt.

Callback der solver:
Code:
solvers = get(hObject,'String');

handles.data.solvers = solvers

guidata(hObject, handles);



Callback der Funktion:
Code:
func= get(hObject,'String');

handles.data.func= func;

guidata(hObject, handles);



Callback der Anfangswerte:
Code:
init= get(hObject,'Value');

handles.data.init= init;

guidata(hObject, handles);



Callback des Zeitfensters
Code:
timespan= get(hObject,'Value');

handles.data.timespan= timespan;

guidata(hObject, handles);



Sind damit nun alle für die Funktion zu übergebenden Parameter bekannt?
Dann könnte ich doch durch den Aufruf von:

Code:
[results] = test(solvers, func, timespan, init)


die Lösung berechnen? Außerdem würde ich die Lösung gerne erst berechnen lassen, sobald man auf einen PushButton drückt.
Das funktioniert leider noch nicht so ganz, führe ich die GUI aus (im Moment noch ohne PushButton) erhalte ich die Fehlermeldung:

Undefined variable "handles" or class "handles.data.solvers".

Wo liegt mein Fehler?


Viele Grüße


Harald
Forum-Meister

Forum-Meister


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

bitte poste die Dateien (.m und .fig) hierzu.

Die entscheidende Frage ist: wo rufst du test auf?

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.12.2013, 18:22     Titel:
  Antworten mit Zitat      
Hallo,

anbei mein bisheriger Ansatz.
Ich rufe die Funktion Test im Moment im Callback des Pushbuttons auf.


Viele Grüße

funcgui.m
 Beschreibung:

Download
 Dateiname:  funcgui.m
 Dateigröße:  7.31 KB
 Heruntergeladen:  210 mal
funcgui.fig
 Beschreibung:

Download
 Dateiname:  funcgui.fig
 Dateigröße:  3.36 KB
 Heruntergeladen:  193 mal
 
Harald
Forum-Meister

Forum-Meister


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

du musst die Informationen schon aus der Handles-Struktur herausholen, z.B. so:
Code:
[results] = test(handles.data.solvers, ...
    handles.data.func, ...
    handles.data.timespan, ...
    handles.data.init)


Dann muss auch sichergestellt werden, dass die Informationen wirklich gesetzt worden sind - also entweder muss das in die OpeningFcn oder anderweitig sichergestellt werden.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.12.2013, 23:33     Titel:
  Antworten mit Zitat      
Ok, aber wie setze man diese? Werden dafür einfach die handles in der Openingfcn aufgerufen?

Code:
handles.data.solvers
handles.data.timespan
handles.data.init
handles.data.func




Viele Grüße
 
Harald
Forum-Meister

Forum-Meister


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

genauso wie du sie auch in den anderen Funktionen gesetzt hast. Nur will man üblicherweise sicherstellen, dass die Informationen auch bereitgestellt werden, ohne dass vorher andere Eingaben gemacht werden.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.12.2013, 23:43     Titel:
  Antworten mit Zitat      
OK ich hab das jetzt in die openingFcn eingefügt, erhalte jetzt diese Fehlermeldung. Irgendwie ist mir das mit dem GUI noch nicht ganz geheuer. Crying or Very sad


Reference to non-existent field 'data'.

Error in funcgui>funcgui_OpeningFcn (line 60)
handles.data.solvers;
 
Harald
Forum-Meister

Forum-Meister


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

ja, was soll diese Zeile denn bezwecken? Da wird ja nichts zugewiesen.

Bevor du ein Feld abfragen kannst, muss es zugewiesen werden:

Code:
handles.data.solvers = ...


Konsequent an die Doku halten, und es sollte klappen:
http://www.mathworks.de/de/help/mat.....-guide-gui.html#f5-998711

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.12.2013, 11:54     Titel:
  Antworten mit Zitat      
Hallo nochmal,

ich habe mich nochmal mit dem Thema befasst und bin auch etwas vorangekommen. Ich kann jetzt die Daten für die Funktion, Anfganswerte und Zeitbereich angeben und diese werden auch ausgegeben.
Auch das mit der Auswahl der solver funktioniert.

Leider erhalte ich beim drücken des Buttons noch eine Fehlermeldung.

Indexing cannot yield multiple results.

Error in test (line Cool
[t,y] = odefun(func, timespan, init);


Mein Button Callback sieht wie folgt aus:

Code:
[results] = test(handles.solvers, handles.func, handles.timespan, handles.init)




Setze ich ein @ vor handles.solvers und handles.func so erhalte ich folgende Fehlermeldung:

Cell contents reference from a non-cell array object.

Error in test (line 7)
odefun = solvers{I};


Was stimmt nicht? Ich lade anbei meine entsprechenden Dateien mit hoch.

Besten Dank!


Viele Grüße

funcgui.m
 Beschreibung:

Download
 Dateiname:  funcgui.m
 Dateigröße:  7.97 KB
 Heruntergeladen:  208 mal
Funktion1_Skript.m
 Beschreibung:
Lösung der Funktion mit Plot

Download
 Dateiname:  Funktion1_Skript.m
 Dateigröße:  169 Bytes
 Heruntergeladen:  195 mal
Funktion1.m
 Beschreibung:
zu lösende Funktion

Download
 Dateiname:  Funktion1.m
 Dateigröße:  66 Bytes
 Heruntergeladen:  189 mal
dgltest.m
 Beschreibung:
Aufruf von test mit Parametern

Download
 Dateiname:  dgltest.m
 Dateigröße:  139 Bytes
 Heruntergeladen:  198 mal
test.m
 Beschreibung:
Funktion zum Lösen der DGL

Download
 Dateiname:  test.m
 Dateigröße:  348 Bytes
 Heruntergeladen:  209 mal
 
Chefkoch

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.12.2013, 11:57     Titel:
  Antworten mit Zitat      
Oh das .fig File fehlt noch

funcgui.fig
 Beschreibung:

Download
 Dateiname:  funcgui.fig
 Dateigröße:  3.37 KB
 Heruntergeladen:  183 mal
 
Harald
Forum-Meister

Forum-Meister


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

die Initialisierung des Solvers sollte so lauten:
Code:
handles.solvers = {'ode23'}; % Zeile 60 von funcgui.m

Das ist dann konsistent damit, wenn eine Auswahl getroffen wird.

Desweiteren ist die Auswahl des Solvers ein String bzw. ein Cell Array von Strings, du brauchst aber ein Function Handle --> da hilft str2func:
Code:
       odefun = str2func(solvers{I}); % Zeile 7 von test.m


Das Problem sollte sich aber im Debugger zumindest leicht erkennen lassen.

Bitte bei so vielen einzelnen Dateien alles zippen und dann das .zip hochladen.

An der Nutzbarkeit der GUI kann man übrigens noch arbeiten. Das ist sonst ein Ratespiel für unwissende, wie die Funktion und das Zeitintervall eingegeben werden müssen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite Zurück  1, 2

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.