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 in einem ODE befehl ...ist das möglich

 

mike793
Forum-Century

Forum-Century


Beiträge: 119
Anmeldedatum: 11.08.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.10.2009, 10:00     Titel: if in einem ODE befehl ...ist das möglich
  Antworten mit Zitat      
hallo zusammen!!!

ich würde gerne mal wissen ob es möglich ist, eine if bedingung in einem ode Befehl unterzubringen? und wie würde das aussehen?

meine Frage kommt deswegen auf, da ich einer fixe größe im differenzialgleichung sagen muss werde,wenn die z(1) größer als 100 dann werde sehr hoch!!!!

wobei z(1) ein gesuchter wert von der differenzialgleichung ist!

also Formelmäßig schaut das so aus

Code:

dzdt=[z(2)
         c1*z(1)];
 


und c1 ist 10 jedoch wenn z(1) größer ist als 100 dann soll c1 1000 sein!!

geht sowas überhaupt???

Danke[/code]
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.500
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.10.2009, 10:15     Titel:
  Antworten mit Zitat      
Hallo,

wie wäre es damit:

Code:
if z(1) <= 100
c1 = 10;
else
c1 = 1000;
end
dzdt=[z(2) c1*z(1)];


Oder dzdt direkt mit if definieren.

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

Forum-Century

Forum-Century


Beiträge: 119
Anmeldedatum: 11.08.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.10.2009, 10:28     Titel:
  Antworten mit Zitat      
wow es geht!!!!! DANKE!!!

wie meinst du das eigentlich dzdt direkt mit if definieren?

aber vielen DANK nochmals!!! Very Happy
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.500
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.10.2009, 10:34     Titel:
  Antworten mit Zitat      
Gemeint war die Alternative:

Code:
if z(1) <= 100
dzdt=[z(2) 10*z(1)];
else
dzdt=[z(2) 1000*z(1)];
end


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

Forum-Century

Forum-Century


Beiträge: 119
Anmeldedatum: 11.08.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.10.2009, 09:45     Titel:
  Antworten mit Zitat      
hat irgendwer eine Ahnung, wie man dieses Problem mit einer Event funktion lösen kann.... denn bei mir spuckt das Programm nicht das Passende heraus!!!!!!!
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.500
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.10.2009, 12:54     Titel:
  Antworten mit Zitat      
Hallo Mike,

ich weiss nicht, was du unter einer Event-Funktion verstehst. Wenn du Event im Sinne von Event und Listener meinst, müsstest du objektorientiert arbeiten, was mir hier jedoch als Overkill erscheint.

Mal eine ganz andere Frage... mich verwundert die Modellierung ein wenig. Wenn ich es richtig verstehe, wird z(1) noch HÖHER gewichtet, wenn es ohnehin schon sehr groß ist. Ist das wirklich sinnvoll? Ein anderes Problem sehe ich darin, dass das Verhalten um z(1) = 100 unstetig ist. Bist du also sicher, dass das Problem nicht evtl. in der Modellierung zu suchen ist?

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

Forum-Century

Forum-Century


Beiträge: 119
Anmeldedatum: 11.08.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.10.2009, 14:04     Titel:
  Antworten mit Zitat      
...nein eigentlich nicht ich will mit der einfachen Bedingung nur dass, man ab einer gewissen höhe von z(1) einen anderen Parameter nimmt in diesem Fall einen Höheren!

Für mein System würde ich jedoch eine differenzierbare Funktion nehmen, diese passt sowieso besser zu meinem Problem! dieses habe ich ja schon gemacht nur wenn die Funktion hochgradig nicht linear ist bzw Wenn der ausdruck c1*z(1) nicht annähernd konstant ist bekomme ich eine Fehlermeldung und ein falsches ergebnis

Im Prinzip will ich aus der konstante c1 eine von z(1) abhängige Variable machen!!!! nur bis jetzt klappt das noch nicht so richtig!!!!!


Code:


...(c2*((z(9)-lv*z(11)+ll*z(13))-z(1))+e1*c2*sign(((z(9)-lv*z(11)+ll*z(13))-z(1)))*((z(9)-lv*z(11)+ll*z(13))-z(1))*((z(9)-lv*z(11)+ll*z(13))-z(1)))...


hier ein kleiner ausschnitt aus meinem system wenn ich nun e1 sehr groß machen will bekomme ich immer einen fehler!!!!

Kann man dieses Funktion (soll einen lineare mit einem kubischen anteil ergeben) anderes dem ode mitgeben?

Danke
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.500
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.10.2009, 14:42     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Für mein System würde ich jedoch eine differenzierbare Funktion nehmen, diese passt sowieso besser zu meinem Problem! dieses habe ich ja schon gemacht nur wenn die Funktion hochgradig nicht linear ist bzw Wenn der ausdruck c1*z(1) nicht annähernd konstant ist bekomme ich eine Fehlermeldung und ein falsches ergebnis


WELCHE Fehlermeldung?

Zitat:
hier ein kleiner ausschnitt aus meinem system wenn ich nun e1 sehr groß machen will bekomme ich immer einen fehler!!!!


Sind aus 2 DGLen jetzt 13 geworden, oder warum verwendest du hier z(13)? Und.... WELCHE Fehlermeldung? Das einzige Problem, das ich sehe, ist die Verwendung von sign. Dadurch wird die Funktion unstetig und nicht differenzierbar. Was steckt denn da dahinter? Ist das wirklich das Verhalten des realen Systems?

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

Forum-Century

Forum-Century


Beiträge: 119
Anmeldedatum: 11.08.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.10.2009, 14:56     Titel:
  Antworten mit Zitat      
insgesamt hat das system 22 gleichungen!

... und mit dem sign will ich nur aus einem linearen ansteigen ein kubisches ansteigen erhalten. Wenn man sich den verlauf ausschreiben lässt hat die Funktion keine knicke oder unstetigkeitsstellen also ist das aus meiner sicht differenziebar!

... Warning: Failure at t=1.014256e+000. Unable to meet integration tolerances
without reducing the step size below the smallest value allowed (3.603363e-015)
at time t.

... zum schluss will ich mich bei dir mal sehr herzlich bedanken Harald

DANKE!!!!
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Harald
Forum-Meister

Forum-Meister


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

sign erzeugt zwangsläufig Unstetigkeiten.
sign(-0.0000000...1) = -1
sign(0) = 0
sign(0.0000000...1) = 1

Man könnte sich durch eine Annäherung behelfen:
sign(x) = tanh(100*x)

Zum Vergleich:
Code:
x = -5:0.001:5;
plot(x, sign(x), x, tanh(100*x))
figure
plot(x, abs(sign(x)-tanh(100*x)))


Wenn dir die entstehenden Ungenauigkeiten zu groß sind, nimm statt 100 einen größeren Wert (aber nicht übertreiben, sonst hast du dein altes Problem wieder). Denke dabei einfach daran, dass die Ungenauigkeit ja (hoffentlich) nur über einen sehr kurzen Zeitraum auftritt.

Edit:
Alternative: versuche es doch mal mit einem anderen Löser, z.B. ode15s statt ode45.


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