0
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 必须是正整数或逻辑整数。

如果符号(yHeun(c))==符号(yHeun(a)),则Matlab3Q4(第30行)中的错误

我不知道如何让 yHeun(c or a or whatever) 返回任何整数。我认为我也没有正确执行 while+for 循环。

问题:“从 H 的上限为 100 开始(高值导致 36 个月后人口为 0),下限为 1。将上面问题 #3 的求解器放在 while 循环的中间,然后继续平分 H 的上限和下限,直到上限和下限之间的差异小于 0.5。”

4

1 回答 1

1

第 30 行(有错误)是这一行:

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

在这里,我 c等于50.5,由于c = (a+b)/2上面的结果(顺便说一句,您可以通过调试发现我是否猜对了 - 尝试disp(c)在第 30 行之前添加)。

要强制数字为整数,请使用floor

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

看来您正在尝试使用某种分而治之的算法;b - a当等于 1时停止应该足够了。

于 2015-06-01T01:39:54.110 回答