Hej!
Behöver hjälp med dels hur man definierar noggrannhetsordningen för fjärdeordningens Runge-Kutta (RK4) samt hur man skulle kunna göra för att implementera det i sin matlabkod för Runge-Kutta. Vet att det är 4(ergo p=4) men vet dock ej hur jag ska visa detta genom det globala trunkeringsfelet.
Har provat köra enligt nedan(koden som står längst ned), får dock fel meddelandet:
Kod:
Index exceeds matrix dimensions.
Error in RungeKuttaorg (line 61)
Re=(R(t(2,:),h)-R(t(2,:),h/2))/(R(t(2,:),h/2)-R(t(2,:),h/4));
Har provat byta index på t så att det istället står:
Kod:
%Noggrannhetsordning
%2^p=(f(t, h) − f(t, h/2))/(f(t, h/2) − f(t, h/4))
Re=(R(t,h)-R(t,h/2))/(R(t,h/2)-R(h/4));
disp([Re]); %Bör bli 16 då p bör vara 4
Och får då istället felmeddelandet:
Kod:
Subscript indices must either be real positive integers or logicals.
Error in RungeKuttaorg (line 61)
Re=(R(t,h)-R(t,h/2))/(R(t,h/2)-R(h/4));
Kod:
clc
clear all
close all
%Runge Kutta
% dR/dt=Ttsi-myR-BRV
% dL/dt=pBRV-myL-aL
% dE/dt=(1-p)BRV+aL-DE
% dV/dT=piE-sigmaV
%CD4=[1000*(1-tao)+R+L+E];
%Konstanter
Gamma=1.36; mu=1.36*10^-3; tao=0.2; B=0.00027;
p=0.1; a=3.6*10^-2; sigma=2; D=0.33; pi=100;
%Definition av funktionshandtag
fR=@(t,R,V) Gamma*tao-mu*R-B*R*V; %Gör så att man kan defiera funktion i script fil
fL=@(t,R,V,L) p*B*R*V-mu*L-a*L;
fE=@(t,R,V,L,E) (1-p)*B*R*V+a*L-D*E;
fV=@(t,V,E) pi*E-sigma*V;
%Initial villkor
L(1)=0; E(1)=0;
R(1)=200; V(1)=4*10^-7;
t(1)=0;
%Tid
h=1; %Stegstorleken
te=120; %Sluttiden
n=ceil(te/h); %Ceil avrundar kvoten te/h till heltal, kvoten anger antal intervall
%Updaterigsloop
for i=1:n
%Updaterar tid
t(i+1)=t(i)+h;
%Updatering av R,L,E,V
k1R=fR(t(i),R(i),V(i));
k1L=fL(t(i),R(i),V(i),L(i));
k1E=fE(t(i),R(i),V(i),L(i),E(i));
k1V=fV(t(i), V(i), E(i));
k2R=fR(t(i)+h/2,R(i)+h/2*k1R,V(i)+h/2*k1V);
k2L=fL(t(i)+h/2,R(i)+h/2*k1R,V(i)+h/2*k1V,L(i)+h/2*k1L);
k2E=fE(t(i)+h/2,R(i)+h/2*k1R,V(i)+h/2*k1V,L(i)+h/2*k1L,E(i)+h/2*k1E);
k2V=fV(t(i)+h/2, V(i)+h/2*k1V, E(i)+h/2*k1E);
k3R=fR(t(i)+h/2,R(i)+h/2*k2R,V(i)+h/2*k2V);
k3L=fL(t(i)+h/2,R(i)+h/2*k2R,V(i)+h/2*k2V,L(i)+h/2*k2L);
k3E=fE(t(i)+h/2,R(i)+h/2*k2R,V(i)+h/2*k2V,L(i)+h/2*k2L,E(i)+h/2*k2E);
k3V=fV(t(i)+h/2, V(i)+h/2*k2V, E(i)+h/2*k2E);
k4R=fR(t(i)+h,R(i)+h*k3R,V(i)+h*k3V);
k4L=fL(t(i)+h,R(i)+h*k3R,V(i)+h*k3V,L(i)+h*k3L);
k4E=fE(t(i)+h,R(i)+h*k3R,V(i)+h*k3V,L(i)+h*k3L,E(i)+h*k3E);
k4V=fV(t(i)+h, V(i)+h*k3V, E(i)+h*k3E);
R(i+1)=R(i)+h/6*(k1R+2*k2R+2*k3R+k4R);
L(i+1)=L(i)+h/6*(k1L+2*k2L+2*k3L+k4L);
E(i+1)=E(i)+h/6*(k1E+2*k2E+2*k3E+k4E);
V(i+1)=V(i)+h/6*(k1V+2*k2V+2*k3V+k4V);
end
%Noggrannhetsordning
%2^p=(f(t, h) − f(t, h/2))/(f(t, h/2) − f(t, h/4))
Re=(R(t(2,:),h)-R(t(2,:),h/2))/(R(t(2,:),h/2)-R(t(2,:),h/4));
disp([Re]); %Bör bli 16 då p bör vara 4
Skulle vara uppskattat om någon vet hur man ska tänka eller vad som kan vara fel.
Tack!