qichen wang
qichen wang

Reputation: 9

index must be a positive integer or logical?

k = 0.019;
Pstar = 100;
H = 33;
h = 0.1;
X = 36;
N = round(X/h);
t = zeros(1,N+1);
P = zeros(1,N+1);
P(1) = 84;
t(1) = 0;
yHeun = zeros(1,N+1);
yHeun(1)=84;
a = 1; b = 100;
while b-a >0.5
    c = (a+b)/2;
    for n = 1:N
        t(n+1) = t(n) + h;
        Inside = nthroot(sin(2*pi*t/12),15);
        Harvest = c*0.5*(Inside+1);
        P(n+1) = P(n) + h*(k*P(n)*(Pstar-P(n))-Harvest(n));
        if P < 0
            P = 0;
        end
        yHeun(n+1) = yHeun(n) + h*0.5*((k*P(n)*(Pstar-P(n))-Harvest(n))+(k*P(n+1)*(Pstar-P(n+1))-Harvest(n+1)));
    end
    if sign(yHeun(c)) == sign(yHeun(a))
        c = a;
    else
        c = b;
    end
end
disp(['The root is between ' num2str(a) ' and ' num2str(b) '.'])

This is the code i'm trying to run and i know it probably sucks but im terrible at coding and every time i try to run the code, it says:

Attempted to access yHeun(50.5); index must be a positive integer or logical.

Error in Matlab3Q4 (line 30) if sign(yHeun(c)) == sign(yHeun(a))

I don't have ANY idea how to make yHeun(c or a or whatever) return anything that would be an integer. I dont think i did the while+for loop right either.

Question: "Begin with the higher bound of H being 100 (the high value results in a population of 0 after 36 months), and the lower bound being 1. Put the solver from Problem #3 above in the middle of a while loop and keep bisecting the higher and lower bounds of H until the difference between the higher and lower bound is less than 0.5."

Upvotes: 0

Views: 1069

Answers (1)

anatolyg
anatolyg

Reputation: 28251

I guess that line 30 (with the error) is this one:

if sign(yHeun(c)) == sign(yHeun(a))

Here, I guess c is equal to 50.5, as a result of c = (a+b)/2 above (BTW you can discover whether I guessed right by debugging - try adding disp(c) before line 30).

To force a number to be an integer, use floor:

c = floor((a+b)/2);

It seems you are trying to use some sort of divide-and-conquer algorithm; it should be enough to stop when b - a is equal to 1.

Upvotes: 1

Related Questions