Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.97/30: Рейтинг темы: голосов - 30, средняя оценка - 4.97
39 / 39 / 1
Регистрация: 13.09.2009
Сообщений: 108

Вычисление интеграла

08.10.2009, 21:35. Показов 7002. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Считаю интеграл на промедутке от -1 до 3... Интеграл a*a*a*a. Точность вычисления 0.00001... Код выполняется 10-12 секунд. Это нормально или можно оптимизировать? Метод вычисления прямоугольники или трапеции ( в принципе без разницы.. И там и там где-то 10 сек. ) На других функциях ( y = sin x, y = x) менее чем за 150 миллисекунд. Что можете сказать? Приложу код на С++, но это не важно, важен алгоритм...
Код

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
double IntRect(fptr f, double xn, double xk, double eps,long int* n, bool * br)
{
    
    if ( xk <= xn) 
    {
        cout << "Err";
        return 0;
    }
    double S1 = 0, S2;
    double delta = DELTA_PRESET;
 
    (*n) = 0; // Обнуляем число шагов
    DELTA_DEC  = 0.5; //Коэффициент уменьшения 
    do
    {
        S2 = S1;
        S1 = 0;
        
        (*n)++;
        
        //double delta = ( xk - xn ) / eps;
        for (double i = xn; i < xk + delta; i += delta)
        {
            if ( i > xk)
            {
                S1 = S1 * delta; // Умножаем сумму высот на дельта
                S1 = S1 + ( delta - (i - xk) ) * ( f( (i - delta + xk) /2.0)   ); // Находим интеграл последнего отрезка
                break;
            }
            S1 = S1 + f(i + delta / 2.0);
            
        }
        if ( (clock() - t1) > MAX_TIME)
        {
                (*br) = true; // Выполнение прервалось
                break;
        }
        delta *= DELTA_DEC; // Уменьшаем  дельту в DELTA_DEC раза
        
 
    } while ( fabs(S1-S2) > eps);
    return ( (S1+S2) / 2);
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.10.2009, 21:35
Ответы с готовыми решениями:

Вычисление интеграла
задача такая Вычислить с точностью\varepsilon интеграл ,где y=f(x) - прямая проходящая через точки A(c,d) и B - точку минимума ...

Вычисление интеграла
Представить интеграл в виде ряда и вычислить его, используя функцию цикла. Границы интервала и шаг вводить с клавиатуры.

Вычисление интеграла
Нужно вычислить интеграл двумя способами: метод прямоугольников и метод трапеции. Методом прямоугольников что-то получилось, но я не...

24
SonnicK
27.10.2009, 16:59
Студворк — интернет-сервис помощи студентам
люди плиз помогите, нужно сделать прогу чтоб решала интеграл от синуса, косинуса и x в любой степени, и хотя бы 2 методами(прописать чтоб выбрать метод) трапеции и Гаусса, мне дали текст карявой проги пытался исправить(с иксом не правильно высчитывает), половину проблем убрал, но не могу понять по какому он методу сейчас считает,
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
#include "stdafx.h"
#include "iostream"
using namespace std;
#include "math.h"
double integral(double a,double b,double (*f)(double x)); \\поясните что это?
double fun(double a,double b, double x); \\и эт тоже
int n;
double x;
 
 
 
void main()
{
    double a,b,y;
    printf("\n programma integral!");
    printf("\n vvedite znachenie verhney granicy a ");
    scanf("%lf",&a);
    printf("\n vvedite znachenie nizney granicy b ");
    scanf("%lf",&b);
    printf("\n vyberite functsiu ");
    printf("\n 1-sin, \n 2-cos, \n 3-x^z ");
    scanf("%d",&n);
    printf("\n Введите степень х\n ");
    scanf("%d",&x);
    if (n==3)
    {
        double pow(x,z);
    }
    switch (n)
    {
    case 1: y=integral(a,b,sin); break;
    case 2: y=integral(a,b,cos); break;
    case 3: y=fun(a,b,x); break;
    default: printf("\n neverniy vybor "); y=false;]
    }
    printf("\n resultat = %lf",y);
    scanf("%lf",&b);
}
double integral(double a,double b,double (*f)(double x))
{
    return (f(a)+f(b))/2*(b-a);
}
double fun(double a,double b, double x)
{
    return 0;
}
39 / 39 / 1
Регистрация: 13.09.2009
Сообщений: 108
27.10.2009, 20:35  [ТС]
У меня - все считает...4 функции, каждая двумя методами. Немного переделай. И все) Код я выкладывал. См эту тему стр 2 вроде..
0
SonnicK
27.10.2009, 20:42
а чего переделать?)))я имею ввиду что именно?)
39 / 39 / 1
Регистрация: 13.09.2009
Сообщений: 108
27.10.2009, 21:17  [ТС]
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
#include <math.h>
#include <iostream>
#include <iomanip>
#include <time.h>
 
 
#define DELTA_PRESET 0.0001 // Íà÷àëüíûé îòðåçîê
#define TIME_BORDER 300 // Âðåìÿ â ìèëëèñåêóíäàõ äëÿ âûâîäà ïðåäóïðåæäåíèÿ...
#define MAX_TIME 10000 //Ìàêñèìàëüíîå âðåìÿ âûïîëåíèÿ
double  DELTA_DEC  = 0.7; //Êîýôôèöèýíò óìåíüøåíèÿ
 
