Runge Kutta 4 - Oriented Object Alternative to Biological Aplication

3 views (last 30 days)
Hello everyone!
I am trying to develop an alternative version of the Runge-Kutta 4 object-oriented for biological applications.
However, the values are not correct when comparing to the standard system.
Alternative system (TED_MICRO - attached):
%%
%==========================================================================
%
% NECROMASS MOISTURE DYNAMIC MODEL - NMDM
%
% SETUP
%
%==========================================================================
%==========================================================================
clear all;
close all;
%% PREPARATION TO INTEGRATION LOOP
%PARAMETERS
a = 0.5471;
b = 0.0281;
c = 0.8439;
d = 0.0266;
% INITIAL CONDICTIONS
PY(1) = 30.00;
PD(1) = 4.00;
cwd = cwd_init_state(PD,PY); % CWD = COARSE WOODY DEBRIS
% =========================================================================
%% START TIME INTEGRATION LOOP TO ALL SUBMODELS
h = 0.001;
ti = 1;
tf = 100; % TOTAL DAYS
t = ti:h:tf;
for it=1:(length(t)-1)
cwd_rk = cwd_initial_rk(cwd,it); % CWD = COARSE WOODY DEBRIS
for isub=1:4
%%
% =========================================================================
% =========================================================================
%
% RUNGE-KUTTA 4 ORDER INTEGRATION LOOP
%
% =========================================================================
% =========================================================================
% The purpose here is to update the state to the appropriate
% partial-step position
% k1 is calcualated at it
% k2 is calculated at dt_sec/2, k1/2
% k3 is calculated at dt_sec/2, k2/2
% k4 is calculated at dt_sec, k3
% This subroutine updates sub-step diagnostic variables, assuming
% That qmoist is known
cwd_rk = cwd_updates_rk_new(cwd,cwd_rk,it,isub);
cwd_rk = cwd_derivatives_rk(cwd_rk,h,a,b,c,d);
end
%%
% =========================================================================
% =========================================================================
%
% INTEGRATION PROCESS
%
% =========================================================================
% =========================================================================
cwd = cwd_integrate_rk(cwd_rk,cwd,it);
end
ax1 = subplot(2,1,1); % top subplot
x = linspace(0,100);
plot(t,cwd.PY,t,cwd.PD)
title(ax1,'Micro Dynamic:ALTERNATIVE')
ylabel(ax1,'Population Size')
ax2 = subplot(2,1,2); % bottom subplot
plot(cwd.PY,cwd.PD)
title(ax2,'Micro Dependence:ALTERNATIVE')
ylabel(ax2,'Population Size')
Standard system:
clear all;
close all;
h = 0.01;
ti = 1;
tf = 100;
t = ti:h:tf;
PY = zeros(1,length(t));
PD = zeros(1,length(t));
cwd.PY = zeros(1,length(t));
cwd.PD = zeros(1,length(t));
PY(1) = 30.00;
PD(1) = 4.00;
a = 0.5471;
b = 0.0281;
c = 0.8439;
d = 0.0266;
F_PY = @(t,PY,PD) a*PY - b*PY*PD;
F_PD = @(t,PY,PD) -c*PD + d*PY*PD;
for i = 1:length(t)-1
KPY_1 = F_PY(t(i),PY(i),PD(i));
KPD_1 = F_PD(t(i),PY(i),PD(i));
KPY_2 = F_PY(t(i)+h*0.5,PY(i)+h*0.5*KPY_1,PD(i)+h*0.5*KPD_1);
KPD_2 = F_PD(t(i)+h*0.5,PY(i)+h*0.5*KPY_1,PD(i)+h*0.5*KPD_1);
KPY_3 = F_PY(t(i)+h*0.5,PY(i)+h*0.5*KPY_2,PD(i)+h*0.5*KPD_2);
KPD_3 = F_PD(t(i)+h*0.5,PY(i)+h*0.5*KPY_2,PD(i)+h*0.5*KPD_2);
KPY_4 = F_PY(t(i)+h,PY(i)+h*KPY_3,PD(i)+h*KPD_3);
KPD_4 = F_PD(t(i)+h,PY(i)+h*KPY_3,PD(i)+h*KPD_3);
PY(i+1) = PY(i) + (h/6)*(KPY_1+2*KPY_2+2*KPY_3+KPY_4);
PD(i+1) = PD(i) + (h/6)*(KPD_1+2*KPD_2+2*KPD_3+KPD_4);
cwd.PY(i) = PY(i+1);
cwd.PD(i) = PD(i+1);
end
ax1 = subplot(2,1,1); % top subplot
x = linspace(0,100);
plot(t,PY,t,PD)
title(ax1,'Micro Dynamic: STANDART')
ylabel(ax1,'Population Size')
ax2 = subplot(2,1,2); % bottom subplot
plot(PY,PD)
title(ax2,'Micro Dependence: STANDART')
ylabel(ax2,'Population Size')
Can you help me?
I really need to develop object-oriented Runge-Kutta 4.

Answers (0)

Categories

Find more on Programming in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!