Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Острослав
0 / 0 / 0
Регистрация: 17.03.2013
Сообщений: 37
#1

Метод трапеций - C++

25.10.2014, 18:39. Просмотров 1042. Ответов 1
Метки нет (Все метки)

Здравствуйте!
Задача состоит в нахождении интреграла методом трапеций. В функцию передаются границы а и b, delta - точность, fnum - номер функции для расчета интреграла.
Проблема в том, что при delta < 1(допустим 0.5) программа выдает очень не точный ответ, хотя точность наоборот вроде как должна повышаться.
Вот, собственно, код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
double solve_integral(double a, double b, double delta, int fnum)
{
    double tmp = 0;                          
    double n = (b - a) / delta;            // Кол-во итераций.
 
    for (double i = 0; i<n; i++)           // Считаем значения в точках и суммируем их.
        tmp += func(fnum, a + (delta*i));  // func возвращает значение функции 
                                           // в точке a + (delta*i).
    tmp = delta*0.5*(tmp + func(fnum, b)); // Умножаем на высоту(delta) и на 1/2 найденные 
                                           // значения функции в точках. 
    return tmp;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2014, 18:39
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Метод трапеций (C++):

Метод трапеций - C++
Добрый день. Кто- то может составить программу вычисления интеграла полинома от a до b с точностью 0.001. Коэффициенты полинома 4ой...

Метод трапеций и прямоугольников - C++
Выручайте.Если до понедельника не сделаю-не поставит препод зачет.Необходимо написать программу на c++/с#.Что бы в ней указать значение...

Интеграл. Метод трапеций - C++
Товарищи, прошу у Вас помощи. Необходимо решить интервал методом трапеции, соответственно в С++. Я думаю вы меня поняли) 1 вариант,...

Численное интегрирование (метод трапеций). Как гарантировать нужную точность? - C++
#include &lt;cmath&gt; #include &lt;iostream&gt; #define PI 3.1415926535 /*----подинтегральная функция---*/ static double INTEGR(const...

Проверьте код,"численные методы,метод трапеций" - C++
Помогите,тут немного не такая формула,как сделать чтобы брался i-1 элемент функции слаживался с f(x) iым делился на два и умножался на...

СЛАУ. Метод обратной матрицы, метод Гаусса, метод Крамера, метод Зейделя - C++
Помогите ребят. Не могу построить алгоритмы для этих методов Язык C++

1
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4307 / 2326 / 575
Регистрация: 18.10.2014
Сообщений: 3,965
25.10.2014, 20:11 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
В "буквальной" реализации метода трапеций площадь каждой трапеции должна считаться на каждой итерации. Т.е. на каждой итерации надо прибавить в общую площадь величину

delta * 0.5 * (func(fnum, a + (delta*i)) + func(fnum, a + (delta*(i + 1))))

Если расписать всю сумму, т.е. вышеприведенную формулу в контексте всех трапеций, и вынести 'delta * 0.5' за скобки, то будет видно, что крайние точки 'func(fnum, a)' и 'func(fnum, b)' участвуют в сумме только один раз, а все промежуточные точки 'func(fnum, a + (delta*i))' - по два раза. Отсюда получаем следующий вариант

C++
1
2
3
4
5
6
7
8
tmp += func(fnum, a);                  // Точку a суммируем только один раз
 
for (double i = 1; i < n; i++)         // Суммируем удвоенные значения в промежуточных точках
  tmp += 2 * func(fnum, a + (delta*i));
 
tmp += func(fnum, b);                  // Точку b суммируем только один раз
 
tmp *= delta * 0.5;                    // Умножаем на высоту(delta) и на 1/2
Заметьте, что цикл - от 1 до n-1. И внутри цикла - удвоенное значение функции.

Но проблема такой реализации (на основе общей суммы) в том, что если 'delta' относительно велика и '(b -a)' не делится нацело на 'delta', то может возникать погрешность из-за огрубленной обработки последней трапеции.

Ну и использовать тип 'double' в качестве целочисленного счетчика цикла - плохая практика. Для 'i' и 'n' следовало бы воспользоваться целым типом...

Добавлено через 54 минуты
Понятно, что можно внести это умножение на 0.5 внутрь обработки значений функций. Тогда умножение на 2 пропадет из цикла, и только крайние точки умножатся на 0.5

C++
1
2
3
4
5
6
7
8
tmp += 0.5 * func(fnum, a);            // Точку a суммируем только один раз
 
for (double i = 1; i < n; i++)         // Суммируем значения в промежуточных точках
  tmp += func(fnum, a + (delta*i));
 
tmp += 0.5 * func(fnum, b);            // Точку b суммируем только один раз
 
tmp *= delta;                          // Умножаем на высоту(delta)
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2014, 20:11
Привет! Вот еще темы с ответами:

Метод медиан из трех элементов VS улучшенный быстрый метод сортировки(метод Бентли-Макилроя) - C++
Здравствуйте! Дали весьма интересное задание. Сравнить два вышеуказанных метода сортировки для массива из 10000 элементов, результаты...

Мой код - метод бисекции, метод секущих (метод хорд) - C++
Всем привет!!! Изучаем в институте С++. Сделал код, и там, и там одна и та же проблема - при любых вбиваемых значениях программа делает...

Решение интеграла методом трапеций? - C++
Добрый день. Штудирую форум второй вечер, не могу найти ответ.. Дана подынтегральная функция x^3 + x – 2; a = 0; b = 3; n = 200....

Вычисление интеграла методом трапеций - C++
Задали в вузе задачу решить интеграл методом трапеций... Всё бы хорошо, если бы не тот факт, что интегралы мы ещё не проходили и даже не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru