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 Lösen mit integriertem Integral

 

S3r4
Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 20.08.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.08.2013, 15:36     Titel: DGL Lösen mit integriertem Integral
  Antworten mit Zitat      
Hallo,
ich möchte eine Differentialgleichunglösen die Folgendeform hat:

[math] dx/dt=\int_a^b \! M(x,F) \, dF [\math]

sprich ich muss eine Funktion (die für sich durchaus Funktioniert) über eine Variable integrieren (und eliminiere sie so) und danach nach einer anderen Variable die DGl lösen.
Im endeffekt wird dx/dt, M, x Vektorwertig sein und F ein Skalaar.

Ich habe schon viel mit quad herum probiert, jedoch nicht wirklich weiter gekommen. darum spare ich mir den code bis dato. das Problem für mich ist, das ich über eine Variable integrieren muss und die anderen aber weiter behalten muss. Sprich wie muss ich diese integration implementieren?

Gruß
Sera
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

das sollte sich mit quad machen lassen. Als DGL-Funktion würde ich dann nehmen:

Code:
function dx = odefun(t,x)

dx = quad(@(F) M(x,F), a, b)
 


Was M ist, kann man z.B. in einer separaten Funktion oder als anonymous function handle definieren.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 20.08.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.08.2013, 12:51     Titel:
  Antworten mit Zitat      
Danke für die antwort aber so einfach scheint es nicht zu Funktionieren, ich hohle wohl mal besser etwas weiter aus:
Ich habe eine Funtion
Bewgl(F,x,my,T) diese Funtion ruft viele anderen Funktionen auf die aber alle Funktionieren wenn ich sie einzeln (oder über Bewgl) aufrufe, sprich Bewgl mit festen Parametern aufrufe.
Bewgl ergibt einen 3x1 Vektor und besteht im Prinzip aus dem Produkt
Bewegl=M(F,x,my,T)*s(F,x)*n, worin M eine 3x2; s ein skalar und n ein 2x1 Vektor ist.
Wenn ich nun quad aufrufe in dieser Form:

dax=quad(@(F) Bewegls(F,x,my,T),-pi,pi);

dann ergibt mir das
Error using /
Matrix dimensions must agree.

sowie viele kleine Fehler, untere anderem in den unteresten Funktionen von M.

Vielen dank für die Hilfe, wie gesagt mich wundert es das ich Bewegls aufrufen kann aber nicht über F integrieren
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Bitte die komplette Fehlermeldung kopieren.

Setze doch mal einen Haltepunkt in der Zeile mit dem /

Wenn du da selbst nicht weiterkommst, hilft nur reproduzierbarer Code.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 20.08.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.08.2013, 14:53     Titel:
  Antworten mit Zitat      
also da ich mir schon dachte, das es nicht an meinen Funktionen liegt sonder an etwas anderem, habe ich jetzt mal ein kleines mimimalbeispiel gebaut (das ebenfalls nicht funktioniert ;( )

eine beliebige Differentialgleichung (hat keine bedeutung will ja nur einen Funtionierenden Code)

Code:
function [ dy ] = DGL( F,y )
dy=[y(2);-1*y(1)*F];
end


will ich über ein intervall von F integrieren

Code:
function [ day ] = day( t,y )
day=quad(@(F) DGL(F,y),0,pi);
end

(diese Funktion funktioniert schon nicht)

und dann nach t ein AWP lösen.
Code:
[t,y]=ode45(@(t,y) day(t,y),[0;10],[0;1]);
 


---------------------------------------------------------
ergibt Fehlermedlung:
Error using vertcat
CAT arguments dimensions are not consistent.

Error in DGL (line 5)
dy=[y(2);-1*y(1)*F];

Error in day>@(F)DGL(F,y) (line 4)
day=quad(@(F) DGL(F,y),0,pi);

Error in quad (line 72)
y = f(x, varargin{:});

Error in day (line 4)
day=quad(@(F) DGL(F,y),0,pi);

Error in @(t,y)day(t,y)


Error in odearguments (line 8Cool
f0 = feval(ode,t0,y0,args{:}); % ODE15I sets args{1} to yp0.

Error in ode45 (line 114)
[neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...

Error in Run (line 5)
[t,y]=ode45(@(t,y) day(t,y),[0;10],[0;1]);
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

du willst anscheinend ein Vektorintegral berechnen. quad ist aber wohl nur für skalare Funktionen geeignet.

Wenn du wie vorgeschlagen einen Haltepunkt in die problematische Zeile setzt, hier:
Code:

siehst du, dass beim ersten Aufruf
F 1x7 double
y 2x1 double
ist.

Vorschlag:
Code:
function [t,y] = main()

[t,y]=ode45(@(t,y) day(t,y),[0;10],[0;1]);
end

function [ day ] = day( t,y )
day=[quad(@(F) DGL1(F,y),0,pi);  quad(@(F) DGL2(F,y),0,pi)];
end

function [ dy ] = DGL1( F,y )
dy=y(2)*ones(size(F));
end

function [ dy ] = DGL2( F,y )
dy = -1*y(1)*F;
end


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 20.08.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.08.2013, 12:56     Titel:
  Antworten mit Zitat      
das ist für diese einfache DGl noch möglich aber in meinem richtigen Problem ist das natürlich eine andere, sehr Komplexe DGL, darum kann ich diese dort nicht um schreiben.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

"natürlich" ist das vielleicht für dich, aber ich kann es ja schlecht riechen ;)

Spontan fällt mir folgende Alternative ein: Das Integral als Lösung einer DGL betrachten, also statt:
I(t) = \int_0^t f(x) dx
zu sagen
I'(t) = f(t)
und das mit ode45 lösen.

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