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

Ableiten einer numerisch gelösten Dgl

 

mariesopherl88
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 04.12.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.03.2012, 13:05     Titel: Ableiten einer numerisch gelösten Dgl
  Antworten mit Zitat      
Hallo zusammen,

ich habe in Matlab eine dgl mit ode 45 gelöst. Wenn ich die Lösung plotte sieht der Graph auch plausibel aus. Wenn ich die Funktion dann jedoch ableite und plotte, hat die Ableitung Sprünge und ist unstetig, sofohl bei diff (y) als auch bei gradient (y)...
Benutze ich den falschen Befehl oder ist das vielleicht ein numerisches Problem?
Ich würde mich freuen, wenn ihr mir weiterhelfen könntet!
Lieben Gruß,
Marie
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

wenn du die Ableitung genau haben möchtest, kannst du ja im Zweifelsfall in die Differentialgleichung einsetzen? t und y hast du ja. Das erscheint mir auf jeden Fall sinnvoller als die Bildung von Differenzenquotienten, und das ist was sowohl DIFF als auch GRADIENT letztlich machen.
Wenn du eine dieser beiden Funktionen verwendest, musst du darauf achten, auch die Zeitskala miteinzubeziehen, z.B.
Code:
dydt = diff(y) ./ diff(t);


Für mehr Hilfe würde ich ein konkreteres Beispiel benötigen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 04.12.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.03.2012, 06:48     Titel:
  Antworten mit Zitat      
Hallo Harald,
danke für deine schnelle Antwort! Ich habe das jetzt so versucht, es gelingt mir aber nicht... meine dgl sieht vereinfacht folgendermaßen aus, sie wird in zwei richtungen aufgestellt:
Code:

function  dvel = velocity(vel,t,K)

dvel=zeros(2,1)

dvel(1)=f(vel,t,K)
dvel(2)=f(vel,t,K)

end

 


so rufe ich sie im main programm auf:
Code:

timerange=[0 10];
y0=[vel0,0]
           
[t,y]=ode45(@(t, vel) velocity(vel,t,K),timerange,y0)

 

soweit klappt alles. Die Funktion für dvel (acc) hab ich nochmal geschrieben, und dabei gleich y eingesetzt.
Code:

function acc=acceleration (y,t,K)

acc=zeros(2,1)
acc1(1)=f(y,t,K)
acc1(2)= f(y,t,K)

end
 

Als Fehlermeldung erscheint hier:
Error using ==> mpower
Matrix must be square.
Was mach ich falsch? Vielleicht kannst Du mr nochmal einen Tipp geben!
Danke und lieben Gruß,
Marie
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

deine tatsächlichen Gleichungen enthalten irgendwo Exponentiation (^). MATLAB versucht, das als Matrixoperation durchzuführen und scheitert. Du willst wohl komponentenweise Operationen; ersetze daher bitte mal ^ durch .^

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 04.12.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.03.2012, 10:57     Titel:
  Antworten mit Zitat      
Hallo Harald,
danke für den Tipp, jetzt hats endlich geklappt!
Hast du vielleicht noch eine Idee, wie abfragen kann, wie die Beschleunigung ab einem bestimmten Zeitpunkt (bei mit tdis) ist? Ich habe es so probiert:
Code:

accdis = find(t>tdis,1,'first')
 

Wie kann ich denn festlegen, welche Zeitachse er durchsuchen soll? Ich habe ja auch den Geschwindigkeitsverlauf etc. über t...
Vielleicht kannst du mir nochmal helfen,
Gruß,
Marie
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

mit dem Befehl findest du den ersten Index, zu dem die Bedingung erfüllt ist. Den kannst du dann beliebig weiterverwenden.

Zitat:
Wie kann ich denn festlegen, welche Zeitachse er durchsuchen soll? Ich habe ja auch den Geschwindigkeitsverlauf etc. über t...

Das müsstest du etwas konkretisieren. Du kannst natürlich über Bedingungen wie
Code:
idx = (t > tmin) & (t < tmax)

einen bestimmten Teil aus deinem Signal "ausschneiden".

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 04.12.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.03.2012, 13:45     Titel:
  Antworten mit Zitat      
Hallo Harald,
aber wie kann ich definieren, dass er mir im Beschleunigungsverlauf den Punkt angibt, bei dem die Bedingung zum ersten mal erfüllt ist? Ich habe in meinem Program mehrere Verläufe, zB auch über die Geschwindigkeit etc. und in der Abfrage steht nirgendwo welchen Verlauf er durchsuchen soll. Ich habe auch schon probiert, eine Funktion dafür zu schreiben, der ich den gewollten Verlauf übergebe:
Code:

function accdis = beschl (a,t,tdis)

 accdis = find(t>tdis,1,'first')
end
 

a ist hier ein zweidimensionaler Vektor. Hier kommt die Fehlermeldung:
??? Undefined function or method 'steadydistance' for input arguments of type 'double'.

Liebe Grüße,
Marie
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

indem du
Code:
accdis = a(accdis);

nimmst.

Die Fehlermeldung wird nichts mit dem geposteten Code zu tun haben, da dort nirgends steadydistance vorkommt.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 04.12.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.03.2012, 14:48     Titel:
  Antworten mit Zitat      
Hallo,
entschuldige, ich habe das falsche kopiert. es müsste eig "beschl" und nicht "steadydistance" heißen..
Ich bekomm's trotzdem nicht hin, leider.
Wo genau soll ich den
Code:
accdis = a(accdis)
hinschreiben? In die Funktion oder ins Main file? Ich arbeite noch nicht so lange mit Matlab und kenne mich nicht so gut aus...
Mein Mainfile sieht jetzt so aus:
Code:

a=gradient(y)
         
            accdis= a(accdis)
           accdis = find(t>tdis,1,'first')
 

So gibt er mir leider gar nichts aus...
und noch eine Frage: Ich habe in meinem Program eine Dgl mit ode23 gelöst und die Schrittweite verkleinert, mit maxstep. Das Zeitintervall habe ich von [0 5] in der Ode-Funktion eingestellt. Wenn ich den Verlauf plotte geht meine Zeitachse aber von 0 bis 500. Kann das stimmen?
Ich hoffe ich nerve dich noch nit, aber ich weiß sonst nicht mehr weiter!
Danke und lieben Gruß,
Marie
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

andersherum, und der Klarheit halber mit versch. Variablen:

Code:
function accdis = beschl (a,t,tdis)

idx  = find(t>tdis,1,'first');
accdis = a(idx);
end


Vorhin konnte das nicht funktionieren, weil du ja a in der Funktion gar nicht verwendet hast...

Bitte möglichst zusammenhängenden Code posten, das machts einfacher.

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.