Я пытаюсь написать программу Matlab для вычисления интеграла с помощью правила трапеции и Симпсона. Программа для трапециевидной формы следующая:
function [int, flag, stats] = trapComp(f, a, b, tol, hMin)
% Initialise variables
h = b - a;
n = 1;
int = h / 2 * (f(a) + f(b));
flag = 1;
if nargout == 3
stats = struct('totalErEst', [], 'totalNrIntervals', [], 'nodesList', []);
end
while h > hMin
h = h / 2;
n = 2 * n;
if h < eps % Check if h is not "zero"
break;
end
% Update the integral with the new nodes
intNew = int / 2;
for j = 1 : 2 : n
intNew = intNew + h * f(a + j * h);
end
% Estimate the error
errorEst = 1 / 3 * (int - intNew);
int = intNew;
if nargout == 3 % Update stats
stats.totalErEst = [stats.totalErEst; abs(errorEst)];
stats.totalNrIntervals = [stats.totalNrIntervals; n / 2];
end
if abs(errorEst) < tol
flag = 0;
break
end
end
end
Теперь, когда правят симпсоны, я не могу обойтись. Я знаю, что это очень похоже, но я не могу понять этого.
Это мой код Симпсона:
function [int, flag, stats] = simpComp(f, a, b, tol, hMin)
% Initialise variables
h = b - a;
n = 1;
int = h / 3 * (f(a) + 4 * f((a+b)/2) + f(b));
flag = 1;
if nargout == 3
stats = struct('totalErEst', [], 'totalNrIntervals', [], 'nodesList', []);
end
while h > hMin
h = h / 2;
n = 2 * n;
if h < eps % Check if h is not "zero"
break;
end
% Update the integral with the new nodes
intNew = int / 2;
for j = 1 : 2 : n
intNew = intNew + h * f(a + j * h);
end
% Estimate the error
errorEst = 1 / 3 * (int - intNew);
int = intNew;
if nargout == 3 % Update stats
stats.totalErEst = [stats.totalErEst; abs(errorEst)];
stats.totalNrIntervals = [stats.totalNrIntervals; n / 2];
end
if abs(errorEst) < tol
flag = 0;
break
end
end
end
Однако использование этого дает ответ для интеграла с большей ошибкой, чем трапециевидный, чего, как мне кажется, не должно быть.
Любая помощь будет оценена
Вы должны опубликовать то, что у вас есть для Симпсонов. Вы должны только публиковать сообщения об ошибках или проблемах. SO пользователи не будут писать за вас код
Я отредактировал свой вопрос
Я чувствую, что расчет ошибки для Симпсона должен быть другим, но я не знаю, как
этот вопрос вообще помогает? Название казалось похожим. stackoverflow.com/questions/44908174/…