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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Простая задача. http://www.cyberforum.ru/cpp-beginners/thread55246.html
Пожалуйста помогите кто может, очень нужно Даны натуральное число n, действительные числа a1,...,an (1 и n это нижние индексы). Выяснить образуют ли возрастающую последовательность числа: a1,...,an, 2a1, 3a2,...,(n+1)an (опять же 1, n, 2 нижние индексы). заранее огромное спасибо.
C++ Связь С++ с программой на ассемблере Помогите пожалуйста! Не удается создать связь Borland C++ v5.02 с программой на ассемблере через стек. при удалении строк с вызовом внешней функции и компилированием всё работает. при компилировании с ключом -S вызов функции в Pfar идет near.. программа на С++ файл zad77.cpp /* Главная программа на языке Си для сопряжения с подпрограммой на Ассемблере. http://www.cyberforum.ru/cpp-beginners/thread55230.html
C++ Метод сортировки выбором!!!
ВАРИАНТ 21 Написать программу, которая методом сортировки выбором сортирует введенный пользователем массив слов. Также найти количество операций сравнения и перестановок (присвоений) необходимых для сортировки исходного массива.
C++ проверка символа на принадлежность к буквам русского алфавита
Дан символ. Проверить: является ли данный символ гласной буквой русского алфавита(независимо от регистра). Объясните, пожалуйста, как решить задачу, еще только познаю азы программирования :)
C++ Результат запуска ракеты в зависимости от скорости http://www.cyberforum.ru/cpp-beginners/thread55173.html
Народ помогите пожалуста решить практическую работу, то я многого еще не понимаю. 1. Построить блок-схему, алгоритм и проверить правильность выполнения алгоритма: Составьте алгоритм вычисления суммы цифр введенного с клавиатуры натурального числа от 100 до 999. Например, для числа 128 сумма цифр 11, а для числа 34 сумма цифр 7. 2. Построить блок-схему, алгоритм и проверить правильность...
C++ Proc Описать функцию SumRange (A,B) целого типа, находящую сумму всех целых чисел от А до В включительно (А и В-целые). если А>B, то функция возвращает 0. С помощью этой функции найти суммы чисел от А до В и от В до С, если даны числа А, В и С. Я не могу понять, как найти сумму всех целых чисел в Си. Заранее спасибо. подробнее

Показать сообщение отдельно
odip
Эксперт C++
 Аватар для odip
7225 / 3287 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
10.10.2009, 14:04     Вычисление интеграла
Кажется я понял в чем прикол.
Программа

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
/* Thread 55251 */
 
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
 
/********************************************************************/
typedef double (*func_t)(double);
 
 
/********************************************************************/
#define MAX_COUNT       100
#define FIRST_DELTA     0.0001
 
 
/********************************************************************/
int calc_integral( func_t f, double a, double b, double epsilon,
    double *psum, int *pcount
);
 
double f1( double x );
double integral_f1( double a, double b );
 
