Top.Mail.Ru
Ответы
Аватар пользователя
8лет
Изменено
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+2

Помогите, не работает подсчет интеграла методом хорд c++

Есть кароч подсчет интеграла, в некоторых случаях он должен выдавать 0, но не тождественный. А мне выдает тождественный, где-то в коде есть ошибка, мне кажется что это из за того что он смотрит на крайние отрезки, потом на центр и делает сразу вывод, как это пофиксить? Благодарю!

Pastebin - https://pastebin.com/qJngdvGZ

Дополнен

не методом хорд, а просто подсчет интеграла)

По дате
По рейтингу
Аватар пользователя
Новичок
8лет

Зачем рекурсия? И зачем столько лишних вычислений значений функции? Метод трапеций прекрасно реализуется простейшими циклами:

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;

Тоже самое деление отрезков пополам, но без лишних вычислений.

Аватар пользователя
Искусственный интеллект
8лет

Это рекуррентный метод интегрирования делением интервала пополам. И да - если функция симметрична относительно абсцисс по краям заданного интервала, погрешность будет меньше заданной и интеграл будет нулевым вне зависимости от того, как функция ведет себя внутри интервала. Чтобы этого избежать, можно ввести параметр минимального количества итераций, например (должен быть равен 2^k-1). Дерзай.