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

Методы вычисления определенного интеграла. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 166, средняя оценка - 4.91
ChE
Сообщений: n/a
11.03.2009, 23:27     Методы вычисления определенного интеграла. #1
Здраствуйте, требуется ваша помощь в разработке программы по методам интегрирования. метод Симпсона, Уэддля , Чебышева , Гаусса.
Может кто-то когда-то что-то разрабатывал и может поделиться или я могу дать некоторые теоритические выкладки по данным методам. Просто нужна помощь в алгоритмизации и реализации этого в языке С++.
Заранее благодарен.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.03.2009, 23:27     Методы вычисления определенного интеграла.
Посмотрите здесь:

Составить программу для вычисления определенного интеграла по методу прямоугольников C++
Вычисление определенного интеграла! C++
Вычисление определенного интеграла. C++
C++ Программа вычисления определенного интеграла методом трапеций
C++ Разработать программу для вычисления определенного интеграла методом средних прямоугольников. Проверка курсовой
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1331 / 864 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 1
11.03.2009, 23:37     Методы вычисления определенного интеграла. #2
Цитата Сообщение от ChE Посмотреть сообщение
я могу дать некоторые теоретические выкладки по данным методам.
Вот это давай (просто влом гуглить)
ChE
Сообщений: n/a
12.03.2009, 22:29     Методы вычисления определенного интеграла. #3
http://ru.wikipedia.org/wiki/%D0%A7%...BD%D0%B8%D0%B5

Даю ссылку на википедию , так как там наиболее кратко изложены 3 основных метода, Симпсона , Гаусса и Чебышева.

Добавлено через 22 часа 34 минуты 34 секунды
Хорошо , давайте я поставлю вопрос немного по-другому. Как можно в функцию передавать указатель на функцию. То есть как это реализовать. Помогите на примере кода.
Вот например у меня есть формула метода интегрирования. Пусть метод Симпсона.
I= ((b+a)/6)*(f(a) + 4*f((a+b)/2)) + f(b)) вот это общий вид формулы Симпосна. Теперь мне надо чтобы эта функция считала значения от нескольких функций вида f(x). То есть у меня имеется функция (x+1)^5 , (2x+20)^6 и т.д. Как сделать программу гибкой?
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1331 / 864 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 1
12.03.2009, 22:45     Методы вычисления определенного интеграла. #4
Если правельно понял, то что - то вроде этого
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
#include <iostream>
#include <cmath>
using namespace std;
 
double f1(double x)
{
    return pow((x + 1),5);//(x+1)^5
}
 
double f2(double x)
{
    return pow((2*x + 20),6);//(2x+20)^6
}
 
double fun(double a,double b,  double (*f)(double))
{
    return pow((b+a),6) * (f(a) + 4*f((a+b)/2)) + f(b);//((b+a)/6)*(f(a) + 4*f((a+b)/2)) + f(b))
}
int main()
{
    double I;
    I = fun(5.0,6.0,&f1);
    cout<<I<<endl;
    I = fun(5.0,6.0,&f2);
    cout<<I<<endl;
    return 0;
}
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
12.03.2009, 22:54     Методы вычисления определенного интеграла. #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
// синоним для типа указателя
typedef double (*func_ptr)(double);
 
double SomeIntegral(double _from, double _to, func_ptr _func)
{
    // здесь считаешь интеграл по какой-то формуле для функции _func
    // в пределах от _from до _to.....
}
 
double func1(double x)
{
    return pow(x + 1, 5.0);
}
 
double func2(double x)
{
    return pow(2 * x + 20, 6.0);
}
 
int main()
{
    cout << SomeIntegral(0.0, 1.0, &func1) << endl;
    cout << SomeIntegral(0.0, 1.0, &func2) << endl;
}
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
13.03.2009, 02:37     Методы вычисления определенного интеграла. #6
тоже пример, как массив делать

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
 
#include <stdio.h>
 
typedef double (*FUNCP)(double, double, double, double);
 
double Parabola(double x, double a, double b, double c);
double Gyperbola(double x, double a, double nil1, double nil2);
 
/* вычисляет значения функций из массива */
main()
{
    FUNCP funcs[10];
    int i;
    
    funcs[0] = Parabola;
    funcs[1] = Gyperbola;
    
    for (i = 0; i < 2; i++)
        printf("%10.3f\n", funcs[i](25, 11, -3, 7));
    return 0;
}
 
/* Parabola:  вычисляет значение параболы */
double Parabola(double x, double a, double b, double c)
{
    return a*x*x + b*x + c;
}
 
/* Gyperbola:  вычисляет значение гиперболы */
double Gyperbola(double x, double a, double nil1, double nil2)
{
    return a*1/x;
}
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1331 / 864 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 1
13.03.2009, 02:44     Методы вычисления определенного интеграла. #7
В первые такое увидел.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
13.03.2009, 03:53     Методы вычисления определенного интеграла. #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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 
#include <stdio.h>
#include <math.h>
 
