Форум программистов, компьютерный форум CyberForum.ru

Численное интегрирование (метод трапеций). Как гарантировать нужную точность? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Arukasa
3 / 3 / 1
Регистрация: 06.01.2013
Сообщений: 29
16.06.2014, 21:27     Численное интегрирование (метод трапеций). Как гарантировать нужную точность? #1
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <cmath>
#include <iostream>
#define PI 3.1415926535
 
/*----подинтегральная функция---*/
static double INTEGR(const double& x)
{
    return exp(-(x*x)/2) ;
}
 
/*----Интегрирование методом трапеции---*/
static double Trapez(const double& left, const double& right, const double& h)
{
    double sum = 0;
    double runner;
 
    /*Формула трапеции*/
    for(runner = left + h; runner < right; runner += h)
    {
        sum += INTEGR(runner) ;
    }
 
    sum = (sum +  0.5*(INTEGR(left) + INTEGR(right)) ) * h;
 
    return sum * 1 / sqrt(2 * PI);
}
 
int main(int argc, char ** argv)
{
    setlocale(LC_ALL, "Russian");
 
    double a, b;
    double h;
 
    std::cout << "Нижнее значение интеграла: " ;
    std::cin >> a;
    std::cout << "Верхнее значение интеграла: ";
    std::cin >> b;
    std::cout << "Шаг интегрирования: ";
    std::cin >> h;
 
    std::cout <<"Ответ по методу трапеции: " << Trapez(a, b, h) << std::endl; 
 
    return 0;
}
Как гарантировать точность допустим 1e-6 ?

Добавлено через 2 часа 56 минут
up~
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.06.2014, 21:27     Численное интегрирование (метод трапеций). Как гарантировать нужную точность?
Посмотрите здесь:

Численное интегрирование функции C++
C++ Численное интегрирование
C++ Разработать программу «Численное интегрирование»
Интегрирование методом прямоугольников и трапеций C++
C++ Разработать программу «Численное интегрирование» различными методами в С++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IrineK
Заблокирован
16.06.2014, 23:28     Численное интегрирование (метод трапеций). Как гарантировать нужную точность? #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Точность зависит от квадрата шага (ф-ла Котеса).

Самый простой способ:

1) Определяем интеграл I1 с шагом h.
2) Определяем интеграл I2 с шагом h = h/2.
3) Проверяем |I1 - I2| < e. Если нет, то I1 = I2. Переходим на п 2)

Т.е. дробим шаг пока не добьемся нужной точности.
Arukasa
3 / 3 / 1
Регистрация: 06.01.2013
Сообщений: 29
17.06.2014, 12:46  [ТС]     Численное интегрирование (метод трапеций). Как гарантировать нужную точность? #3
Спасибо !

А можете на каком нибудь примере показать ?

Добавлено через 12 часов 5 минут
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <cmath>
#include <iostream>
#include <iomanip>
#define PI 3.1415926535
 
/*----подинтегральная функция---*/
static double INTEGR(const double& x)
{
    return exp(-(x*x)/2) ;
}
 
/*----Интегрирование методом трапеции---*/
static double Trapez(const double& left, const double& right, const double& h)
{
    double sum = 0;
    double runner;
 
    /*Формула трапеции*/
    for(runner = left + h; runner < right; runner += h)
    {
        sum += INTEGR(runner) ;
    }
 
    sum = (sum +  0.5*(INTEGR(left) + INTEGR(right)) ) * h;
 
    return sum * 1 / sqrt(2 * PI);
}
 
int main(int argc, char ** argv)
{
    setlocale(LC_ALL, "Russian");
 
    double a, b;
    double h;
 
    std::cout << "Нижнее значение интеграла: " ;
    std::cin >> a;
    std::cout << "Верхнее значение интеграла: ";
    std::cin >> b;
    //std::cout << "Шаг интегрирования: ";
    //std::cin >> h;
    std::cout << std::endl; 
 
    h = 1;
 
    while (abs(Trapez(a, b, h) - Trapez(a, b, h / 2)) > 1e-6)
    {
        h  /= 2;
    }
 
    std::cout << "Шаг интегрирования: " << h << " Гарантирует точность " << 1e-5 <<std::endl;
    std::cout << "Ответ :" << std::fixed << std::setprecision(6) << Trapez(a, b, h) << std::endl;
 
    return 0;
}
Я правильно вас понял?
IrineK
Заблокирован
17.06.2014, 14:34     Численное интегрирование (метод трапеций). Как гарантировать нужную точность? #4
Не abs, а fabs
Arukasa
3 / 3 / 1
Регистрация: 06.01.2013
Сообщений: 29
17.06.2014, 17:16  [ТС]     Численное интегрирование (метод трапеций). Как гарантировать нужную точность? #5
Это да, спасибо Вам большое !
Arukasa
3 / 3 / 1
Регистрация: 06.01.2013
Сообщений: 29
29.06.2014, 14:34  [ТС]     Численное интегрирование (метод трапеций). Как гарантировать нужную точность? #6
C++
1
2
3
4
while (abs((Trapez(a, b, h) - Trapez(a, b, h / 2)) / 3) > 1e-6)
    {
        h  /= 2;
    }
Еще правильнее будет вот так
IrineK
Заблокирован
29.06.2014, 23:11     Численное интегрирование (метод трапеций). Как гарантировать нужную точность? #7
Не abs, а fabs.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.06.2014, 23:29     Численное интегрирование (метод трапеций). Как гарантировать нужную точность?
Еще ссылки по теме:

C++ Численное интегрирование системы дифференциальных уравнений методом Адамса
Не могу найти ошибку в коде (Численное интегрирование методом Симпсона) C++
C++ Численное интегрирование

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

Или воспользуйтесь поиском по форуму:
Arukasa
3 / 3 / 1
Регистрация: 06.01.2013
Сообщений: 29
29.06.2014, 23:29  [ТС]     Численное интегрирование (метод трапеций). Как гарантировать нужную точность? #8
))
Yandex
Объявления
29.06.2014, 23:29     Численное интегрирование (метод трапеций). Как гарантировать нужную точность?
Ответ Создать тему
Опции темы

Текущее время: 13:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru