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

If-Bedingung

 

Jay98

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.01.2017, 18:38     Titel: If-Bedingung
  Antworten mit Zitat      
Hallo zusammen!
Ich habe eine etwas komplizierterer Frage (für meine Verhältnisse als Matlab-Anfänger) und zwar:

Wie muss ich das mit if und else eingeben, dass das klappt?
Code:

function dxdt=f(x,t,m,r1,r2,VR1,VR2,KM,Kv,Ps,P0,l)
dxdt = zeros(4,1);


dxdt(1) = x(2);
A1=(r1^2)*pi;                                      %Fläche A1
A2=A1-(r2^2)*pi;                                   %Fläche A2

dxdt(2) = 1/m*(x(3)*A1-x(4)*A2);                   %Beschleunigung

if x(3)>0

Q11=(abs((Ps-x(3))/Kv))^(1/2)*sin(2*pi*t+0.1);     %Volumenstrom Q11
dxdt(3) = KM/(A1*(l+x(1))+VR1)*(Q11-x(2)*A1);      %p1'

Q22=(abs((x(4)-P0)/Kv))^(1/2)*sin(2*pi*t+0.1);     %Volumenstrom Q22
dxdt(4) = KM/(VR2-A2*(l-x(1)))*(x(2)*A2-Q22);      %p2'

else

Q11=(abs((Ps-x(4))/Kv))^(1/2)*sin(2*pi*t+0.1);     %Volumenstrom Q11
dxdt(3) = KM/(A1*(l+x(1))+VR1)*(Q11-x(2)*A1);      %p1'

Q22=(abs((x(3)-P0)/Kv))^(1/2)*sin(2*pi*t+0.1);     %Volumenstrom Q22
dxdt(4) = KM/(VR2-A2*(l-x(1)))*(x(2)*A2-Q22);      %p2'    

end


Ich kenne mich wirklich kaum aus und würde mich sehr freuen, wenn mir jemand helfen könnte!

Mit freundlichen Grüßen Jay98

[EDITED, Jan, Bitte Code-Umgebung verwenden - Danke!]


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 05.01.2017, 21:00     Titel: Re: If-Bedingung
  Antworten mit Zitat      
Hallo Jay98,

Ich habe Deinen Code bereinigt.

Was bedeutet denn "dass das klappt"? Was klappt denn nicht? Und was soll wie geändert werden?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Jay98

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.01.2017, 21:58     Titel:
  Antworten mit Zitat      
Hallo Jan,
danke vielmals fürs bereinigen!

Wenn ich dieses System mit ode23s oder mit anderen Solvern lösen möchte, dauert das Berechnen ewig beziehungsweise funktioniert es garnicht Sad
Mit freundlichen Grüßen Jay98
 
Harald
Forum-Meister

Forum-Meister


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

du musst uns schon ein wenig dabei helfen, dir zu helfen.

Zitat:
Wenn ich dieses System mit ode23s oder mit anderen Solvern lösen möchte

Woher sollten wir erahnen, dass du das möchtest?!

Zitat:
dauert das Berechnen ewig beziehungsweise funktioniert es garnicht

Du hast zuvor geschrieben, dass es nicht klappt - und jetzt, dass es nicht funktioniert. Was funktioniert nicht? Wenn du eine Fehlermeldung bekommst, dann poste sie doch bitte.

Poste bitte außerdem den Aufruf, den du für das Lösen der DGL verwendest, und das bitte inkl. der verwendeten Parameter und Startwerte.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.01.2017, 11:10     Titel:
  Antworten mit Zitat      
Hallo,

es tut mir wirklich leid, ihr seht ja, ich kenne mir wirklich kaum aus und wusste daher nicht, was ihr alles braucht um mir zu helfen.

Mein Ausgangs-f.m-File lautet:

Code:
function dxdt=f(x,t,m,r1,r2,VR1,VR2,KM,Kv,Ps,P0,l)
dxdt = zeros(4,1);

x(x(3)<0)=0;
x(x(4)<0)=0;

dxdt(1) = x(2);
A1=(r1^2)*pi;                                      %Fläche A1
A2=A1-(r2^2)*pi;                                   %Fläche A2

