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

Differentialgleichungssystem

 

Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.05.2013, 20:48     Titel: Differentialgleichungssystem
  Antworten mit Zitat      
Mit dem Befehl function kann man ja eine Funktion definieren. Diese funktion kann dann als dynamische Variable einer ODE mit einem solver gelöst werden.
Z.Z. habe ich mit:
function dy = fu1(t,y,k)
dy=-k^2*y
die funktion definiert. Dabei ist die Funktion abhängig von t.
In meiner Script Datei lass ich dann eine Schleife für k von -N/2 bis N/2 durchlaufen, wobei ich N vorher oben festlege.
In jedem Schleifendurchlauf speicher ich die Lösungen zu gegebenem k in einer Spalte einer Matrix ab. Am Ende hab ich dann eine Matrix mit N+1 Spalten. Jede Spalte entspricht der Lösung zu einem bestimmten k.
Anstelle der Schleife müsste es aber doch auch möglich sein die ODE direkt als Vektor zu lösen.
also man könnte definieren
dy=zeros(1,N+1)
dy(1)=-(-N/2)^2*y
.
.
.
dy(N+1)=-(N/2)^2*y
dabei will ich aber nicht jede Zeile per hand eintippen. Gibt es da keine Möglichkeit dieses System ohne jede Zeile per Hand einzutippen zu definieren?


Harald
Forum-Meister

Forum-Meister


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



Da die Gleichungen voneinander unabhängig sind, halte ich es für eine gute Idee, sie getrennt voneinander zu simulieren. Wenn du es aber anders machen möchtest, wäre das System wohl so:

dy=zeros(1,N+1)
dy(1)=-(-N/2)^2*y(1)
.
.
.
dy(N+1)=-(N/2)^2*y(N+1)

Anders gesagt:
Code:
dy = linspace(-N/2, N/2, numel(y)) .* y;


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



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.05.2013, 22:48     Titel:
  Antworten mit Zitat      
leg ich mit
dy=zeros(1,N+1)
auch schon die länge des vektors y fest?
weil du da numel(y) geschrieben hast.
eigentlich ist meine gleichung nichtlinear.
dy(k) = -k^2*y(k) - y(k) x (ik y(k))

dabei ist x die faltung. also y(k) gefaltet mit ik y(k)

so wie ich es zuvor implementiert hatte
ifft(fft(y(k))*fft(ik y(k))) denkt das programm aber dass die faltung sich auf die t variablen bezieht.
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
auch schon die länge des vektors y fest

Nein, das machst du im Grunde mit der Länge des Startvektors.

Zitat:
weil du da numel(y) geschrieben hast.

Damit der gleichmäßig unterteilte Vektor genauso lang wie y wird.

Zitat:
denkt das programm aber dass die faltung sich auf die t variablen bezieht.

Ein denkendes Programm? Wäre ne tolle Sache. Aber mal ernsthaft: was soll t sein?

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



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.05.2013, 02:34     Titel:
  Antworten mit Zitat      
Was ist für dich der Startvektor?

Denkendes Programm ist vllt doof ausgedrückt.
ich hab ne function dy=fu1(t,y)
dy=-k^2*y-ifft(fft(y)^2)

der berechnet jetzt die fft von dem spalten vektor y der die werte von y zu unterschiedlichen zeiten t angibt.
ich will aber dass die fft sich auf den vektor zu gleichen zeiten mit unterschiedlichen k bezieht.
 
Harald
Forum-Meister

Forum-Meister


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

jetzt verstehe ich - die Gleichungen sind dann natürlich auch nicht voneinander abhängig.

Zitat:
Was ist für dich der Startvektor?

Die Anfangswerte, das Argument y0 von beispielsweise ode45.

Ich würde es so versuchen:
Code:
function dy=fu1(t,y)
dy= -linspace(-N/2, N/2, numel(y))'.*y-ifft(fft(y).^2);


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



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.05.2013, 10:35     Titel:
  Antworten mit Zitat      
Also ich meinte folgendes:

dy(k) = - v*k.^2*y(k) - summe_{n=-N/2:N/2} y(n).*y(k-n)

die gleichungen sind doch stark voneinander Abhängig.
und ich hatte versucht, dass die fft von dem vektor y(k) gebildet wird. aber das klappt nicht Sad
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.05.2013, 10:41     Titel:
  Antworten mit Zitat      
ops. das vergiss das v vor dem ersten term^^

sry wegen der verwirrung.
 
Harald
Forum-Meister

Forum-Meister


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

bitte gehe auf die Antwort ein und schreibe vor allem, wieso dir das nicht weiterhilft.
Bitte beschreibe auch genau, am besten anhand von Code, was du versucht hast und was daran nicht geklappt hat.

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



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.05.2013, 12:00     Titel:
  Antworten mit Zitat      
Hey nochmal, hier erstmal der Code

Code:

v=0.5;
N=100;
NT=100;
NX=200;
A=zeros(NT,N+1);
x=linspace(0,2*pi,NX);
k=(-N/2:N/2)';
m=ones(N+1,1);
    AB=quadv(@(x)BurgerAB(x,k,m),0,2*pi);
    [t,ak]=ode45(@(t,ak)Burger1(t,ak,k,v,N),linspace(0,2*pi,NT),AB);