clock_t t1, t2; // Ïåðåìåííûå äëÿ õðàíèåíèÿ âðåìåíè
 
using namespace std;
 
// Ñòðóêòóðà, ãäå ñîõðàíåíû çíà÷åíèÿ
struct dataS
{
    double method1; // Çíà÷åíèå ìåòîäà 1
    double method2; // Çíà÷åíèå ìåòîäà 2
    double value;  // Èñòèííîå çíà÷åíèå ( êîòîðîå äîëæíû ïîëó÷èòü)
    long int n1; // ×èñëî îòðåçêîâ, ïðè êîòîðûõ äîñòèãíóòà òî÷íîñòü äëÿ ïåðâîãî ìåòîäà
    long int n2; // ×èñëî îòðåçêîâ, ïðè êîòîðûõ äîñòèãíóòà òî÷íîñòü äëÿ âòîðîãî ìåòîäà
    double eps; // Òî÷íîñòü âû÷èñëåíèÿ
    long process_time_1;
    long process_time_2;
    bool break_1;
    bool break_2;
};
 
// Ôóíêöèè, èíòåãðàëû êîòîðûõ íàäî âû÷èñëèòü
double f1(double x)
{
    return (x);
};
double f2(double x)
{
    return (sin( 22 * x ));
};
double f3(double x)
{
    return ( x*x*x*x );
};
double f4(double x)
{
    return (atan(x));
};
 
 
// Ôóíêöèè, êîòîðûå âûîçâðàùàþò òî÷íîå çíà÷åíèå èíòåãðàëà
double f1_res(double a, double b)
{
    return ( (b*b-a*a)/2.0 );
};
double f2_res(double a, double b)
{
    return (  (cos(a*22.0)-cos(b*22.0) )/22.0 );
};
double f3_res(double a, double b)
{
    return (  (b*b*b*b*b-a*a*a*a*a)/5.0 );
};
double f4_res(double a, double b)
{
    return ( b*atan(b)-a*atan(a)-(log(b*b+1)-log(a*a+1))/2.0 );
};
 
 
 
// Ìàññèâ íàøèõ ôóíêöèé
typedef double (* fptr) (double );
typedef double (* fptr_res) (double, double );
 
 
fptr f_array[] = {f1 , f2 , f3 , f4}; // Ìàññèâ óêàçàòåëåé íà ôóíêöèè
fptr_res f_array_res[] = {f1_res , f2_res , f3_res , f4_res}; // Ìàññèâ óêàçàòåëåé íà òî÷íîå çíà÷åíèå ôóíêöèé
 
 
 
 
 
 
 
/*
f - èìÿ èíòåãðèðóåìîé ôóíêöèè,
xn, xk – ãðàíèöû èíòåðâàëà èíòåãðèðîâàíèÿ,
eps – òðåáóåìàÿ òî÷íîñòü,
n – ÷èñëî îòðåçêîâ, ïðè êîòîðîì äîñòèãíóòà òðåáóåìàÿ òî÷íîñòü (âûõîäíîé). 
*/
 
