【问题标题】:index must be a positive integer or logical?索引必须是正整数还是逻辑?
【发布时间】:2018-07-01 08:09:08
【问题描述】:
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 符号(yHeun(c)) == 符号(yHeun(a))

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

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

【问题讨论】:

标签: matlab integer bisection


【解决方案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 时应该就足够了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    • 2018-08-25
    • 2016-02-16
    • 2014-09-11
    • 2012-04-14
    相关资源
    最近更新 更多