??? 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.
Verfasst am: 08.11.2011, 21:43
Titel: Re: ODE45-Löser Problem mit Vektorlänge
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?
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)
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.
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:
clearall
%%%%%%%%%%%%%%%%%%%% Teilaufgabe b) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
k=0.3; % startwert der inatial conditions
Y=[00 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=[00 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
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('f´(\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
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.
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.
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)') ...
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
Einstellungen und Berechtigungen
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
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.