Интересно, может быть, часть проблемы заключается в том, что не все интервалы - для каждого размера шага 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