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

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

08.10.2009, 21:35. Показов 6806. Ответов 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
Ответ Создать тему
Новые блоги и статьи
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
Текстовый слайдер с нумерацией страниц и кроссбраузерность.
russiannick 18.07.2026
Один мой друг написал текстовый слайдер с нумерацией страниц. Сегодня я расскажу как он умудрился подружить его с кроссбраузерностью. Очевидно сложно угодить с шириной каждому браузеру. Один крадет. . .
Грибы - это мемы, дерево - это человек. Применение микоризной модели к теории меметики Докинза.
anaschu 18.07.2026
Меметический изоморфизм теории «всего»: Грибная сукцессия как модель эволюции идей Докинза Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а универсальную. . .
Грибы - это корпорации, деревья - это государства. Механизм массонского захвата власти
anaschu 18.07.2026
Макроэкономический изоморфизм теории «всего»: Грибная сукцессия как модель транснационального капитализма Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а. . .
Расчёт периметра прямоугольника по координатам вершин
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Вычислить периметр прямоугольника, заданного координатами своих вершин на плоскости. Решение: Создан документ со следующими. . .
Подсчёт частоты трёхбуквенных слов в тексте
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Выясните, сколько раз в предложенном тексте встречается каждое трехбуквенное слово. Решение: Создан документ с единственным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru