This Matlab code is saying Index in position 1 is invalid. Array indices must be positive integers or logical values.

6 次查看(过去 30 天)
when I try to run this code it says "Index in position 1 is invalid. Array indices must be positive integers or logical values.", but both i and n are integers so I am assuming that it has a problem with how I use the cell arrays.
close all, clear, clc
load('EnvironmentalForcing.mat')
Bmax = 1;
uL_min = 6;
uI = 10;
e = 0.001;
Ap = 5000;
Pi = 930.27249;
Si = Pi/Ap;
Li = 0.01*Si;
Ii = 0;
Ri = uI*Ii;
Bi = 1;
Pb = 1;
for i = 1:length(T)
if T(i)>0 && T(i)<35
Tb(i) = (0.000241*(T(i)^2.06737))*((35-T(i))^0.72859);
end
end
j = 1;
for i=1:length(t)
uL(i) = sum(Tb(j:i));
while uL(i) > uL_min
j = j+1;
uL(i) = sum(Tb(j:i));
end
end
B = Bmax*Tb;
p = [B, uL, uI, e, Te, Pb];
y0 = [Pi, Si, Li, Ii, Ri, Bi];
odeFunc = SLIRmodel(tspan, y0, p);
[t,y] = rk4(odeFunc, tspan, y0);
%% Functions
function [dydt] = SLIRmodel(t,y0,p)
%assign parameters
beta = p(1);
uL = p(2);
uI = p(3);
e = p(4);
Te = p(5);
Pb = p(6);
%assign variables
P = y0(1);
S = y0(2);
L = y0(3);
I = y0(4);
R = y0(5);
dPbdt = (0.1724*Pb - 0.0000212*Pb^2)*Te;
dPldt = (1.33*t)*Te;
dPdt = dPbdt + dPldt;
dSdt = (-beta*S*I)+dPdt;
dLdt = (beta*S*I)-((uL^-1)*L)+e;
dIdt = ((uL^-1)*L)-((uI^-1)*I);
dRdt = (uI^-1)*I;
dydt = {dPbdt, dPldt, dPdt, dSdt, dLdt, dIdt, dRdt};
end
function [t, y] = rk4(odeFunc, tspan, y0)
N = length(tspan);
t = tspan;
y = y0;
for n=2:N
for i=1:length(odeFunc)
k1 = odeFunc{i}(t(n), y(n));
k2 = odeFunc{i}(t(n) + 0.5*h, y(n) + 0.5*h*k1);
k3 = odeFunc{i}(t(n) + 0.5*h, y(n) + 0.5*h*k2);
k4 = odeFunc{i}(t(n) + h, y(n) + h*k3);
for j = 1:q
y(j, n+1) = y(j, n) + h*(k1(j) + 2*k2(j) + 2*k3(j) + k4(j))/6;
end
t(n+1) = t(n) + h;
end
end
end

回答(2 个)

Angelo Yeo
Angelo Yeo 2023-11-30
编辑:Angelo Yeo 2023-11-30
Let's look at the code in line 63.
k1 = odeFunc{i}(t(n), y(n));
where odeFunc, t, y are defined like below.
odeFunc =
1×7 cell array
{[0.0121]} {1×1465 double} {1×1465 double} {1×1465 double} {[0.3445]} {[0.0045]} {[0]}
t(1:10) (size: 1x1465)
ans =
0 0.0417 0.0833 0.1157 0.1667 0.2083 0.2500 0.2917 0.3333 0.3750
y =
930.2725 0.1861 0.0019 0 0 1.0000
In your first iteration where n = 2 and i = 1, this may be something MATLAB is commanded to do.
[0.0121](0, 930.2725)

Image Analyst
Image Analyst 2023-11-30

类别

Help CenterFile Exchange 中查找有关 Introduction to Installation and Licensing 的更多信息

产品

Community Treasure Hunt

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

Start Hunting!

Translated by