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) '.'])
这是我尝试运行的代码,我知道它可能很糟糕,但编码很糟糕,每当我尝试运行代码时,它说:
试图访问yHeun(50.5); index必须是正整数或 逻辑。
Matlab3Q4中的错误(第30行) if sign(yHeun(c))== sign(yHeun(a))
我不知道如何让yHeun(c或a或者其他)返回任何整数。我不认为我做了while + for循环。
问题:&#34;从H的上限开始为100(高值导致36个月后的总体为0),下限为1.放置求解器来自上面的问题#3,在一个while循环的中间,并保持H的上下界平分,直到上下界之间的差值小于0.5。&#34;
答案 0 :(得分:1)
我猜第30行(有错误)是这一行:
if sign(yHeun(c)) == sign(yHeun(a))
在这里,我猜测 c
等于50.5
,因为上面有c = (a+b)/2
(BTW你可以通过调试发现我是否猜对了 - 尝试在第30行之前添加disp(c)
。
要强制数字为整数,请使用floor
:
c = floor((a+b)/2);
似乎你正试图使用某种分而治之的算法;当b - a
等于1时,它应该足够停止。