Не работает реализация Рунге-Кутты 4 порядка MATHLAB
В первой итерации рассчитываются шаги k1,k2,k3,k4, но как только я добавляю последний шаг формулы метода РК X(i+1) = X(i) + 1/6.*(k1X + 2.*k2X + 2.*k3X + k4X) все ломается и в значениях k появляется NaN. Подозреваю, что проблема в переполнении, но как правильно определить функции не понимаю. Вывод, конечно, будет для всех функций, но пока сделала только для Х чтобы легче было ориентироваться по графику. Вот код на MATHLAB:
clc; % Clears the screen
clear;
%coefficients
v = 0.4;
kx = 0.4;
ky = 0.4;
kz = 0.4;
kg = 0.4;
kf = 0.5;
ax = 0.4;
ay = 0.4;
agf = 0.06;
hz = 0.9;
m0 = 1;
%step size
h = 0.04;
tfinal = 100;
n = ceil(tfinal/h);
t = 0:h:100;
%initail conditions
X(1) = 1.0;
Y(1) = 0.0;
Z(1) = 0.0;
G(1) = 5.0;
F(1) = 0.0;
%define function
fx = @(t,X,G) v-ax*X*G-kx*X;
fy = @(t,X,Y,G) ax*X*G+m0*Y-ay*Y*G- ky*Y;
fz = @(t,Y,G,Z) ay*Y*G-kz*Z;
fg = @(t,F,G) -kg*G-agf*G*F;
ff = @(t,F,G,Z) hz*Z-agf*G*F- kf*F;
for i = 1:n
%KuttaSteps
k1X = h*fx(t(i), X(i), G(i));
k1Y = h*fy(t(i), X(i), Y(i), G(i));
k1Z = h*fz(t(i), Y(i), G(i), Z(i));
k1G = h*fg(t(i), F(i), G(i));
k1F = h*ff(t(i), F(i), G(i), Z(i));
k2X = h*fx(t(i)+h/2., X(i)+k1X/2., G(i)+k1G/2.);
k2Y = h*fy(t(i)+h/2., X(i)+k1X/2., Y(i)+k1Y/2., G(i)+k1G/2.);
k2Z = h*fz(t(i)+h/2., Y(i)+k1Y/2., G(i)+k1G/2., Z(i)+k1Z/2.);
k2G = h*fg(t(i)+h/2., F(i)+k1F/2., G(i)+k1G/2.);
k2F = h*ff(t(i)+h/2., F(i)+k1F/2., G(i)+k1G/2., Z(i)+k1Z/2.);
k3X = h*fx(t(i)+h/2., X(i)+k1X/2., Y(i)+k2Y/2.);
k3Y = h*fy(t(i)+h/2., X(i)+k1X/2., Y(i)+k2Y/2., G(i)+k2G/2.);
k3Z = h*fz(t(i)+h/2., Y(i)+k2Y/2., G(i)+k2G/2., Z(i)+k2Z/2.);
k3G = h*fg(t(i)+h/2., F(i)+k2F/2., G(i)+k2G/2.);
k3F = h*ff(t(i)+h/2., F(i)+k2F/2., G(i)+k2G/2., Z(i)+k2Z/2.);
k4X = h*fx(t(i)+h, X(i)+k1X, Y(i)+k3Y);
k4Y = h*fy(t(i)+h, X(i)+k1X, Y(i)+k3Y, G(i)+k3G);
k4Z = h*fz(t(i)+h, Y(i)+k3Y, G(i)+k3G, Z(i)+k3Z);
k4G = h*fg(t(i)+h, F(i)+k3F, G(i)+k3G);
k4F = h*ff(t(i)+h, F(i)+k3F, G(i)+k3G, Z(i)+k3Z);
X(i+1) = X(i) + 1/6.*(k1X + 2.*k2X + 2.*k3X + k4X);
Y(i+1) = Y(i) + 1/6.*(k1Y + 2.*k2Y + 2.*k3Y + k4Y);
Z(i+1) = Z(i) + 1/6.*(k1Z + 2.*k2Z + 2.*k3Z + k4Z);
G(i+1) = G(i) + 1/6.*(k1G + 2.*k2G + 2.*k3G + k4G);
F(i+1) = F(i) + 1/6.*(k1F + 2.*k2F + 2.*k3F + k4F);
end
%plotting
figure(1); clf(1)
plot(t,X)
xlabel('Time')
ylabel('X')