Ошибка индексации матрицы в MATLAB - PullRequest
3 голосов
/ 23 марта 2010

Я получаю эту ошибку в Matlab:

Попытка доступа к r (0,0); Индекс должен быть положительным целым числом или логичной.

Ошибка в ==> Ромберга в 15

Я запустил его с 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 голосов
/ 23 марта 2010

Есть две строки, где вы используете 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

а

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

если вы напишите f_of_x как

sin(x)./x
3 голосов
/ 23 марта 2010

В MATLAB векторы и матрицы индексируются, начиная с 1. Поэтому самая первая строка вашего кода недопустима, потому что индекс для r равен 0.

1 голос
/ 23 марта 2010

У вас ноль подписчиков в

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

Это невозможно в MATLAB - все индексы начинаются с формы 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...