С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/75: Рейтинг темы: голосов - 75, средняя оценка - 4.71
11 / 12 / 8
Регистрация: 16.11.2016
Сообщений: 892

Вычисление определённого интеграла методом Симпсона

21.06.2020, 00:31. Показов 15201. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Помогите пожалуйста разобраться с кодом вычисления определённого интеграла методом Симпсона. Код взят с этого же форума ( Решение интеграла методом симпсона ), формулу метода Симпсона предлагаю посмотреть здесь (http://www.mathprofi.ru/formul... pecij.html cntr+f и введите " Формула Симпсона для приближенного вычисления определенного интеграла имеет следующий вид: " ) однако я не могу разобраться:

где разбиений интервала? 15 в 15-ой строке?
что это за цикл в цикле? для чего он?
где коэффициенты? вот эти которые 2, 4 и т.д.
I2 в 14-ой строке это вычисление шага, так ведь?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
double simpson(double a, double b, double e)
{
    double y, x, h, I, I1, I2, I3;
    I2 = 1; h = b - a; I = f(a) + f(b);
    do
    {
        I3 = I2; h = h / 2; I1 = 0; x = a + h;
        do
        {
            I1 = I1 + 2 * f(x);
            x = x + 2 * h;
        } while (x < b);
        I = I + I1;
        I2 = (I + I1)*h / 3;
        x = fabs(I3 - I2) / 15;
    } while (x > e);
    y = I2;
    return y;
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.06.2020, 00:31
Ответы с готовыми решениями:

Составить программу для вычисления определенного интеграла методом Симпсона
ПОМОГИТЕ ПОЖАЛУЙСТА Составить программу для вычисления определенного интеграла методом Симпсона. Вид подынтегральной функции F(x)...

Вычисление определенного интеграла методом трапеции
Помогите написать код, хоть убейте, но не пойму никак Решить задачу, организовав цикл с точностью \varepsilon = 10^{-2},\dots,10^{-6} ...

Вычисление определенного интеграла методом трапеций
Программа вычисления определенного интеграла методом трапеции( с графическим интерфейсом). Буду очень благодарна за помощь

4
11 / 6 / 3
Регистрация: 20.03.2019
Сообщений: 76
21.06.2020, 02:12
Вы уверены, что это метод Симсона? Больше похоже на метод трапеций.

Добавлено через 8 минут
Вот код, где решается задача методом Симсона и всё закомментировано, код не мой, но он понятен и отвечает на все Ваши вопросы.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <math.h>
using namespace std;
 
double f(double x)
{
    return sin(x*x+2*x);    
}
 
int main() {
    double a, b, eps;//Нижний и верхний пределы интегрирования (a, b), погрешность (eps).
    cin >> a >> b >> eps;
    double I=eps+1, I1=0;//I-предыдущее вычисленное значение интеграла, I1-новое, с большим N.
    for (int N=2; (N<=4)||(fabs(I1-I)>eps); N*=2)
    {
        double h, sum2=0, sum4=0, sum=0;
        h=(b-a)/(2*N);//Шаг интегрирования.
        for (int i=1; i<=2*N-1; i+=2)
        {   
            sum4+=f(a+h*i);//Значения с нечётными индексами, которые нужно умножить на 4.
            sum2+=f(a+h*(i+1));//Значения с чётными индексами, которые нужно умножить на 2.
        }
        sum=f(a)+4*sum4+2*sum2-f(b);//Отнимаем значение f(b) так как ранее прибавили его дважды. 
        I=I1;
        I1=(h/3)*sum;
    }
    cout << I1 << endl;
    return 0;
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
21.06.2020, 08:32
Лучший ответ Сообщение было отмечено triatri3 как решение

Решение

Цитата Сообщение от triatri3 Посмотреть сообщение
где разбиений интервала? 15 в 15-ой строке?
Шаг разбиения - величина h. Количество разбиений нигде не хранится - оно никому не нужно.

Цитата Сообщение от triatri3 Посмотреть сообщение
что это за цикл в цикле? для чего он?
Внутренний цикл вычисляет новые слагаемые (см. ниже) для интегральной суммы метода Симпсона для текущего значения шага h.

Внешний цикл уменьшает шаг h в два раза на каждой итерации (строка 7) и затем внутренний цикл снова вычисляет интеграл методом Симпсона для текущего значения шага h. Это процесс повторяется до тех пор, пока шаг h не станет достаточно маленьким для достижения требуемой точности e. Предыдущее значение интеграла сохраняется в переменной I3, а новое, свежевычисленное значение формируется в переменной I2. Но основе анализа разницы между I3 и I2 в строках 15-16 и принимается решение о том, стоит ли продолжать итерации внешнего цикла, т.е. уменьшать шаг h. (Откуда взялся делитель 15 я не знаю. Скорее всего с потолка).

Благодаря тому, что на каждой итерации внешнего цикла шаг h уменьшается в два раза, количество точек разбиения всегда остается четным, как того и требует метод Симпсона.

Автор кода принял во внимание принципиальный момент: каждая последующая итерация внешнего цикла лишь добавляет новые точки разбиения к уже имеющемуся набору старых точек. Поэтому каждая внешняя итерация может унаследовать и переиспользовать промежуточные результаты предыдущей итерации, вместо того, чтобы каждый раз выполнять все вычисления метода Симпсона с нуля. Для каждого нового значения шага h внутренний цикл выполняет вычисления только для новых точек разбиения, а интегральная сумма для старых точек наследуется с предыдущей итерации внешнего цикла (величина I). Новые точки разбиения чередуются со старыми точками, поэтому внутренний цикл шагает с шагом 2*h (строка 11), чтобы "прыгать" только по новым точкам.

Цитата Сообщение от triatri3 Посмотреть сообщение
где коэффициенты? вот эти которые 2, 4 и т.д.
Коэффициент 2 вы видите в строке 10. Коэффициент 4 получается неявно, если сумму I1, вычисленную внутренним циклом, прибавить в общую интегральную сумму I2 два раза. Именно это двойное прибавление вы и видите в строках 13-14.

Цитата Сообщение от triatri3 Посмотреть сообщение
I2 в 14-ой строке это вычисление шага, так ведь?
Какого еще шага??? I2 в 14 строке - это ваш интеграл, только что вычисленный по методу Симпсона.

---

Я не проверял досконально этот код на корректность. Написано очень неудобочитаемо, дезорганизованно и с использованием странных имен переменных. Идеи автор использовал правильные, а нет ли багов в реализации - не скажу.
1
11 / 6 / 3
Регистрация: 20.03.2019
Сообщений: 76
21.06.2020, 14:22
TheCalligrapher, я с Вами согласен, но эта формула в принципе не похожа на метод Симсона. Есть суммирование членов с чётными индексами, а с нечётными нет.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
21.06.2020, 15:38
Цитата Сообщение от Antoniy274 Посмотреть сообщение
TheCalligrapher, я с Вами согласен, но эта формула в принципе не похожа на метод Симсона. Есть суммирование членов с чётными индексами, а с нечётными нет.
Эта формула - в точности метод Симпсона. Все суммирования в ней есть. Как я ясно написал выше, она суммирует только новые точки (нечетные), а сумма для старых точек (четных) наследуется с предыдущей итерации внешнего цикла в готовом виде.

Каждый раз, когда происходит уменьшение шага, все старые точки автоматически становятся четными, а возникающие между ними новые - нечетными. Так что все тут прекрасно суммируется.

В этом и заключается вся суть грамотной реализации такого метода. Если у вас на каждой итерации внешнего цикла явно суммируются все точки, значит вы занимаетесь ерундой, т.е. зачем-то несколько раз делаете одну и ту же работу.

А то, что она вам кажется "в принципе непохожей" - это ваши личные заблуждения. Смотрите внимательнее, и все увидите.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.06.2020, 15:38
Помогаю со студенческими работами здесь

Вычисление определенного интеграла методом трапеций
\int_{a}^{b}x^2tgdx Добавлено через 44 секунды Необходимо решить данный интеграл методом трапеций

Вычисление определенного интеграла методом Гаусса СИ
хелп

Вычисление определенного интеграла методом трапеций
Как можно найти определенный интеграл по методу Трапеций в си? \int\limits_{0}^{4} \frac{ 2x + 1}{ \sqrt{3+x^{3} } }

Вычисление определенного интеграла методом центральных прямоугольников
Создал программу для вычисления определенного интеграла методом центральных прямоугольников, при компиляции ошибок нет, но при запуске...

Вычисление определенного интеграла методом средних прямоугольников
Вот написал прогу для вычисления определенного интеграла. \int_{0}^{2}\left(x^3\cdot e^x \right)dx\\F\left(x...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru