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

DGL 2.Ordnung mit str2func

 

matlabel
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 71
Anmeldedatum: 28.01.16
Wohnort: ---
Version: 2020a
     Beitrag Verfasst am: 23.02.2019, 20:42     Titel: DGL 2.Ordnung mit str2func
  Antworten mit Zitat      
Ich will als Beispiel eine SchwingungsDGL numerisch lösen.
Code:

function dy=DGL(t,y)
dy=zeros(2,1);
dy(1)=y(2);
dy(2)=-1e4*y(1)-10*y(2);

function plot_Callback(hObject, eventdata, handles)
[x0 x1 f0 f1 fx0 fsx0]=get_DGL_Params(handles);  %hier weggelassen
options=odeset('RelTol',1e-6);
[t y]=ode45(@DGL,[x0 x1],[fx0 fsx0],options);
set(handles.axes1,'XLim',[x0 x1]);
set(handles.axes1,'YLim',[f0 f1]);
plot(t,y(:,1));
 


Das funktioniert prima. Doch jetzt möchte ich für mehr Flexibilität die DGL, also gewissermaßen dy(2), vom Benutzer über einen String eingeben lassen, für den ich dann str2func aufrufe. Wie macht man so etwas?
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

du brauchst ein editierbares Textfeld, und dann kannst du dem Beispiel "Convert Character Vector to Handle to Anonymous Function" aus der Doku von str2func folgen. Wenn dann konkrete Fragen entstehen, gerne Bescheid geben.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
matlabel
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 71
Anmeldedatum: 28.01.16
Wohnort: ---
Version: 2020a
     Beitrag Verfasst am: 24.02.2019, 08:59     Titel: Verschachtelter Aufruf
  Antworten mit Zitat      
So, ich habe das nochmal etwas anders geschrieben, damit mein Problem klarer wird und das vorgeschlagene Textfeld 'Plotauswahl' zur Eingabe des Funktionsterms eingebaut.

Code:

function dy=DGL(t,y)
dy=zeros(2,1);
dy1=y(2);
%Im Textfeld Plotauswahl steht -1e4*f-10*fs
%Dabei steht fs für f'
%Hier müsste jetzt der Zugriff auf das Textfeld erfolgen, etwa so
%DGh=str2func(strcat('@(x,f,fs)',get(handles.Plotauswahl,'String'));

%Problem 1: handles ist hier nicht definiert!!
%Problem 2: Wie baut man DGh in das folgende dy2 ein??
dy2=-1e4*y(1)-10*y(2);
dy=[dy1;dy2];
 


Der Aufruf wäre unverändert
Code:

[t y]=ode45(@DGL,[x0 x1],[fx0 fsx0],options);
 


Mein Problem liegt hauptsächlich darin, dass hier eine Verschachtelung der Aufrufe erfolgt. Wie löst man das?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

handles kannst du mit übergeben, siehe hier:
https://de.mathworks.com/help/matla.....meterizing-functions.html
Was die Performance angeht, dürfte es aber besser sein, das Function Handle außerhalb zu konstruieren und das Function Handle an DGL zu übergeben.

Mit strrep kannst du zuerst fs und dann f wie gewünscht ersetzen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
matlabel
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 71
Anmeldedatum: 28.01.16
Wohnort: ---
Version: 2020a
     Beitrag Verfasst am: 24.02.2019, 14:00     Titel:
  Antworten mit Zitat      
Harald, trotz deiner Tipps (Dank dafür) bekomme ich es immer noch nicht hin, weil ich die Handles nicht einbeziehen kann. Das mit dem Ersetzen ist dabei für mich das kleinste Problem.
Mein momentaner Stand:

Code:

function DGL_handle=str_func(handles)
%auslesen der DGL aus dem Textfeld
 DGL=get_act_DGL(handles); % (funktioniert)
 DGL_str=concat('@(x,f,fs)',DGL);
 DGL_handle=str2func(DGL_str);

function dy=DGL(t,y)
dy=zeros(2,1);
dy1=y(2);
%dy2='-1e4*f-1*fs'  ????? dy2=..
dy=[dy1;dy2];
 


Der Aufruf soll bleiben
Code:

[t y]=ode45(@DGL,[x0 x1],[fx0 fsx0],options);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

der Aufruf sollte angepasst werden:
Code:
eintrag = get(handles.Plotauswahl,'String');
eintrag = strrep(eintrag, 'fs', 'y(2)');
eintrag = strrep(eintrag, 'f', 'y(1)');
fh = str2func(['@(t,y) ' eintrag]);
[t y]=ode45(@(t,y) DGL(t,y, fh),[x0 x1],[fx0 fsx0],options);


Die Funktion sieht dann so aus:
Code:
function dy=DGL(t,y, fh)
dy=zeros(2,1);
dy(1)=y(2);
dy(2)= fh(t,y);


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
matlabel
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 71
Anmeldedatum: 28.01.16
Wohnort: ---
Version: 2020a
     Beitrag Verfasst am: 25.02.2019, 09:27     Titel: funktioniert
  Antworten mit Zitat      
Smile Danke, Harald, das klappt wunderbar!
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.