Вычисление ошибок правила трапеции в MATLAB

Я пытаюсь вычислить, как ошибки зависят от шага h для правила трапеции. Ошибки должны уменьшаться с меньшим значением h, но для меня этого не происходит. Это мой код:

Iref - это эталонное значение, вычисленное и проверенное с помощью метода Симпсона и функции quad MATLAB соответственно.

for h = 0.01:0.1:1
    x = a:h:b;
    v = y(x);
    Itrap = (sum(v)-v(1)/2-v(end)/2)*h;
    Error = abs(Itrap-Iref)
end

Я думаю, что что-то не так с тем, как я использую h, потому что правило трапеции работает для известных интегралов. Я был бы очень счастлив, если бы кто-нибудь мог мне помочь с этим, потому что я не могу понять, почему ошибки «прыгают» так, как это происходит.


person Djamillah    schedule 19.06.2014    source источник
comment
Во-первых, обратите внимание, что сходимость вашей суммы Римана как h- ›0 не является монотонной из-за отсутствия лучшего слова. Далее - не могли бы вы объяснить свои методы расчета Iref? Что вы имеете в виду под «проверено методами Симпсона» и quad? Оба являются приблизительными. Просьба уточнить. В любом случае, пожалуйста, проясните математику вашего вопроса. SO предназначен для вопросов программирования.   -  person Argyll    schedule 28.03.2018


Ответы (1)


Интересно, может быть, часть проблемы заключается в том, что не все интервалы - для каждого размера шага h - имеют одинаковые a и b только из-за способа построения x. Попробуйте выполнить следующее с дополнительным оператором fprintf:

for h = 0.01:0.1:1
    x = a:h:b;
    fprintf('a=%f  b=%f\n',x(1),x(end));
    v = y(x);
    Itrap = (sum(v)-v(1)/2-v(end)/2)*h;
    Error = abs(Itrap-Iref);
end

В зависимости от ваших a и b (я выбрал a=0 и b=5) все значения a были идентичны (как и ожидалось), но b варьировалось от 4,55 до 5,0.

Я думаю, что вы всегда хотите, чтобы интервал [a,b] был одинаковым для каждого размера шага, который вы выбираете, чтобы получить лучшее сравнение между каждой итерацией. Таким образом, вместо того, чтобы перебирать размер шага, вы могли бы вместо этого перебирать n, количество равноудаленных подинтервалов в пределах [a,b].

Скорее, чем

for h = 0.01:0.1:1
    x = a:h:b;     

ты мог бы сделать что-то более похожее на

% iterate over each value of n, chosen so that the step size
% is similar to what you had before
for n = [501 46 24 17 13 10 9 8 7 6]

    % create an equally spaced vector of n numbers between a and b
    x = linspace(a,b,n);

    % get the step delta
    h = x(2)-x(1);

    v = y(x);
    Itrap = (sum(v)-v(1)/2-v(end)/2)*h;
    Error = abs(Itrap-Iref);

    fprintf('a=%f  b=%f len=%d h=%f Error=%f\n',x(1),x(end),length(x),h,Error);
end

Когда вы оцените приведенный выше код, вы заметите, что a и b согласованы для каждой итерации, h примерно соответствует тому, что вы выбрали раньше, а Error действительно увеличивается с увеличением размера шага.

Попробуйте описанное выше и посмотрите, что произойдет!

person Geoff    schedule 19.06.2014