


Помогите, не работает подсчет интеграла методом хорд c++
Есть кароч подсчет интеграла, в некоторых случаях он должен выдавать 0, но не тождественный. А мне выдает тождественный, где-то в коде есть ошибка, мне кажется что это из за того что он смотрит на крайние отрезки, потом на центр и делает сразу вывод, как это пофиксить? Благодарю!
Pastebin - https://pastebin.com/qJngdvGZ
не методом хорд, а просто подсчет интеграла)
Зачем рекурсия? И зачем столько лишних вычислений значений функции? Метод трапеций прекрасно реализуется простейшими циклами:
long double S1, S2, h1, h2;
h2 = (b - a);
S2 = (func1(a) + func1(b)) / 2.0;
do {
h1 = h2;
S1 = S2;
h2 = h2 / 2.0;
// Именно так - x присваиваем h2, а сдвигаем на h1
for(long double x = h2; x < b; x += h1) { S2 += func1(x); }
} while(abs(S1 * h1 - S2 * h2) >= eps);
return S2 * h2;
Тоже самое деление отрезков пополам, но без лишних вычислений.
Это рекуррентный метод интегрирования делением интервала пополам. И да - если функция симметрична относительно абсцисс по краям заданного интервала, погрешность будет меньше заданной и интеграл будет нулевым вне зависимости от того, как функция ведет себя внутри интервала. Чтобы этого избежать, можно ввести параметр минимального количества итераций, например (должен быть равен 2^k-1). Дерзай.