double IntRect(fptr f, double xn, double xk, double eps,long int* n, bool * br)
{
    
    if ( xk <= xn) 
    {
        cout << "Err";
        return 0;
    }
    double S1 = 0, S2;
    double delta = DELTA_PRESET;
 
    (*n) = 0; // Îáíóëÿåì ÷èñëî øàãîâ
    //DELTA_DEC  = 0.5; //Êîýôôèöèåíò óìåíüøåíèÿ   
    do
    {
        S2 = S1;
        S1 = 0;
        
        (*n)++;
        
        //double delta = ( xk - xn ) / eps;
        for (double i = xn; i < xk + delta; i += delta)
        {
            if ( i > xk)
            {
                S1 = S1 * delta; // Óìíîæàåì ñóììó âûñîò íà äåëüòà
                S1 = S1 + ( delta - (i - xk) ) * ( f( (i - delta + xk) /2.0)   ); // Íàõîäèì èíòåãðàë ïîñëåäíåãî îòðåçêà
                break;
            }
            S1 = S1 + f(i + delta / 2.0);
 
            
        }
        if ( (clock() - t1) > MAX_TIME)
        {
                (*br) = true; // Âûïîëíåíèå ïðåðâàëîñü
                break;
        }
        delta *= DELTA_DEC; // Óìåíüøàåì  äåëüòó â DELTA_DEC ðàçà
        cout << "#" << *n <<" Delta = " << delta << endl;
 
 
    } while ( fabs(S1-S2) > eps);
    return ( (S1+S2) / 2);
}
 
 
int print(dataS* data)
{
    cout << endl;
    cout << setw(20) << left <<"Çíà÷åíèå 1:" << setw(12) << right << fixed << data->method1 << endl;
    cout << setw(20) << left <<"×èñëî øàãîâ 1:" << setw(12) << right << data->n1 << endl;
    cout << setw(20) << left <<"Âðåìÿ âûïîëåíèÿ 1-ãî" << setw(12) << right << data->process_time_1;
    if (data->process_time_1 > TIME_BORDER) cout << "  !!!";
    if (data->break_1)  cout << "  break";
    cout<< endl;
 
    cout << setw(20) << left <<"Çíà÷åíèå 2:" << setw(12) << right << fixed << data->method2 << endl;
    cout << setw(20) << left <<"×èñëî øàãîâ 2:" << setw(12) << right << data->n2 << endl;
    cout << setw(20) << left <<"Âðåìÿ âûïîëåíèÿ 2-ãî" << setw(12) << right  << data->process_time_2;
    if (data->process_time_2 > TIME_BORDER) cout << "  !!!";
    if (data->break_2)  cout << "  break";
    cout<< endl;
 
    cout << setw(20) << left <<"Òî÷íîñòü" << setw(12) << right << data->eps << endl;
    cout << setw(20) << left <<"Òî÷íîå çíà÷åíèå" << setw(12) << right  << fixed <<data->value << endl;
 
    
    return 0;
}
 