dxdt(2) = 1/m*(x(3)*A1-x(4)*A2);                   %Beschleunigung


Q11=(abs((Ps-x(3))/Kv))^(1/2)*sin(2*pi*t+0.1);     %Volumenstrom Q11
dxdt(3) = KM/(A1*(l+x(1))+VR1)*(Q11-x(2)*A1);      %p1'

Q22=(abs((x(4)-P0)/Kv))^(1/2)*sin(2*pi*t+0.1);     %Volumenstrom Q22
dxdt(4) = KM/(VR2-A2*(l-x(1)))*(x(2)*A2-Q22);      %p2'

Meine Parameter:

KM=  1.5000e+09;
Kv=   5.6700e+12;
l=      0.3;
m=    300;
P0=   100000;
Ps=   5500000;
r1=    0.03;
r2=    0.02;
VR1= 0.0065;
VR2= 0.0042;

Mein Aufruf zum Lösen der DGL:

[t,x]=ode23s(@(t,x)f(x,t,m,r1,r2,VR1,VR2,KM,Kv,Ps,P0,l),[0,5],[0,0,18e5,34e5]);

Nun möchte ich, dass wenn x(3)<=0 ist, die Formel für Q11 nicht mehr
Q11=(abs((Ps-x(3))/Kv))^(1/2)*sin(2*pi*t+0.1); lautet sondern
Q11=(abs((Ps-x(4))/Kv))^(1/2)*sin(2*pi*t+0.1);

und das gleiche gilt für Q22 bei x(3)<=0 soll die Formel nicht mehr
Q22=(abs((x(4)-P0)/Kv))^(1/2)*sin(2*pi*t+0.1); lauten sondern
Q22=(abs((x(3)-P0)/Kv))^(1/2)*sin(2*pi*t+0.1);


Ich hoffe ihr könnt mir nun helfen und ich möchte mich nochmals entschuldigen.

Mit freundlichen Grüßen Jay98

[EDITED, Jan, Bitte Code-Umgebung verwenden - Danke!]
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 07.01.2017, 02:00     Titel:
  Antworten mit Zitat      
Hallo Jay98,

Du brauchst Dich nicht zu entschuldigen. Es ist alles in Ordnung. Fragen zu Matlab sind hier immer willkommen. Wir versuchen mit dem Nachbohren nur das Problem einzugrenzen, damit wir der Lösung näher kommen.

Ich habe übrigens wieder Deinen Code bereinigt. Bitte verwende die Code-Umgebung für Code: Markiere den Code und drücke die "[Code]"-Taste. Dann ist er besser lesbar und die Befehle werden automatisch mit den Hilfetexten verlinkt.

Matlab's ODE-Integratoren benötigen glatte Funktionen, da andernfalls das Verhalten nicht mehr definiert ist. Vielleicht werden die Ergebnisse ziemlich falsch oder der Integrator bleibt mit einer Fehlermeldung stecken.
Grundsätzlich sind deshalb alle unstetigen Funktionen in den zu integrierenden Funktionen verboten: <, >, abs , (tan mit Einschränkungen), if , [code]clock[/code], usw.

Wenn Du bei x(3)==0 etwas ändern willst, eignet sich dafür eine Event-Funktion: Der Integrator erkennt dann diese Grenze und bricht die Integration ab. Man ruft ihn dann in einer Schleife auf, bis der Endwert für die Zeit erreicht ist.

Ich habe allerdings schon viele wissenschaftliche Auswertungen gesehen, in denen einfach über solche Unstetigkeiten hinweg integriert wurde. Man bekommt oft auch tatsächlich eine Zahl als Ergebnis. Nur dass dann als "Berechnung" zu werten, ist mutig. Bei einer Sensitivitäts-Analyse fällt das schnell auf: Kleine Variationen der Inputs und der Parameter führen dann zu großen Änderungen der Trajektorien und solche Simulationen kann man dann nicht mehr validieren.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Jay98

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.01.2017, 18:30     Titel:
  Antworten mit Zitat      
Hallo Jan,

danke für die hilfreichen Tipps!
Ab jetzt werde ich die Codes mit dem Button einfügen.

Lg Jay98
 
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.