typedef double (*FUNCP)(double);
 
double GaussMethodIntegral(FUNCP fp, double a, double b);
double Gyperbola(double x), Parabola(double x);
 
/* вычисляет интегралы функций методом Гаусса */
main()
{
    FUNCP funcs[10];
    int i;
    
    funcs[0] = Gyperbola;
    funcs[1] = Parabola;
    
    for (i = 0; i < 2; i++)
        printf("%f\n",
            GaussMethodIntegral(funcs[i], 1.0/2, 4.0));
    return 0;
}
 
/* GaussMethodIntegral:  вычисляет интеграл для функции fp методом Гаусса */
double GaussMethodIntegral(FUNCP fp, double a, double b)
{
    return (b-a)/2 * (
         fp((a+b)/2 - (b-a)/(2*sqrt(3))) + 
         fp((a+b)/2 + (b-a)/(2*sqrt(3)))
         );
}
 
/* Gyperbola:  вычисляет значение гиперболы */
double Gyperbola(double x)
{
    return 1/x;
}
 
/* Parabola:  вычисляет значение параболы */
double Parabola(double x)
{
    return x*x;
}
если передавать не 0.5 а 1/2 значение меняется почему-то
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
13.03.2009, 10:26     Методы вычисления определенного интеграла. #9
Цитата Сообщение от accept Посмотреть сообщение
если передавать не 0.5 а 1/2 значение меняется почему-то
Дык, эта.... ясен перец!
1/2 == 0 (целое целочисленно делится на целое, получаем целое)
0.5 - саавэм другое дело!
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
13.03.2009, 10:53     Методы вычисления определенного интеграла. #10
я уж сообразил при детальном рассмотрении
Monte-Cristo
 Аватар для Monte-Cristo
2805 / 1370 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
13.03.2009, 16:49     Методы вычисления определенного интеграла. #11
1./2 вот так вот делить можно
Monte-Cristo
 Аватар для Monte-Cristo
2805 / 1370 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
04.04.2009, 21:02     Методы вычисления определенного интеграла. #12
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
double Simpson(double (*Fx)(double))
{
    double I;
    double h;
    double x;
    double a,b;
    int m;
    
 
    cout << "\n Input integral atributes:\n" << endl;
    cout << "\t-> Enter a = ";
    cin >> a;
 
    cout << "\t-> Enter b = ";
    cin >> b;
 
    cout << "\t-> Enter m = ";
    cin >> m;
 
    h=(b-a)/(m-1);
    x = a;
 
    I = Fx(a) + Fx(b);
    int n=0;
 
    while (n < m-2)
    {
        x = x+h;
        if (n%2==0) I=I+4*Fx(x);
            else  I = I+2*Fx(x);
        n++;
    }
 
    return I*h/3;
}
// -------------------------------------------------------
double Wadell(double (*Fx)(double))
{
 
    double I;
    double h;
    double a,b;
 
    cout << "\n Input integral atributes:\n" << endl;
    cout << "\t-> Enter a = ";
    cin >> a;
 
    cout << "\t-> Enter b = ";
    cin >> b;
 
    h = (b-a)/6;
 
    I = 3*h/10 * (Fx(a) + 5*Fx(a+h) + Fx(a+2*h) + 6*Fx(a+3*h) + Fx(a+4*h) + 5*Fx(a+5*h) + Fx(b)) ;
 
    return  I;
}
// -------------------------------------------------------
double Bode(double (*Fx)(double))
{
 
    double I;
    double h;
    double a,b;
 
    cout << "\n Input integral atributes:\n" << endl;
    cout << "\t-> Enter a = ";
    cin >> a;
 
    cout << "\t-> Enter b = ";
    cin >> b;
 
    h = (b-a)/4;
 
    I = 2*h/45 * (7*Fx(a) + 32*Fx(a+h) + 12*Fx(a+2*h) + 32*Fx(a+3*h) + 7*Fx(b) );
 
    return I;
}
// -------------------------------------------------------
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2009, 22:18     Методы вычисления определенного интеграла.
Еще ссылки по теме:

C++ Составить программу для вычисления определенного интеграла методом Симпсона
C++ Разработать программу для вычисления значения определенного интеграла
Численные методы для вычисления определенного интеграла C++

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

Или воспользуйтесь поиском по форуму:
Sasuke
 Аватар для Sasuke
0 / 0 / 0
Регистрация: 09.10.2009
Сообщений: 89
22.12.2009, 22:18     Методы вычисления определенного интеграла. #13
Подскажите пожалуйста, как решить эту задачу. Объясните хотя бы просто сам принцип. Пожалуйста...
Разработать программу, которая выполняет приближенное вычисление определенного интеграла методом Симпсона. Суть метода Симпсона заключается в следующем: подынтегральная функция заменяется отрезками парабол, а затем вычисляется сумма площадей полученных криволинейных трапеций.
Yandex
Объявления
22.12.2009, 22:18     Методы вычисления определенного интеграла.
Ответ Создать тему
Опции темы

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