Интересно, может быть, часть проблемы заключается в том, что не все интервалы - для каждого размера шага 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
Iref? Что вы имеете в виду под «проверено методами Симпсона» иquad? Оба являются приблизительными. Просьба уточнить. В любом случае, пожалуйста, проясните математику вашего вопроса. SO предназначен для вопросов программирования. - person Argyll   schedule 28.03.2018