Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/163: Рейтинг темы: голосов - 163, средняя оценка - 4.78
ChE
1

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

11.03.2009, 23:27. Показов 33665. Ответов 13
Метки нет (Все метки)

Здраствуйте, требуется ваша помощь в разработке программы по методам интегрирования. метод Симпсона, Уэддля , Чебышева , Гаусса.
Может кто-то когда-то что-то разрабатывал и может поделиться или я могу дать некоторые теоритические выкладки по данным методам. Просто нужна помощь в алгоритмизации и реализации этого в языке С++.
Заранее благодарен.
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.03.2009, 23:27
Ответы с готовыми решениями:

Численные методы для вычисления определенного интеграла
Добрый вечер, помогите пожалуйста, требуется ваша помощь по разработке программы по методам...

Методы вычисления интеграла
Добрый день. Дано выражение: arcsin(sqrt(x/(1+x))) h=0.001 Получается n= (3-0)/0.001=3000 ...

Точность вычисления определенного интеграла
Не могу понять почему при установке точности вычисления t=1/1000 после запятой в ответе совпадают 2...

Программа вычисления определенного интеграла методом трапеций
Помогитте написать программу в С++: вычисление определенного интеграла по формуле трапеций.

13
Maniac
Эксперт С++
1454 / 955 / 159
Регистрация: 02.01.2009
Сообщений: 2,815
Записей в блоге: 1
11.03.2009, 23:37 2
Цитата Сообщение от ChE Посмотреть сообщение
я могу дать некоторые теоретические выкладки по данным методам.
Вот это давай (просто влом гуглить)
0
ChE
12.03.2009, 22:29 3
http://ru.wikipedia.org/wiki/%... 0%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 и т.д. Как сделать программу гибкой?
Maniac
Эксперт С++
1454 / 955 / 159
Регистрация: 02.01.2009
Сообщений: 2,815
Записей в блоге: 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;
}
1
Эксперт С++
2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
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;
}
1
4851 / 3272 / 466
Регистрация: 10.12.2008
Сообщений: 10,570
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;
}
2
Maniac
Эксперт С++
1454 / 955 / 159
Регистрация: 02.01.2009
Сообщений: 2,815
Записей в блоге: 1
13.03.2009, 02:44 7
В первые такое увидел.
0
4851 / 3272 / 466
Регистрация: 10.12.2008
Сообщений: 10,570
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 значение меняется почему-то
1
Эксперт С++
2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
13.03.2009, 10:26 9
Цитата Сообщение от accept Посмотреть сообщение
если передавать не 0.5 а 1/2 значение меняется почему-то
Дык, эта.... ясен перец!
1/2 == 0 (целое целочисленно делится на целое, получаем целое)
0.5 - саавэм другое дело!
0
4851 / 3272 / 466
Регистрация: 10.12.2008
Сообщений: 10,570
13.03.2009, 10:53 10
я уж сообразил при детальном рассмотрении
0
2808 / 1399 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
13.03.2009, 16:49 11
1./2 вот так вот делить можно
0
2808 / 1399 / 107
Регистрация: 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;
}
// -------------------------------------------------------
1
1 / 1 / 0
Регистрация: 09.10.2009
Сообщений: 89
22.12.2009, 22:18 13
Подскажите пожалуйста, как решить эту задачу. Объясните хотя бы просто сам принцип. Пожалуйста...
Разработать программу, которая выполняет приближенное вычисление определенного интеграла методом Симпсона. Суть метода Симпсона заключается в следующем: подынтегральная функция заменяется отрезками парабол, а затем вычисляется сумма площадей полученных криволинейных трапеций.
0
131 / 157 / 87
Регистрация: 06.04.2016
Сообщений: 992
12.03.2017, 13:02 14
Цитата Сообщение от CheshireCat Посмотреть сообщение
C++
1
typedef double (*func_ptr)(double);
- это как так? Разве он тут правильно написал?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.03.2017, 13:02

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Определить функцию для вычисления определенного интеграла
Определить функцию для вычисления определенного интеграла заданной функции с некоторой точностью...

Разработать программу для вычисления значения определенного интеграла
Разработать программу для вычисления значения определенного интеграла на интервале (a,b подобрать...

Составить программу для вычисления определенного интеграла по методу прямоугольников
Помогите мне, пожалуйста, с задачками. Язык учу недавно совсем, но что-то вызвал он у меня...

Составить программу для вычисления определенного интеграла методом Симпсона
ПОМОГИТЕ ПОЖАЛУЙСТА Составить программу для вычисления определенного интеграла методом...


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

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

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