Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Острослав
0 / 0 / 0
Регистрация: 17.03.2013
Сообщений: 37
1

Метод трапеций

25.10.2014, 18:39. Просмотров 1114. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2014, 18:39
Ответы с готовыми решениями:

Метод трапеций
Добрый день. Кто- то может составить программу вычисления интеграла полинома...

Интеграл. Метод трапеций
Товарищи, прошу у Вас помощи. Необходимо решить интервал методом трапеции,...

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

Численное интегрирование (метод трапеций). Как гарантировать нужную точность?
#include &lt;cmath&gt; #include &lt;iostream&gt; #define PI 3.1415926535 ...

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

1
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4608 / 2422 / 674
Регистрация: 18.10.2014
Сообщений: 4,134
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

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

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

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


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

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

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