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

automatische erzeugung einer DGL

 

xzw4gd
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 25.06.07
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.06.2007, 01:40     Titel: automatische erzeugung einer DGL
  Antworten mit Zitat      
Hallo erstmal,

ich hab momentan ein kleines Problem, wir sollen zur übung ein Programm schreiben um das verhalten gekoppelter Pendel zu berechnen und zu visualisieren. Das einzige Problem was mich mometan wirklich beschäftigt ist,
das ich meine DGL nicht für beliebig viele Glieder automatisch erzeugen kann.

Grundlegendes zum Programm:

Berechnung erfolgt mittels ode, die DGL 2`ter Ordung wurde dazu reduziert.

Es gibt für vorgegebene Randbedingungen immer eine bestimmte folge von Summand pro Pendel. Stellt man Bspweise den
ode-> differenzen Gleichung auf erhält man so was wie:


function dX = pendel_dgl(tt, X)


% DGL mit Dämpfung
% sin(x) Nährung nicht mehr!

global g m D Rho L

dX=[ X(4), X(5), X(6),...
-g/L * sin(X(1)) - D/m * (sin(X(1))-sin(X(2)))- Rho * X(4),...
-g/L * sin(X(2)) - D/m * (sin(X(2))-sin(X(1))) - D/m * (sin(X(2))-sin(X(3))) - Rho *X(5),...
-g/L * sin(X(3)) - D/m *(sin(X(3))-sin(X(2)))- Rho * X(6) ]';

diese Funktion gibt der Funktion ode immer einen Vektor mit 6 Elemten zurück. Die ersten 3 sind auslenkungen die nächsten 3 sind Geschwindigkeiten.
So meine Frage ist nun, wie kann ich einen String erzeugen der mir so ein DGL erzeut. Man müsste ja eigentlich nur den mitteleren Teil immer neu erzeugen. Hatte da ne Idee, aber die funktioniert leider nicht. Viell fehlt euch was besseres ein:

function erzeugendA()

%global D m g L Rho dA X
global dA X
%DGL-System ohne Dämpfung sin x für kleine ausschläge ~x

anzahl = 2;
m = 0.1;
D = 0.4;
g = 9.81;
L = 0.5;

for i=(anzahl+1) : (2*anzahl)
dA(i-anzahl) = {X(i)};
end


dA(anzahl+1) = sin(X(1)) - (sin(X(1))-sin(X(2))) - X(anzahl+1);

if (anzahl > 2)
for i=2:(anzahl-1)
dA(anzahl+i) = -g/L * sin(X(i)) - D/m * (sin(X(i))-sin(X(i-1))) - D/m * (sin(X(i))-sin(X(i+1))) - Rho *X(anzahl+i);
end
end

dA(2*anzahl) = -g/L * sin(X(anzahl)) - D/m *(sin(X(anzahl))-sin(X(anzahl-1)))- Rho * X(2*anzahl);


-> (dA') würde dann dem Funktionfile übergeben.

Kann jemand helfen?
Private Nachricht senden Benutzer-Profile anzeigen


Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 27.06.2007, 10:54     Titel: Nachfragen
  Antworten mit Zitat      
Hallo xzw4gd,

leider verstehe ich Dein Problem nicht ganz. Dass noch niemand sonst geantwortet hat, könnte dafür sprechen, dass es auch anderen so geht.

Deine Beschreibung macht für mich zwei Fälle wahrscheinlich:

    1. Du möchtest die Funktion pendel_dgl mit verschiedenen Parametern g m D Rho L aufrufen.

    2. Du möchtest die ode mit verschiedenen Funktionen aufrufen, die nur in der Form mit pendel_dgl übereinstimmen.


Die erste Variante sollte aber mit den globalen Variablen, die Du eingeführt hast, schon funktionieren. Für die zweite Variante ist es am einfachsten, die verschiedenen Funktionen einzeln zu schreiben (eventuell als "nested functions") und dann über eine Variable, die das function handle enthält, an die ode zu übergeben:
Code:
odefun = @pendel_dgl;
[T,Y] = solver(odefun,tspan,y0);
odefun = @pendel_dgl_2;
[T2,Y2] = solver(odefun,tspan,y0);
 

usw. (Bezeichnungen wie in der Matlab-Hilfe zu ode23, etc. (Suchwort ODE Solvers).

Wenn Du etwas ganz anderes meinst, bitte nachfragen! Zum Beispiel ist mir nicht klar, wofür Du den String definieren möchtest. Es geht aber bestimmt.

Herzliche Grüße
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
marcel

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.09.2007, 16:53     Titel: Re: Nachfragen
  Antworten mit Zitat      
Bijick hat Folgendes geschrieben:
Hallo xzw4gd,

leider verstehe ich Dein Problem nicht ganz. Dass noch niemand sonst geantwortet hat, könnte dafür sprechen, dass es auch anderen so geht.

Deine Beschreibung macht für mich zwei Fälle wahrscheinlich:

    1. Du möchtest die Funktion pendel_dgl mit verschiedenen Parametern g m D Rho L aufrufen.

    2. Du möchtest die ode mit verschiedenen Funktionen aufrufen, die nur in der Form mit pendel_dgl übereinstimmen.


Die erste Variante sollte aber mit den globalen Variablen, die Du eingeführt hast, schon funktionieren. Für die zweite Variante ist es am einfachsten, die verschiedenen Funktionen einzeln zu schreiben (eventuell als "nested functions") und dann über eine Variable, die das function handle enthält, an die ode zu übergeben:
Code:
odefun = @pendel_dgl;
[T,Y] = solver(odefun,tspan,y0);
odefun = @pendel_dgl_2;
[T2,Y2] = solver(odefun,tspan,y0);
 

usw. (Bezeichnungen wie in der Matlab-Hilfe zu ode23, etc. (Suchwort ODE Solvers).

Wenn Du etwas ganz anderes meinst, bitte nachfragen! Zum Beispiel ist mir nicht klar, wofür Du den String definieren möchtest. Es geht aber bestimmt.

Herzliche Grüße


Kurz um ich erzeuge mir mit diesem Fall einen neuen DGL-File. Die Anzahl der Glieder ist hier offen. für 5 Pendel erzeugt die Datei ein DGL System 1 Ordnung aus 5 Diff.-Gleichungen. Hoffe es ist jetzt klarer. Gruß Marcel
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 25.09.2007, 11:26     Titel:
  Antworten mit Zitat      
Hallo marcel,

die Variable ist also die Anzahl der Pendel, bezeichnet mit "anzahl"? Dann liegt das Problem wohl nur im Funktionsaufbau. Am einfachsten ist es mal wieder mit geschachtelten ("nested") Funktionen. Bei Angaben, die ich nicht hatte (z.B. Rho) habe ich mal Fantasiewerte eingesetzt und ansonsten deinen Code übernommen.

Code:
function erzeugendA(anzahl,X0)

m = 0.1;
D = 0.4;
g = 9.81;
L = 0.5;
Rho = 1;

[T,Y] = ode45(@odefun,[0 1],X0)

function dA = odefun(t,X)
       
    dA = zeros(2*anzahl,1);
    for i=(anzahl+1) : (2*anzahl)
        dA(i-anzahl) = X(i);
    end
    dA(anzahl+1) = sin(X(1)) - (sin(X(1))-sin(X(2))) - X(anzahl+1);
    if (anzahl > 2)
        for i=2:(anzahl-1)
            dA(anzahl+i) = -g/L * sin(X(i)) - D/m * (sin(X(i))-sin(X(i-1)))-...  
                                    D/m * (sin(X(i))-sin(X(i+1))) - Rho *X(anzahl+i);
        end
    end
    dA(2*anzahl) = -g/L * sin(X(anzahl)) - D/m *(sin(X(anzahl))-...
                                                    sin(X(anzahl-1)))- Rho * X(2*anzahl);

end
end
 

Jetzt kann man die Funktion mit der Anzahl und einem passenden Startwert aufrufen. Ist es das, was Du wolltest? Sonst weiterfragen. Smile Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
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.