double f3( double x );
double integral_f3( double a, double b );
 
 
/********************************************************************/
int main( void ) {
 
int errcode, count, sec1;
clock_t c0, c1;
double a= -1.0, b= 3.0, epsilon= 0.00001;
double sum1, sum2, diff_sum;
 
 
/* Calc */
c0= clock();
errcode= calc_integral( f3, a, b, epsilon, &sum1, &count );
c1= clock()-c0;
sec1= c1/CLOCKS_PER_SEC;
sum2= integral_f3( a, b );
 
diff_sum= fabs(sum1-sum2);
 
/* Print */
printf( "a=%.10f b=%.10f epsilon=%.10f\n", a, b, epsilon );
printf( "sum1=%.10f count=%d sec1=%d errcode=%d\n", sum1, count, sec1, errcode );
printf( "sum2=%.10f\n", sum2 );
printf( "diff_sum=%.10f\n", diff_sum );
 
return 0;
 
} /* main() */
 
 
/********************************************************************/
int calc_integral( func_t f, double a, double b, double epsilon,
    double *psum, int *pcount ) {
 
long i, width;
int count, retcode= 0;
double x, delta, sum0, sum, diff_sum;
 
 
/* Check arguments */
if ( a>=b ) {
    fprintf( stderr, "Invalid arguments\n" );
    exit( 1 );
}
 
/* Calc width, delta */
delta= FIRST_DELTA;
 
/* Loop */
count= 0;
sum0= 0.0;
for ( ; ; ) {
 
    /* Calc width, delta */
    width= (b-a)/delta;
 
    /* Calc sum */
    sum= 0.0;
    for ( i= 0; i<width; i++ ) {
        x= a+i*delta;
        sum+= f( x );
    }
    sum*= delta;
 
    /* Check exit */
    count++;
    diff_sum= fabs( sum0-sum );
    
    printf( "count=%-3d width=%-10ld delta=%.10f sum=%.10f diff_sum=%.10f\n",
        count, width, delta, sum, diff_sum
    );
 
    if ( count>=MAX_COUNT ) { retcode= 1; break; }
    if ( diff_sum<epsilon ) { break; }
 
    /* Next */
    sum0= sum;
    delta*= 0.5;
 
}
 
/* Store */
*psum= sum;
*pcount= count;
 
/* Return */
return retcode;
 
} /* calc_integral() */
 
 
/********************************************************************/
double f1( double x ) {
 
return x;
 
} /* f1() */
 
double integral_f1( double a, double b ) {
 
return (b*b-a*a)/2.0;
 
} /* integral_f1() */
 
 
/********************************************************************/
double f3( double x ) {
 
return x*x*x*x;
 
} /* f3() */
 
 
/********************************************************************/
double integral_f3( double a, double b ) {
 
return (pow(b,5)-pow(a,5))/5.0;
 
} /* integral_f3() */


Вывод программы

Код
> integral.exe
count=1   width=39999      delta=0.0001000000 sum=48.7879011733 diff_sum=48.7879011733
count=2   width=79999      delta=0.0000500000 sum=48.7939502933 diff_sum=0.0060491200
count=3   width=159999     delta=0.0000250000 sum=48.7969750733 diff_sum=0.0030247800
count=4   width=319999     delta=0.0000125000 sum=48.7984875183 diff_sum=0.0015124450
count=5   width=639999     delta=0.0000062500 sum=48.7992437546 diff_sum=0.0007562363
count=6   width=1279999    delta=0.0000031250 sum=48.7996218761 diff_sum=0.0003781216
count=7   width=2559999    delta=0.0000015625 sum=48.7998109378 diff_sum=0.0001890616
count=8   width=5119999    delta=0.0000007813 sum=48.7999054688 diff_sum=0.0000945310
count=9   width=10239999   delta=0.0000003906 sum=48.7999527344 diff_sum=0.0000472656
count=10  width=20479999   delta=0.0000001953 sum=48.7999763672 diff_sum=0.0000236328
count=11  width=40959999   delta=0.0000000977 sum=48.7999881836 diff_sum=0.0000118164
count=12  width=81919999   delta=0.0000000488 sum=48.7999940918 diff_sum=0.0000059082
a=-1.0000000000 b=3.0000000000 epsilon=0.0000100000
sum1=48.7999940918 count=12 sec1=2 errcode=0
sum2=48.8000000000
diff_sum=0.0000059082


Добавлено через 6 минут
Прикол в начальном значении delta !
В зависимости как выбирать delta можно считать 0 секунд, 2 секунды или 30 секунд.
А все из-за выбранного алгоритма.
Просто если сумма изменяется сильно, то сходимость получается плохая и нужно считать дальше и дальше. Но удвоение delta ведет к удвоению времени счета !!!

Добавлено через 50 секунд
Вот и получается что при одном варианте все УЖЕ посчитано за 0 сек, а при кривом варианте сходится только при 30 сек.
 
Текущее время: 23:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru