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

ODE45-Löser Problem mit Vektorlänge

 

matlabNOOP
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 08.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.11.2011, 15:55     Titel: ODE45-Löser Problem mit Vektorlänge
  Antworten mit Zitat      
Hallo,
Ich möchte eine gewöhnliche DGL 3. Ordnung mit dem ode45-Solver lösen.
Hier ist ein Ausschnitt aus dem ganzen Programm:


m=40;
X=[0 m]; % initial conditions
F=Y(:,1)
%F ist ein Vektor der Länge 100, welcher vorer berechniet wurde;
%er hat Einträge zw. 0 und 13,7831

eta=linspace(0,15);
[eta,X]=ode45('Temperaturprofilgleichung',eta,X,[],F);

% function Temperaturprofil = Temperaturprofilgleichung(eta,X,flag,F)
% Temperaturprofil = [ X(2);
% -7*F*X(2) ];


Matlab gibt dann folgende Fehlermeldung aus:

??? Error using ==> odearguments at 116
TEMPERATURPROFILGLEICHUNG returns a vector of length 101, but the length of initial conditions vector is 2. The vector returned by
TEMPERATURPROFILGLEICHUNG and the initial conditions vector must have the same number of elements.

Error in ==> ode45 at 173
[neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...

Error in ==> Beleg_STM at 126
[eta,X]=ode45('Temperaturprofilgleichung',eta,X,[],F);


Könnt ihr mir bitte bei diesem Problem helfen, ich komme da nicht weiter.
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 08.11.2011, 21:43     Titel: Re: ODE45-Löser Problem mit Vektorlänge
  Antworten mit Zitat      
Hallo matlabNOOP,
Zitat:
TEMPERATURPROFILGLEICHUNG returns a vector of length 101, but the length of initial conditions vector is 2. The vector returned by
TEMPERATURPROFILGLEICHUNG and the initial conditions vector must have the same number of elements.

Wieso hat die Ausgabe von TEMPERATURPROFILGLEICHUNG 101 Elemente?

Gruß, Jan
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.11.2011, 21:51     Titel:
  Antworten mit Zitat      
Hallo,

schau dir doch mal die Hilfe von ode45 und vor allem das Interface, das für die Differentialgleichungsfunktion vorausgesetzt wird, an.

Und gib bitte auch die DGL bzw. das DGL-System an, das du zu lösen versuchst.

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

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 08.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.11.2011, 01:39     Titel:
  Antworten mit Zitat      
Hi,

entschuldigt erstmal, ich habe mich verschrieben:
es ist keine DGL 3. sondern 2.Ordnung. Sorry (Hatte weiter oben im Programm schon eine DGL 3. Ordnung gelöst und das funtkioniert).

@ Jan S:

der Vektor hat meiner Meinung nach 101 Einträge, weil die Funtkion F 100 einträge hat (mit "length" hab ich das überprüft) und dazu noch die 1. DGL (1. Ordnung) aus dem umgestellten Gleichungssystem kommt (habe ja aus der DGL 2. Ordnung zwei DGLen 1. Ordnung machen müssen).
Also ein Eintrag für die 1. DGL (1. Ordnung) plus 100 Einträge (von der Funktion F) von der 2. DGL (1. Ordnung).



@ Harald:

die zu lösende DGL ist eine 2. Ordnung (ein Randwertproblem):
X''(eta) + G*F*X'(eta) = 0

dabei ist hier G = 7

Ich hab diese also in ein System von zwei Gleichungen erster Ornung umgewandelt:
(darauf greife ich ja mit dem Befehl
[eta,X]=ode45('Temperaturprofilgleichung',eta,X,[],F);
zu)

% function Temperaturprofil = Temperaturprofilgleichung(eta,X,flag,F)
% Temperaturprofil = [ X(2);
% -7*F*X(2) ];


Danke für eure bisherigen Antworten (und Fragen)
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 11.11.2011, 09:03     Titel:
  Antworten mit Zitat      
Hallo matlabNOOP,

Zitat:
der Vektor hat meiner Meinung nach 101 Einträge, weil die Funtkion F 100 einträge hat (mit "length" hab ich das überprüft) und dazu noch die 1. DGL (1. Ordnung) aus dem umgestellten Gleichungssystem kommt (habe ja aus der DGL 2. Ordnung zwei DGLen 1. Ordnung machen müssen).

Was ist "die Funktion F"?
Die Anzahl der Elemente des Input-Vektors muss genauso groß sein wie die Anzahl der Elemente des Output-Vektors. Wenn Die DGL also "eta" der Länge 2 bekommt, muss es einen ebenso langen Vektor zurückgeben, nämlich die aktuelle Ableitung der Funktion.

Hier scheint also mathematisch noch etwas inkorrekt zu sein.
Bitte poste den Source Code, statt ihn mit Worten zu beschreiben.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
matlabNOOP
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 08.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.11.2011, 14:20     Titel:
  Antworten mit Zitat      
Hallo,


@ Jan S:

Die Funktion F kommt von der Blasiusgleichung und ist abhängig von eta. Sie wird in der DGL 3. Ordnung unter "Teilaufgabe b)" gelöst und dann bei der DGL 2. Ordnung weiter verwendet.


Ok dann poste ich mal den Source-Code (die DGL 3. Ordnung ist die Blasiusgleichung --> "function Blasius" und darauf wird in einem extra Script zugegriffen; was in dem Script steht, ist unter der function Blasius hintern den %-Zeichen; das gleiche gilt für die DGL 2. Ordnung, der Temperaturprofilgleichung --> "function Temperaturprofil"):


Code:
clear all
%%%%%%%%%%%%%%%%%%%% Teilaufgabe b) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
k=0.3;                                  % startwert der inatial conditions
Y=[0 0 k];                              % initial conditions
eta=linspace(0,15);                     % =eta (laufvariable)                                
[eta,Y]=ode45('Blasiusgleichung',eta,Y);            
% function Blasius = Blasiusgleichung(eta,Y)
% Blasius=[    Y(2);           % -> f'(0)=0    -> RB:f(0)=0
%              Y(3);           % -> f''(0)=0   -> RB:f'(0)=0 ; f'(15)=1                    
%            -Y(1)*Y(3)];      % -> f'''(0)=??                                                                          
A=Y';
B=A(end-1);                      % gibt den letzten Wert der 2.Spalte aus
B=str2double(sprintf('%.4f',B)); % auf 4-Nachkommastellen runden
lambda=1/2;                      % angenommener Startwert für Schießmethode

while B~=1;
    while B<1;
    k=k+lambda;
    lambda=lambda/2;
    Y=[0 0 k];
    [eta,Y]=ode45('Blasiusgleichung',eta,Y);
    A=Y';                               % transponieren der Matrix
    B=A(end-1);                         % letzter Wert der vorletzten Zeile
                                            % der Matrix Y in B schreiben
    B=str2double(sprintf('%.4f',B));    % begrenzen der Zahl auf 4
                                            % Nachkommastellen
   
    end;
    while B>1;
    k=k-lambda;
    lambda=lambda/2;
    Y=[0 0 k];
    [eta,Y]=ode45('Blasiusgleichung',eta,Y);
    A=Y';                              
    B=A(end-1);    
    B=str2double(sprintf('%.4f',B));  
    end;
    while B==1;
        break;
    end;
end;

Y
subplot(2,2,1)
    plot(eta,Y(:,1),'-','color','g')    % plot solution f
    title('solution f (\eta)')
    xlabel('Variable \eta')
    ylabel('f (\eta)')
subplot(2,2,2)
    plot(eta,Y(:,2),'-.','color','r')   % plot derivative df/deta
    title('solution f´(\eta)')
    xlabel('Variable \eta')
    ylabel('(\eta)')
subplot(2,2,3)
    plot(eta,Y(:,3),'.-.')              % plot derivative (derivertive df/deta)
    title('solution f´´(\eta)')
    xlabel('Variable \eta')
    ylabel('f´´(\eta)')
subplot(2,2,4)
    axis([0,4,0,1.2])
    hold on
    plot(eta,Y(:,1),'-','color','g')
    axis([0,4,0,1.2])
    hold on
    plot(eta,Y(:,2),'-.','color','r')
    axis([0,4,0,1.2])
    hold on
    plot(eta,Y(:,3),'.-.')
    title('solution f(\eta),f´(\eta), f´´(\eta)')
    xlabel('Variable \eta')
    ylabel('f´,f´´,f´´´')
   
%%%%%%%%%%%%%%%%%%%%%% Teilaufgabe c) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                    %%%% Geschw. in z-Richtung

U=1;             % angenommener Wert für Geschw. in unendl.
F2=Y(:,2);             % gibt die 2. Spalte der Matrix Y aus =f´(eta)
z=linspace(0,15);
u=U*F2;                % Geschw. in z-Richtung
             

                    %%%% Geschw. in x-Richtung

nu=1*10^(-6);    % angenommener Wert für Nü (Wasser bei 20°C) lt. Siegloch
                % vereinfachte Annahme da von Temp. und Medium abhängig
F1=Y(:,1);      % gibt die 1. Spalte der Matrix Y aus [=f(eta)]
F2=Y(:,2);      % gibt die 2. Spalte der Matrix Y aus [=f´(eta)]
%x=linspace(0,15);       % x=Lauflänge

%y=linspace(0,25);

%x4=(eta.*eta)\(y.*y)';

x=((eta.*eta)/0.5^2)*2;       % 0,5 ist Annahme für y
x1=((eta.*eta)/5^2)*2;        % 5 ist Annahme für y
x2=((eta.*eta)/50^2)*2;       % 50 ist Annahme für y

w=sqrt((nu*U)\(2*x)).*((eta.*F2)-F1);  
w1=sqrt((nu*U)\(2*x1)).*((eta.*F2)-F1);
w2=sqrt((nu*U)\(2*x2)).*((eta.*F2)-F1);
%w4=sqrt((nu*U)\(2*x4)).*((eta.*F2)-F1);

figure
subplot(2,1,1)
    plot(z,u,'-','color','g')    % plot solution u(x)
    title('solution of u(z)')
    xlabel('Variable z')
    ylabel('u(z)')
subplot(2,1,2)
    plot(z,w,'-','color','r')   % plot solution v(x)
    title('solution of w(z)')
    xlabel('Variable z')
    ylabel('w(z)')
    hold on
    plot(z,w1,'-','color','b')
    plot(z,w2,'-','color','g')
    %plot(z,w4,'-','color','g')

%%%%%%%%%%%%%%%%%%%%%%% Teilaufgabe d) + e) für Pr 0,7 %%%%%%%%%%%%%%%%%%%%

m=40;  
X=[0 m];                          % initial conditions                                
F=Y(:,1)                          % 1.Spalte der Matrix Y für Temp.-gl.
Pr=0.7;
eta=linspace(0,15);                % um evtl. die Schrittweite zu verkl.
[eta,X]=ode45('Temperaturprofilgleichung',eta,X,[],F,Pr);  
% function Temperaturprofil = Temperaturprofilgleichung(eta,X,flag,F,Pr)
% Temperaturprofil = [    X(2);                 % chi'(eta)  = 0
%                        -Pr*F*X(2) ];            % chi''(eta) = ?
X
%i=length(X)
%size(X(2))
%H=X(:,2);
A=X';      
C=A(end-1)                        
C=str2double(sprintf('%.4f',C));  % Berechnung auf 4-Nachkommastellen runden
lambda=50;                        % angenommener Startwert für Schießmethode

while C~=1;
    while C<1;
    m=m+lambda;
    lambda=lambda/2;
    X=[0 m];
    Pr=0.7;
    [eta,X]=ode45('Temperaturprofilgleichung',eta,X,[],F,Pr);
    A=X';
    C=A(end-1)
    C=str2double(sprintf('%.4f',C));
    end;
    while C>1;
    m=m-lambda;
    lambda=lambda/2;
    X=[0 m];
    [eta,X]=ode45('Temperaturprofilgleichung',eta,X,[],F,Pr);
    A=X';                                % transponieren der Matrix
    C=A(end-1)      % letzter Wert der vorletzten Zeile der Matrix Y in C schreiben
    C=str2double(sprintf('%.4f',C));     % begrenzen der Zahl auf 4 Nachkommastellen
    end;  
    while C==1;
        break;
    end;
end;
C;                       % gibt den Wert für C aus
X07=X  

figure
subplot(2,1,1)
    plot(eta,X07(:,1),'-')                % plot solution X
    %axis([0,0.2,0,1.2])
    title('solution \chi(\eta) with Pr=0,7')
    ylabel('\chi (\eta)')
    xlabel('\eta')
subplot(2,1,2)
    plot(eta,X07(:,2),'-','color','g')               % plot derivative dX/deta
    %axis([0.1,0.2,0,420])
    title('solution \chi´(\eta) with Pr=0,7')
    ylabel('\chi´(\eta)')
    xlabel('\eta')

 


hab gesehen, dass wenn ich den Quelltext einfach nur kopiere und hier einfüge manche Zeilen verrutschen (und dadurch die Kommentare mit den % nicht mehr richtig sind). Wenn man aber einfach alles kopiert und z.B. in den Editor einfügt, stimmen die Zeilen(umbrüche) wieder.

Gruß

Bitte verwende die Code-Umgebung - Danke!
Private Nachricht senden Benutzer-Profile anzeigen
 
matlabNOOP
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 08.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.11.2011, 14:22     Titel:
  Antworten mit Zitat      
ok, wenn es hier gepostet ist, stimmen die Zeilenumbrüche auch wieder (also meinen vorherigen Satz nicht weiter beachten Smile )
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 15.11.2011, 22:21     Titel:
  Antworten mit Zitat      
Hallo matlabNOOP,

Ich kann mit dem geposteten Code leider nichts anfangen.
Es ist immer am effizientesten, wenn Du nur den relevanten Code postest. Ich kann die Definition der Funktion Temperaturprofilgleichung aber immer noch nicht finden.

Ein paar Anmerkungen:
"clear all" löscht alle geladenen Files aus dem Speicher. Das hat überhaupt keinen Vorteil, macht Matlab aber darstisch langsamer, weil die Funktionen wieder nachgeladen werden müssen.

Code:
eta=linspace(0,15);                     % =eta (laufvariable)                                
[eta,Y]=ode45('Blasiusgleichung',eta,Y);

Wieso hat "eta" 100 Elemente als initial value?

Code:
   while B==1;
        break;
    end;

Was soll dies bewirken?! Das break wirkt direkt auf diese while-Schleife. Möchtest Du die äußere Schleife beenden? Meinst Du "if B==1"?
Später taucht das nochmal mit der Variablen C auf.

Code:
subplot(2,2,1)
    plot(eta,Y(:,1),'-','color','g')    % plot solution f
    title('solution f (\eta)')
    xlabel('Variable \eta')
    ylabel('f (\eta)')
  ...
 

Wenn ich es richtig verstanden habe, hat dies und die folgenden Zeilen nichts mit dem Problem zu tuin. Dann verwirren sie nur die Leser.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
matlabNOOP
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 08.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.11.2011, 17:20     Titel:
  Antworten mit Zitat      
Hallo Jan,

der Vektor "eta" hat 100 Einträge, weil das bei MatLab so Standard ist. Mit einer 3. Zahl in der Klammer; also z.B.
eta=linspace(0,15,300);
kann man die Anzahl der Einträge bestimmen (jetzt hätte eta 300 Einträge).

Bei der "while"-Schleife bin ich der Meinung, dass sie funtkioniert. Aber ich denke nochmal über deine Anregung nach.

Ja, die (sub)plot-Befehle haben nichts mit dem eigentlichen Problem zu tun. (sie funtkionieren ja auch bis zur Fehlermeldung).

Weil der ganze Source-Code so lang ist wollte ich ihn ja auch eigentlich nicht komplett posten ...

Gut, dann probier ich es nochmal und kopiere nur den relevanten Code:

Code:

m=40;  
X=[0 m];                          % initial conditions                                
F=Y(:,1)                          % 1.Spalte der Matrix Y für Temp.-gl.
Pr=0.7;
eta=linspace(0,15);                % um evtl. die Schrittweite zu verkl.
[eta,X]=ode45('Temperaturprofilgleichung',eta,X,[],F,Pr);  
% function Temperaturprofil = Temperaturprofilgleichung(eta,X,flag,F,Pr)
% Temperaturprofil = [    X(2);                 % chi'(eta)  = 0
%                        -Pr*F*X(2) ];            % chi''(eta) = ?
X
%i=length(X)
%size(X(2))
%H=X(:,2);
A=X';      
C=A(end-1)                        
C=str2double(sprintf('%.4f',C));  % Berechnung auf 4-Nachkommastellen runden
lambda=50;                        % angenommener Startwert für Schießmethode

while C~=1;
    while C<1;
    m=m+lambda;
    lambda=lambda/2;
    X=[0 m];
    Pr=0.7;
    [eta,X]=ode45('Temperaturprofilgleichung',eta,X,[],F,Pr);
    A=X';
    C=A(end-1)
    C=str2double(sprintf('%.4f',C));
    end;
    while C>1;
    m=m-lambda;
    lambda=lambda/2;
    X=[0 m];
    [eta,X]=ode45('Temperaturprofilgleichung',eta,X,[],F,Pr);
    A=X';                                % transponieren der Matrix
    C=A(end-1)      % letzter Wert der vorletzten Zeile der Matrix Y in C schreiben
    C=str2double(sprintf('%.4f',C));     % begrenzen der Zahl auf 4 Nachkommastellen
    end;  
    while C==1;
        break;
    end;
end;
 



Hier ist eben das Problem, das MatLab in der Zeile:
[eta,X]=ode45('Temperaturprofilgleichung',eta,X,[],F,Pr);
nicht weiter kommt.

Die DGL ist 2. Ordnung und steht in einem anderen script (Temperaturprofil), auf welches mit dem Befehl:
[eta,X]=ode45('Temperaturprofilgleichung',eta,X,[],F,Pr);
zugegriffen wird.

Folgendes steht in dem script:
function Temperaturprofil = Temperaturprofilgleichung(eta,X,flag,F,Pr)
Temperaturprofil = [ X(2); % chi'(eta) = 0
-Pr*F*X(2) ]; % chi''(eta) = ?

Und die Fehlermeldung, welche mir MatLab ausgibt lautet wie folgt:


??? Error using ==> odearguments at 116
TEMPERATURPROFILGLEICHUNG returns a vector of length 101, but the length of initial conditions vector is 2. The vector returned by
TEMPERATURPROFILGLEICHUNG and the initial conditions vector must have the same number of elements.

Error in ==> ode45 at 173
[neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...

Error in ==> Beleg_STM at 126
[eta,X]=ode45('Temperaturprofilgleichung',eta,X,[],F);



Ich hoffe, dass das Prblem jetzt ersichtlicher geworden ist.

Gruß

Bitte Verwende die Code-Umgebung, Danke! Jan S
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.