Форум программистов, компьютерный форум, киберфорум
Наши страницы
Turbo Pascal
Войти
Регистрация
Восстановить пароль
 
scherbakovss201
15 / 6 / 16
Регистрация: 22.12.2015
Сообщений: 1,522
#1

Вычисление определенного интеграла методом правых прямоугольников - Turbo Pascal

04.08.2017, 15:38. Просмотров 348. Ответов 9
Метки нет (Все метки)

Число уравнений 3
y=a*x*x*x+b*x+c
y=a*cos(x+b)+c
y=a*In[x+b]+c
Коэффициенты a,b,c -вещественные числа.Пределы интегрирования вещественные числа. лежащие в пределах -1000 до 1000.Число интервалов разбиения не более 500.Все параметры водяться с клавиатуры или считываються из файла по выбору пользователя.Имя файла задается пользователем.Выдать на экран точное и приближенное значение интеграла ,абсолютную и относительную погрешность.Отобразить на экране с учетом масштабирования процесс вычисления интеграла.
http://www.cyberforum.ru/turbo-pascal/thread819921.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.08.2017, 15:38
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Вычисление определенного интеграла методом правых прямоугольников (Turbo Pascal):

Вычисление определенного интеграла по формуле прямоугольников с погрешнотью е
Составить программу вычисления определенного интеграла по формуле...

Программа вычисления определенного интеграла методом прямоугольников
\int_{0,2}^{0,8}e^xdx

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

Вычисление интеграла методом прямоугольников
Необходимо вычислить интеграл sinx/x методом прямоугольников. Есть программа,...

Вычисление интеграла cos(x) на отрезке (-1; 2) методом прямоугольников
Необходимо найти интеграл cos(x) на отрезке (-1;2) методом прямоугольников....

9
ZX Spectrum-128
Модератор
Эксперт Pascal/Delphi
3858 / 2845 / 3631
Регистрация: 05.06.2014
Сообщений: 13,940
05.08.2017, 18:23 #2
http://www.cyberforum.ru/turbo-pascal/thread116864.html
0
scherbakovss201
15 / 6 / 16
Регистрация: 22.12.2015
Сообщений: 1,522
05.08.2017, 18:36  [ТС] #3
Цитата Сообщение от ZX Spectrum-128 Посмотреть сообщение
Процедуры для метода левых и правых прямоугольников
type
TIntFunc = function(X: Double): Double;

Pascal
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
function RightPramInt(a, b: Double; eps: Double; IntF: TIntFunc): Double;
var
//S - площадь на предыдущей итерации,
//step - "толщина" прямоугольника
//gran - передвигаемая от a до b граница
//n - число прямоугольников, удваивается на каждой итерации
S, step, gran: Double;
n: integer;
begin
//Сначала приближение одного прямоугольника
step := b - a;
Result := IntF(b) * step;
n := 1;
repeat
S := Result;
n := n * 2;
step := (b - a) / n;
Gran := b;
Result := 0;
//Ниже - просто вычисляем площади новых прямоугольников
while a < gran do
begin
Result := Result + IntF(gran) * step;
gran := gran - step;
end;
until abs(S - Result) <= eps;
end;
А куда мне вставить три мои уравнения?
0
MansMI
1447 / 1156 / 549
Регистрация: 08.01.2012
Сообщений: 4,509
06.08.2017, 12:07 #4
при -1000;1000 500 шагов маловато
0
scherbakovss201
15 / 6 / 16
Регистрация: 22.12.2015
Сообщений: 1,522
06.08.2017, 13:41  [ТС] #5
Цитата Сообщение от MansMI Посмотреть сообщение
при -1000;1000 500 шагов маловато
Я думаю количество шагов можно через консоль у пользователя запросить,а 500 єто минимум.Куда єто дело Вставить.Бо чего то не пойму.
0
MansMI
1447 / 1156 / 549
Регистрация: 08.01.2012
Сообщений: 4,509
06.08.2017, 13:53 #6
Цитата Сообщение от scherbakovss201 Посмотреть сообщение
не более 500
Pascal
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
function f1a(a,b,c,x:real):real;
begin
   f1a:=a*x*x*x+b*x+c;
