Здравствуйте!
Стоит задача посчитать методом Симпсона интеграл
.
В нуле я доопределил значение подынтегральной функции до 1 (пролопиталил).
Формула, по которой делал:
Вот код на си++:
Код:
double simp(double lim_a, double lim_b, double h){
int N = static_cast<int>((lim_b - lim_a)/h);
double delta = (lim_b - lim_a)/(6*N);
double result = 0;
result = (func(lim_a+0.000001) + func(lim_a + h*N) + 1)*delta;
int i;
for(i = 2; i <= 2*N-2; i+=2){
result += func(lim_a + 0.5*h*i)*delta*2;
}
for(i = 1; i <= 2*N-1; i+=2){
result += 4*func(lim_a + 0.5*h*i)*delta;
}
return result;
}
(Понимаю, что можно назвать говнокодом.)
На малых значениях шага
погрешность у Симпсона самая маленькая по сравнению с другими методами, как и должно быть. Но преподаватель вводил шаги 0,1 и 0,01 (количество узлов соответственно 10 и 100) и погрешность у метода Симпсона оказывалась самая большая. Сказал, чтоб я разобрался.
Кроме того, я переделал полностью эту функцию по другой формуле и погрешность получается еще большей на больших и даже малых шагах.
Ткните меня пожалуйста носом, где и что я пропустил в программе матанализа и численных методов.
Спасибо.