%      A(:,I+1)=[ak];
B=exp(1i*k*x);
C=real(ak*B);
% %plot(x,C(1,Smile,x,C(10,Smile,x,C(250,Smile,x,exp(-2*pi*(x-pi/2).^2))
% %plot(x,exp(-2*pi*(x-pi/2).^2))
set(figure,'Renderer','zbuffer')
set(gca,'nextplot','replacechildren')
mov(NT)=struct('cdata',[],'colormap',[]);
 for J=1:NT
     %axis([0 2*pi 0 1.2])
     plot(x,C(J,:))
     axis([0 2*pi -1.2 1.2])
     mov(1,J)=getframe;
 end
 


Das ist das Hauptprogramm.

Burger1.m ist

Code:

function dakdt = Burger1(t,ak,k,v,N)
dakdt=zeros(N+1,1);
dakdt=0*t-v*k.^2.*ak-ifft(fft(ak).*fft(1i*k.*ak));
 


und BurgerAB.m

Code:

function u0psi0=BurgerAB(x,k,m)
u0psi0=m*sin(x).*exp(-1i*k*x)/(2*pi);
 


Das ist die Burgers-Gleichung
Mir kam bei deinem obigen zitat:
Zitat:

function dy=fu1(t,y)
dy= -linspace(-N/2, N/2, numel(y))'.*y-ifft(fft(y).^2);

nur erstmal der Gedanke weil ich das schon zuvor probiert hatte, dass eventuell die fft gar nicht von dem vektor ak berechnet wird.
Ich erwarte so auftretende Schocks. Die sind aber nicht da.
Wenn ich das so ausführe nimmt die Amplitude einfach ab.
Daher muss irgendwas nicht stimmen.
Und ich glaube das liegt an der fft
 
Harald
Forum-Meister

Forum-Meister


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

ist schwer zu sagen, wo das Problem liegt.

Du kannst ja mal versuchen, die Gleichung von 10:35 explizit als Summe zu berechnen.

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



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.05.2013, 12:27     Titel:
  Antworten mit Zitat      
Sry wenn ich doof frage :-/
Aber 10:35?
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.05.2013, 12:30     Titel:
  Antworten mit Zitat      
Eine Frage hätte ich allerdings noch.
Für v=0 bekomm ich fortlaufend den Fehler:

Warning: Failure at t=1.411891e+00. Unable to meet integration tolerances without reducing the step size below the smallest value
allowed (3.552714e-15) at time t.
> In ode45 at 309
In BurgerVec at 10
Index exceeds matrix dimensions.

Error in BurgerVec (line 21)
plot(x,C(J,Smile)

Gibts da irgendnen workaround?
 
Harald
Forum-Meister

Forum-Meister


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

mit 10:35 meinte ich die Uhrzeit des Beitrags, auf den ich mich bezog.

Bei v=0 hilft es, statt ode45 einen anderen Solver wie ode15s zu verwenden. Dann bekommst du auch deine Schocks :)

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



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.05.2013, 16:41     Titel:
  Antworten mit Zitat      
Also ich hab das jetzt mal über die schon bekannte Lösung implementiert:
http://de.wikipedia.org/wiki/Hopf-Cole-Transformation

Als Beispielfunktion hab ich sin(x):

meine function datei lautet:
Code:

function u0psi1=ANADen(x,y,v,t)
u0psi1=exp((cos(y)-1)*1/(2*v)-(1./(4*v*t))'*(x-y).^2);
 


Die Scriptdatei enthält:

Code:

v=0.05;
N=1000;
NT=250;
NX=300;
f=zeros(NT,NX);
x=linspace(0,2*pi,NX);
t=linspace(0,3,NT);
% k=(-N/2:N/2)';
% m=ones(N+1,1);
%    Num=quadv(@(y)ANANum(x,y,v,t),-N,N);
    Den=quadv(@(y)ANADen(x,y,v,t),-N,N);
%    [t,ak]=ode15s(@(t,ak)Burger1(t,ak,k,v,N),linspace(0,2*pi,NT),AB);
%      A(:,I+1)=[ak];
lDen=log(Den);
for I=2:NX-1
f(:,I)=-2*v*(NX-1)/(2*pi)*(lDen(:,I+1)-lDen(:,I-1))/2;
end
%f=(1./Den).*Num;
% C=real(ak*f);
% % %plot(x,C(1,Smile,x,C(10,Smile,x,C(250,Smile,x,exp(-2*pi*(x-pi/2).^2))
% % %plot(x,exp(-2*pi*(x-pi/2).^2))
set(figure,'Renderer','zbuffer')
set(gca,'nextplot','replacechildren')
mov(NT)=struct('cdata',[],'colormap',[]);
 for J=1:NT
     %axis([0 2*pi 0 1.2])
     plot(x,f(J,:))
     axis([0 2*pi -1.2 1.2])
     mov(1,J)=getframe;
 end
 


wenn du das laufen lässt siehst du die korrekten schocks.
mit v->0 wird die Flanke unendlich Steil.

Warum das nicht mit der DGL klappt frag ich mich also immer noch.
Wenn Matlab eine DGL löst in meinem Fall ist es die Lösung ak(t), dann ist ak(t) ein Vektor mit den gleichmäßigen Abständen Delta t im Interval.
Kann es sein, dass Matlab von diesem Vektor bei der fft ausgeht?
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.