end;
 
function f1b(a,b,c,x:real):real;
begin
   f1b:=a/4*x*x*x*x+b/2*x*x+c*x;
end;
 
var a,b,c,s1a,s1b:real;
    x,h,x1,x2:real;
begin
   write('a b c:');
   readln(a,b,c);
   write('[x1;x2]:');
   readln(x1,x2);
   h:=(x2-x1)/500;
   x:=x1+h;
   s1a:=0;
   while x<x2+h/2 do
   begin
      s1a:=s1a+f1a(a,b,c,x)*h;
      x:=x+h;
   end;
   s1b:=f1b(a,b,c,x2)-f1b(a,b,c,x1);
   writeln('s1=',s1a,'=',s1b);
   readln;
end.
0
Puporev
Модератор
54132 / 41765 / 28875
Регистрация: 18.05.2008
Сообщений: 98,296
06.08.2017, 13:56 #7
Вообще надо бы сначала подобрать значения a,b,c такие что графики этих функций образовывали замкнутую фигуру.
Затем найти каким-либо способом 3 точки пересечения этих графиков. А уж затем искать площадь этой фигуры от х1 до х3 путем вычисления интегралов нижней функции и функции лежащей над ней, высота прямоугольника будет
Pascal
1
h:=abs(Int(f1(x))-Int(f2(x)));
Предварительно нужно описать тип function
Pascal
1
type func(x,a,b,c:real);
Написать функцию интеграла и потом считать.
Для примера для двух функций.
Pascal
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
const n=20;{количество разбиений}
      a=0;
      b=pi/2;
      e=0.001;{точность}
type func=function(x:real):real;
{$F+} {функции по условию}
function F(x:real):real;
begin
F:=cos(x)-exp(x)+1;
end;
function F1(x:real):real;
begin
F1:=cos(x);
end;
function F2(x:real):real;
begin
F2:=exp(x)-1;
end;
{$F-}
{вычисление интеграла методом прямоугольников}
function Integral(f:func;xn,xk:real):real;
var h,x,s:real;
    i:integer;
begin
h:=(xk-xn)/n;
x:=xn+h/2;
s:=0;
for i:=1 to n do
 begin
  s:=s+f(x);
  x:=x+h
 end;
Integral:=s*h;
end;
var c,x1,x2,x,p:real;
begin
{найдем точку пересечения графиков методом бисекции}
x1:=a;
x2:=b;
c:=(x1+x2)/2;
repeat
c:=(x1+x2)/2;
if F(x1)*F(c)<=0 then x2:=c else x1:=c;
until abs(x2-x1)<e;
x:=(x1+x2)/2;
writeln('Ордината пересечения графиков=',x:0:3);
{определим площадь фигуры}
p:=Integral(F2,a,x)+Integral(F1,x,b);
write('Площадь фигуры=',p:0:3);
end.
Но Ваша задача намного сложнее, я бы за нее не взялся чтобы не убить остатки своего мозга.
0
ФедосеевПавел
Модератор
3414 / 1911 / 815
Регистрация: 01.02.2015
Сообщений: 6,451
06.08.2017, 14:33 #8
Давайте сделаем поправку на подготовку ТС в математике.

А это задача не на функциональный тип? Когда нужно одну функцию расчёта интеграла вызвать три раза для трёх разных функций y(x), разными диапазонами интегрирования и шагами интегрирования? Обычно, студенты пишут для этого три программы, но здесь - не повезло.

Да, что гадать. Пусть scherbakovss201 прояснит ситуацию.
0
scherbakovss201
15 / 6 / 16
Регистрация: 22.12.2015
Сообщений: 1,522
06.08.2017, 14:46  [ТС] #9
Саму задачу я озвучил в первом посте.Есть три разных уравнения,переменные задаються пользователем и количество шагов тоже.
Далее три функции на решение трех уравнений и по каждой график,желательно разными цветами дабы отличать.
0
ФедосеевПавел
Модератор
3414 / 1911 / 815
Регистрация: 01.02.2015
Сообщений: 6,451
06.08.2017, 17:55 #10
Что-то я уже устал.
scherbakovss201, доделайте самостоятельно весь ввод и вывод погрешностей.
Pascal
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
{.$mode TP}
program Integrals;
 
uses
  graph;
 
const
  Nmax = 500;
var
  a, b, c: real;
type
  TIntFunc = function(X: real): real;
  TVector  = array[0..Nmax] of real;
 
  function y1(X: real): real;
  begin
    y1 := a * X * X * X + b * X + c;
  end;
 
  function y2(X: real): real;
  begin
    y2 := a * cos(X + b) + c;
  end;
 
  function y3(X: real): real;
  begin
    y3 := a * ln(X + b) + c;
  end;
 
  function IntSquareR(a, b: real; n: integer; F: TIntFunc): real;
  var
    Res: real;
    h: real; {величина шага}
    x: real;
    i: integer;
  begin
    h := (b - a) / n;
    Res := 0;
    i := 1;
    while i <= n do
    begin
      x := a + i * h;
      Res := Res + F(x);
      Inc(i);
    end;
    Res := h * Res;
    IntSquareR := Res;
  end;
 
  function Min(a, b: real): real;
  begin
    if a < b then
      Min := a
    else
      Min := b;
  end;
 
  function Max(a, b: real): real;
  begin
    if a > b then
      Max := a
    else
      Max := b;
  end;
 
  procedure Plot(N: integer; const x, y: TVector; Color: integer;
    Mx, My: real; Xborder, Yborder: integer; Xmin, Xmax, Ymin, Ymax: real);
  var
    i: integer;
  begin
    {пересчёт, т.к. экранная координата Y увеличивается вниз}
    Yborder := GetMaxY - Yborder;
    SetColor(Color);
    moveto(Xborder + round((x[0] - Xmin) * Mx), Yborder - round((y[0] - Ymin) * My));
    for i := 1 to N do
      lineto(Xborder + round((x[i] - Xmin) * Mx), Yborder - round((y[i] - Ymin) * My));
  end;
 
var
  i:  integer;
  Mx, My: real;{масштабные коэффициенты}
  Ymin, Ymax: real;{минимум и максимум значений функций на графике}
  Xmin, Xmax: real;{минимум и максимум значений аргумента на графике}
  Xborder, Yborder: integer;{отступ вокруг графика}
  dX: real;
  x, y1a, y1i, y2a, y2i, y3a, y3i: TVector;
  N:  integer;
  Xstart, Xfinish: real;
begin
  a := 3;
  b := 7;
  c := 12;
  Xstart := -Pi;
  Xfinish := Pi;
  N := 6;
 
  initgraph(Xborder, Yborder, '');
  {отступы от края экрана}
  Xborder := GetMaxX div 20;
  Yborder := GetMaxY div 20;
  {табуляция трёх функций и их интегралов}
  {значения при x=Xstart вычисляются отдельно, т.к.
  для ускорения расчётов значения интегралов удобнее вычислять адаптивно}
  dX := (Xfinish - Xstart) / N;
 
  x[0] := Xstart;
  y1a[0] := y1(Xstart);
  y2a[0] := y2(Xstart);
  y3a[0] := y3(Xstart);
  y1i[0] := 0;
  y2i[0] := 0;
  y3i[0] := 0;
  for i := 1 to N do
  begin
    x[i] := Xstart + dX * i;
    y1a[i] := y1(Xstart + dX * i);
    y2a[i] := y2(Xstart + dX * i);
    y3a[i] := y3(Xstart + dX * i);
    y1i[i] := y1i[i - 1] + IntSquareR(Xstart + dX * (i - 1), Xstart + dX * i, 1, y1);
    y2i[i] := y2i[i - 1] + IntSquareR(Xstart + dX * (i - 1), Xstart + dX * i, 1, y2);
    y3i[i] := y3i[i - 1] + IntSquareR(Xstart + dX * (i - 1), Xstart + dX * i, 1, y3);
  end;
  {поиск минимума и максимума}
  Ymin := y1a[0];
  Ymax := Ymin;
  for i := 0 to N do
  begin
    Ymin := min(Ymin, y1a[i]);
    Ymin := min(Ymin, y2a[i]);
    Ymin := min(Ymin, y3a[i]);
    Ymin := min(Ymin, y1i[i]);
    Ymin := min(Ymin, y2i[i]);
    Ymin := min(Ymin, y3i[i]);
 
    Ymax := max(Ymax, y1a[i]);
    Ymax := max(Ymax, y2a[i]);
    Ymax := max(Ymax, y3a[i]);
    Ymax := max(Ymax, y1i[i]);
    Ymax := max(Ymax, y2i[i]);
    Ymax := max(Ymax, y3i[i]);
  end;
  {значения Xmin и Xmax можно взять, как начальное и конечное, хотя в общем виде это не так}
  Xmin := Xstart;
  Xmax := Xfinish;
 
  Mx := (GetMaxX - 2 * Xborder) / (Xmax - Xmin);{масштаб по Х}
  My := (GetMaxY - 2 * Yborder) / (Ymax - Ymin);
  {построение осей - рамки}
  settextstyle(0, 0, 1);
  line(Xborder, Yborder, GetMaxX - Xborder, Yborder);
  line(Xborder, GetMaxY - Yborder, GetMaxX - Xborder, GetMaxY - Yborder);
  line(Xborder, Yborder, Xborder, GetMaxY - Yborder);
  line(GetMaxX - Xborder, Yborder, GetMaxX - Xborder, GetMaxY - Yborder);
  {названия (легенды)}
  setcolor(10);
  outtextXY(100, Yborder + 10, 'y(x) = a * x * x * x + b * x + c');
  setcolor(11);
  outtextXY(100, Yborder + 30, 'y(x) = a * cos(x + b) + c');
  setcolor(12);
  outtextXY(100, Yborder + 50, 'y(x) = a * ln(x + b) + c');
  setcolor(13);
  outtextXY(100, Yborder + 70, 'y(x) = Int(a * x * x * x + b * x + c)');
  setcolor(14);
  outtextXY(100, Yborder + 90, 'y(x) = Int(a * cos(x + b) + c)');
  setcolor(15);
  outtextXY(100, Yborder + 110, 'y(x) = Int(a * ln(x + b) + c)');
  {построение графиков}
  Plot(N, x, y1a, 10, Mx, My, Xborder, Yborder, Xmin, Xmax, Ymin, Ymax);
  Plot(N, x, y2a, 11, Mx, My, Xborder, Yborder, Xmin, Xmax, Ymin, Ymax);
  Plot(N, x, y3a, 12, Mx, My, Xborder, Yborder, Xmin, Xmax, Ymin, Ymax);
  Plot(N, x, y1i, 13, Mx, My, Xborder, Yborder, Xmin, Xmax, Ymin, Ymax);
  Plot(N, x, y2i, 14, Mx, My, Xborder, Yborder, Xmin, Xmax, Ymin, Ymax);
  Plot(N, x, y3i, 15, Mx, My, Xborder, Yborder, Xmin, Xmax, Ymin, Ymax);
  {ожидание нажатия ENTER}
  readln;
  CloseGraph;
end.
0
06.08.2017, 17:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.08.2017, 17:55
Привет! Вот еще темы с решениями:

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

Составить подпрограмму вычисления определенного интеграла по формуле прямоугольников
Составить подпрограмму вычисления определенного интеграла по формуле...

решение интеграла методом центральных прямоугольников
помогите решить пожалуйста \int_{0}^{\pi }\ x\sin x dx

Вычисление определенного интеграла
Помогите с программой очень сложно =( Вариант 1


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru