Форум программистов, компьютерный форум 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. С помощью этой функции найти суммы чисел от А до В и от В до С, если даны числа А, В и С. Я не могу понять, как найти сумму всех целых чисел в Си. Заранее спасибо. подробнее

Показать сообщение отдельно
GRANDEATH
39 / 39 / 1
Регистрация: 13.09.2009
Сообщений: 108
10.10.2009, 12:38  [ТС]     Вычисление интеграла
Вот я решил проверить.. Вруг мы не поняли друг друга)) Вот код проги.. Извиняюсь за кривые комменты...
Код

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;
}


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
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
215
216
217
#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.3; //Коэффициэнт уменьшения
 
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 раза
        
 
    } 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 раза
        //DELTA_DEC  = atan(2.0 * (*n)) * 2 / 3.1415926 - 0.1; //Изменяем коэффициэнт уменьшения
        
        if (DELTA_DEC >= 1)
        {
            cout << "Error... DELTA_DEC < 1.0" << endl;
            break;
        }
 
 
    } while ( fabs(S1-S2) > eps);
 
    return ( (S1+S2) / 2);
 
 
};
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru