MATLAB中的矩阵索引错误

3
我在Matlab中一直遇到这个错误:
尝试访问r(0,0); 索引必须是正整数或逻辑值。
我使用Romberg(1.3, 2.19,8)运行它。
我认为问题是该语句不合逻辑,因为我将其变成正数,但仍然得到相同的错误。有人有什么想法吗?
function Romberg(a, b, n)
    h = b - a;
    r = zeros(n,n);
    for i = 1:n
        h = h/2;
        sum1 = 0;

        for k = 1:2:2^(i)
            sum1 = sum1 + f(a + k*h);
        end

        r(i,0) = (1/2)*r(i-1,0) + (sum1)*h;

        for j = 1:i
            r(i,j) = r(i,j-1) + (r(i,j-1) - r(i-1,j-1))/((4^j) - 1);
        end
    end
    disp(r);
end

function f_of_x = f(x)
    f_of_x = sin(x)/x;
end
3个回答

6

您有两个地方使用了0作为索引值,这在Matlab中是不允许的:

r(i,0) = (1/2)*r(i-1,0) + (sum1)*h;

并且

r(i,j) = r(i,j-1) + (r(i,j-1) - r(i-1,j-1))/((4^j) - 1);

当 j==1 或 i==1 时。

我建议您从2开始运行循环,并将指数i和j分别替换为(i-1)和(j-1)。

另外:您可以编写以下循环:

for k = 1:2:2^(i)

   sum1 = sum1 + f(a + k*h);

end

as

k = 1:2:2^i;
tmp = f(a + k*h);
sum1 = sum(tmp);

如果你把f_of_x写成

sin(x)./x

1
如果a可能为负数,您可能希望将f(x)定义为f_of_x = sin(x)./x; f_of_x(isnan(f_of_x)) = 1; 或者sinc(x/pi)也可以。 - mtrw

3
在MATLAB中,向量和矩阵的索引从1开始。因此,你代码的第一行是无效的,因为r上的索引为0。

抱歉,那是个打错字了,我不是想把那行代码放在那里。 - Ben Fossen
然而,同样的代码行存在于代码块的中间。它试图分配给r(i,0),这是非法的,因为0是矩阵中的非法索引。 - Will

1

您的代码中没有下标

r(i,0) = (1/2)*r(i-1,0) + (sum1)*h;

在MATLAB中这是不可能的 -- 所有的索引都从1开始。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接