double IntSum(fptr f, double xn, double xk, double eps,long int* n, bool *br)
{
 
    //DELTA_DEC  = 0.5; //Êîýôôèöèýíò óìåíüøåíèÿ   
    if ( xk <= xn) 
    {
        cout << "Err";
        return 0;
    }
 
    double S1 = 0, S2;
    double f1,f2;
    double delta = DELTA_PRESET;
    (*n) = 0; // Îáíóëÿåì ÷èñëî øàãîâ
    do
    {
        (*n)++;
        S2 = S1;
        S1 = 0;
        
        //double delta = ( xk - xn ) / eps;
        for (double i = xn; i < xk + delta; i += delta)
        {
            if ( i > xk)
            {
                S1 = S1 * delta; // Óìíîæàåì ñóììó âûñîò íà äåëüòà
                S1 = S1 + ( delta - (i - xk) ) * ( f(i-delta) + f(xk)) / 2.0; // Íàõîæèì èíòåãðàë ïîñëåäíåãî îòðåçêà
                break;
            }
            f1 = f(i);
            f2 = f(i + delta);
            S1 = S1 +  ( ( f1 + f2) / 2.0 );
            
 
        }
        if ( (clock() - t1) > MAX_TIME)
        {
                if ( fabs(S1-S2) < eps) break; // Âñå íîðìàëüíî
 
                (*br) = true; // Âûïîëíåíèå ïðåðâàëîñü
                break;
        }
        delta *= DELTA_DEC; // Óìåíüøàåì  äåëüòó â DELTA_DEC ðàçà
        cout << "#" << *n <<" Delta = " << delta << endl;
 
 
    } while ( fabs(S1-S2) > eps);
    cout << endl;
 
    return ( (S1+S2) / 2);
 
 
};
Это funct.h

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
// Lab_7.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include "funct.h"
#include <Windows.h>
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
 
    setlocale(0,"russian");
    cout << "Ââåäèòå òî÷íîñòü âû÷èñëåíèé" << endl;
    
    double eps = 0;
    cin >> eps;
    
    
    dataS *data = new dataS[4]; // Ìàññèâ çíà÷åíèé
    
    // Âû÷èñëÿåì çíà÷åíèÿ èíòåãðàëîâ
    for (int i = 0; i < 4; i++)
    {
        
        
        data[i].break_1 = false; //// Âûïîëíåíèå íå ïðåêðàùåíî
        data[i].n1 = 0;
        Sleep(1);
        t1 = clock();
        data[i].method1 = IntRect(f_array[i], -1, 3, eps, &(data[i].n1), &(data[i].break_1));
        t2 = clock();
        data[i].process_time_1 = t2 - t1;
 
        
        data[i].break_2 = false; // Âûïîëíåíèå íå ïðåêðàùåíî
        data[i].n2 = 0;
        Sleep(1);
        t1 = clock();
        data[i].method2 = IntSum(f_array[i], -1, 3, eps, &(data[i].n2), &(data[i].break_2));
        t2 = clock();
        data[i].process_time_2 = t2 - t1;
 
        data[i].eps = eps; 
        data[i].value = f_array_res[i](-1,3);
    }
 
 
    //cout << IntRect(f_array[0], 01, 0,1, NULL);
 
    for (int i = 0; i < 4; i++)
    {
        cout << endl << endl << endl;
        cout << "Funct#" << i << endl;
        print(&(data[i]));
        
    }
 
 
    // Î÷èñòêà ïàìÿòè
    delete data;
    return 0;
}
- Это сам cpp

Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
// Функции, интегралы которых надо вычислить
double f1(double x)
{
        return (x);
};
double f2(double x)
{
        return (sin( 22 * x ));
};
double f3(double x)
{
        return ( x*x*x*x );
};
double f4(double x)
{
        return (atan(x));
};
- это 4 функции, интегралы которых считает код.. Указывай вместо них свои...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Ôóíêöèè, êîòîðûå âûîçâðàùàþò òî÷íîå çíà÷åíèå èíòåãðàëà
double f1_res(double a, double b)
{
    return ( (b*b-a*a)/2.0 );
};
double f2_res(double a, double b)
{
    return (  (cos(a*22.0)-cos(b*22.0) )/22.0 );
};
double f3_res(double a, double b)
{
    return (  (b*b*b*b*b-a*a*a*a*a)/5.0 );
};
double f4_res(double a, double b)
{
    return ( b*atan(b)-a*atan(a)-(log(b*b+1)-log(a*a+1))/2.0 );
};
Это точное значение интеграла... Указывай точное значение F(x) = интеграл f(x)
то есть пусть надо найти интеграл от y = x*x. В первой
C++
1
2
3
4
double f1(double x)
{
        return (x*x); // Это х квадрат
};
Во второй
C++
1
2
3
4
double f1_res(double a, double b)
{
    return ( (b*b*b-a*a*a)/3.0 ); // Это определенный интеграл от x*x
};
0
DevilVergil
31.03.2010, 01:03
GRANDEATH, в принципе, выполнение кода может занять 10-12 сек., в зависимости от того, как написать функцию. Хочешь оптимизировать - попробуй поменять класс памяти для наиболее значимых элементов, но при такой точности...Ведь обращение идет не к одной функции. При твоем подходе вряд ли что то поможет, нужно коренным образом перестроить программу.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.03.2010, 01:03

Вычисление интеграла
помогите пожалуйста я вообще не знаю как сделать интеграл

Вычисление интеграла
не могу понять как решить....:wall: помогите }int main() { int i; double I; double n, h, x=0, y; char C; ...

Вычисление интеграла
вычислить интеграл \int_{0}^{6}\frac{exp^sqrt{\frac{6-x}{6+x}}}{(6+x)*\sqrt{36-x^2}} помогите с кодом вычисления данного...

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

вычисление интеграла
Даны вещественные числа a, b. Значения функции f(x)=(x+1)2√lg x; a=2; b=10; записать в массив. Вычислить значение интеграла, используя: ...


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru