0 / 0 / 1
Регистрация: 28.04.2017
Сообщений: 40
1

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

22.03.2018, 13:18. Показов 3887. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет! Данная программа считает определенный интеграл от функции методом левых прямоугольников с заданной точностью и считает кол-во итераций.

Название: 027.png
Просмотров: 190

Размер: 1.8 Кб - формула метода левых прямоугольников

Все вроде бы понятно, задаем функцию, в цикле описываем эту формулу.. не понятно только, для чего тут используется "typedef" и непонятно, что такое "pointFunc"... в целом не понятна эта строчка
C++
1
typedef double(*pointFunc)(double);
.
Еще не понятен этот цикл.. зачем мы умножаем на 2 кол-во разбиений и для чего вообще нужен этот цикл?
C++
1
2
3
4
5
6
7
  do {
    s = s1;    
    n = 2 * n; 
    s1 = rectangle_integral(f, a, b, n);
    k++;
  }
  while (fabs(s1 - s) > eps);
Код писал не я, я просто его нашел, хочу разобрать его и по аналогии сделать свой сам.
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
#include <iostream>
#include <math.h>
#include <cmath>
using namespace std;
typedef double(*pointFunc)(double);
double f(double x)
{
    if (x==-0.9)
    {
        cout<<"-0.9 isn't allowed!"<<endl;
        
    }
    else
    {
        return x+0.5/(x+0.9)-sin(x)-5;
    }
}
double rectangle_integral(pointFunc f, double a, double b, int n) {
  double x, h;
  double sum = 0.0;
  double fx;
  h = (b - a) / n;  //Шаг
  
  for (int i = 0; i < n; i++) {
    x = a + i*h;
    fx = f(x);
    sum += fx;
  }
  return (sum * h);
}
int main(){
  setlocale(LC_ALL, "Russian");
  double a, b, eps;
  double s1, s;
  int n = 1; 
  
  cout << "\nЛевый предел интегрирования a = ";
  cin >> a;
  cout << "\nПравый предел интегрирования b = ";
  cin >> b;
  cout << "\nТочность eps = ";
  cin >> eps;
  cout << "\nКол-во разбиений n = ";
  cin >> n;
  s1 = rectangle_integral(f, a, b, n); 
  int k=0;
  do {
    s = s1;    
    n = 2 * n; 
    s1 = rectangle_integral(f, a, b, n);
    k++;
  }
  while (fabs(s1 - s) > eps);
  cout << "\nИнтеграл = " << s1 << endl;
  cout<<"Итераций:"<<k<<endl;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.03.2018, 13:18
Ответы с готовыми решениями:

Вычислить интеграл методами левых прямоугольников, трапеций и Симпсона с заданной точностью
Вычислить интеграл 14 ∫ x^3lnxd 06 методами левых прямоугольников, трапеций и...

Для заданной функции вычислить определенный интеграл методом левых, правых и средних прямоугольников
Задача. Для данной функции вычислить определения интеграл методом левых, правых и средних...

Найти определенный интеграл методом левых прямоугольников
f(x)=f(x)=(x^3)+(x^2)+x+1 интервал

Найти определенный интеграл от функции методом прямоугольников
Найти определенный интеграл от функции на отрезке методом прямоугольников, разделив этот отрезок...

2
0 / 0 / 1
Регистрация: 28.04.2017
Сообщений: 40
22.03.2018, 14:22  [ТС] 2
Цитата Сообщение от infaCplus Посмотреть сообщение
Еще не понятен этот цикл.. зачем мы умножаем на 2 кол-во разбиений и для чего вообще нужен этот цикл?
C++
1
2
3
4
5
6
7
  do {
    s = s1;    
    n = 2 * n; 
    s1 = rectangle_integral(f, a, b, n);
    k++;
  }
  while (fabs(s1 - s) > eps);
а, насколько я понял, это подсчитывается кол-во итераций

Добавлено через 16 минут
а, или это метод Рунге.. ничего не понимаю

Добавлено через 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
for (int i(0); i < h*2 ; i++)
 
{
 
y1 = fabs(f(c));
 
c = c - n1;
 
vt = fabs(y1*n1);
 
st = st + vt;
 
}
 
kt = (fabs(s - st) / 2);
 
cout << "kt= " << kt << " st= " << st << " n= " << n << endl;
 
if (kt < n)
 
{ cout << "точность допустимая. метод Рунге выполняется" << endl;
 
true;
 
}
 
else
 
{
 
cout << "низкая точность. увеличте точность" << endl;
 
break;
 
return s;
 
}
 
}
 
}
Весь код:
Кликните здесь для просмотра всего текста
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
//#include "stdafx.h"
 
