Meine Technik, aus „Spalten“-Variablen in einer Tabelle einen Vektor zu erstellen, funktioniert nur zeitweise. Was ist im folgenden Code an K1 und Index anders? Ich debugge eine numerische Methode und brauche den Spaltenindex, X, K1, K2, K, Y. Alles funktioniert einwandfrei, bis ich K1, K2 und K hinzufüge?
FUNKTIONSCODE:
function [index,X,K1,K2,K,Y] = impeulerT(x,y,x1,n)
% modified version of Improved Euler method found in
% Elementary Differential Equations by Edwards and Penney
X=x; % initial x
Y=y; % initial y
x1 = x1; % final x
n = n; % number of subintervals
h = (x1-x)/n; % step size
index = 0; % initialize index
k1=0;
k2=0;
k=0;
for i=1:n; % begin loop
k1=f(x,y); % first slope
k2=f(x+h,y+h*k1); % second slope
k=(k1+k2)/2; % average slope
x=x+h; % new x
y=y+h*k; % new y
X=[X;x]; % update x-column
Y=[Y;y]; % update y-column
index = [index;i]; % update index-column
K1=[K1;k1]; Line 22
K2=[K2;k2];
K= [K;k];
end % end loop
ImprovedEulerTable=table(index,X,K1,K2,K,Y)
end
Anrufcode:
[index,X,K1,K2,K,Y] = impeulerT(0,1,1,10);
PROTOKOLL:
>> [index,X,K1,K2,K,Y] = impeulerT(0,1,1,10);
Undefined function or variable 'K1'.
Error in impeulerT (line 22)
K1=[K1;k1];
22 K1=[K1;k1];
>>
Antwort1
Dieser Code ist besser. Die erste Ausgabezeile könnte geändert werden, um besser mit dem übereinzustimmen, was von Hand gemacht wird. Im Grunde bedeutet das, dass die Spalten K1, K2 und K eine Zeile nach oben verschoben werden könnten. Andere Spalten könnten unverändert bleiben. Dies entspricht jedoch Edwards und Penney. Beachten Sie, wie K1, K2 und K hier definiert sind. Prost! MM
Funktionscode:
function [index,X,Y,K1,K2,K] = impeulerT(x,y,x1,n)
% modified version of Improved Euler method found in
% Elementary Differential Equations by Edwards and Penney
X=x; % initial x
Y=y; % initial y
x1 = x1; % final x
n = n; % number of subintervals
h = (x1-x)/n; % step size
index = 0; % initialize index
% Initialize the lower-case variables
k1=0;
k2=0;
k=0;
% Initialize the upper-case variables
K1=k1;
K2=k2;
K =k;
for i=1:n; % begin loop
k1=f(x,y); % first slope
k2=f(x+h,y+h*k1); % second slope
k=(k1+k2)/2; % average slope
x=x+h; % new x
y=y+h*k; % new y
X=[X;x]; % update x-column
Y=[Y;y]; % update y-column
index = [index;i]; % update index-column
K1=[K1;k1]; % update K1 column
K2=[K2;k2]; % update K2 column
K= [K;k]; % update K column
end % end loop
ImprovedEulerTable=table(index,X,Y,K1,K2,K)
end
Anrufcode:
% Improved Euler
[index,X,Y,K1,K2,K] = impeulerTX(0,1,1,10);
Antwort2
Der Fehler liegt darin, dass in Zeile 22 K1=[K1;k1];
K1 in eckigen Klammern steht, obwohl es vorher nicht definiert war.
Die Lösung besteht darin, vor der For-Schleife zu definieren K1=[];
.
Edit: das gleiche gilt für alle anderen Variablen. Dieser Code funktioniert also
function [index,X,K1,K2,K,Y] = impeulerT(x,y,x1,n)
% modified version of Improved Euler method found in
% Elementary Differential Equations by Edwards and Penney
X=x; % initial x
Y=y; % initial y
x1 = x1; % final x
n = n; % number of subintervals
h = (x1-x)/n; % step size
index = 0; % initialize index
k1=0;
k2=0;
k=0;
% Initialize the upper-case variables
K1=[];
K2=[];
K=[];
for i=1:n; % begin loop
k1=f(x,y); % first slope
k2=f(x+h,y+h*k1); % second slope
k=(k1+k2)/2; % average slope
x=x+h; % new x
y=y+h*k; % new y
X=[X;x]; % update x-column
Y=[Y;y]; % update y-column
index = [index;i]; % update index-column
K1=[K1;k1]; % Line 22
K2=[K2;k2];
K= [K;k];
end % end loop
ImprovedEulerTable=table(index,X,K1,K2,K,Y)
end