#include <iostream>
 
#include <math.h>
 
double integral1(double);
 
double integral(double a, double b, double h, double(*f)(double));
 
using namespace std;
 
using namespace std;
 
int main()
 
{
 
setlocale(LC_ALL, "rus_rus.1251");// русский язык вкл
 
double a, b;// пределы интегрирования
 
double h;//шаг
 
cout << "введите пределы интегрирования а= и б= " << endl;
 
cin >> a >> b;
 
// кол-во разбиений
 
cout << "введите кол-во разбиений h =" << endl;
 
cin >> h;
 
//cout << "кол-во =" << n << endl;
 
cout << "integral=" << integral(a, b, h, integral1) << endl;
 
//cout << " = " << n << endl;
 
system("pause");
 
return 0;
 
}
 
double integral(double a, double b, double h, double(*f)(double))
 
{
 
double y(0), s(0), c(0), x(0), n1(0), y1(0);
 
double v(0), v1(0), st(0), vt(0), kt(0);
 
c = b;
 
// cout << " n=" << n << endl;
 
x = b;
 
double n(0);
 
n = (b - a) / h;
 
n1 = (b - a) / ( h*3);
 
while (true)
 
{
 
kt = 0;
 
cout << " h = " << h << endl;
 
s = 0;// обнуление суммы
 
st = 0;
 
for (int i(0); i < h; i++)
 
{
 
y = fabs(f(x));
 
x = x - n;
 
v1 = fabs(y*n);
 
s = s + v1;
 
}
 
for (int i(0); i < h*2 ; i++)
 
{
 
y1 = fabs(f(c));
 
c = c - n1;
 
vt = fabs(y1*n1);
 
st = st + vt;
 
}
 
kt = (fabs(s - st) / 2);
 
cout << "kt= " << kt << " st= " << st << " n= " << n << endl;
 
if (kt < n)
 
{ cout << "точность допустимая. метод Рунге выполняется" << endl;
 
true;
 
}
 
else
 
{
 
cout << "низкая точность. увеличте точность" << endl;
 
break;
 
return s;
 
}
 
}
 
}
 
double integral1(double x)
 
{
 
//return x;
 
return sin(x*2+1)/(x+0.1);
 
}


Добавлено через 20 минут
Так, ну я вроде бы все понял, кроме
C++
1
typedef double(*pointFunc)(double);
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
22.03.2018, 14:25 3
Цитата Сообщение от infaCplus Посмотреть сообщение
Так, ну я вроде бы все понял, кроме
аллиас указателя на фукцию
0
22.03.2018, 14:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.03.2018, 14:25
Помогаю со студенческими работами здесь

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

Вычислить интеграл b a f (x)dx методом левых прямоугольников
Вычислить интеграл f (x)dx заданным методом, воспольвавшись критерием двойного пересчета с...

Определенный интеграл методом прямоугольников
\int_{1,2}^{0,2}(sin(2*x+0,5))\div ( 2+cos(x^2+0,6)) помогите сделать определенный интеграл методом...

Вычислить определенный интеграл методом Симпсона и методом прямоугольников
Помогите плеаз!! методом Симпсона и методом прямоугольников!


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru