Форум программистов, компьютерный форум, киберфорум
Наши страницы

Turbo Pascal

Войти
Регистрация
Восстановить пароль
 
scherbakovss201
11 / 2 / 0
Регистрация: 22.12.2015
Сообщений: 1,029
#1

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

04.08.2017, 15:38. Просмотров 249. Ответов 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.Все параметры водяться с клавиатуры или считываються из файла по выбору пользователя.Имя файла задается пользователем.Выдать на экран точное и приближенное значение интеграла ,абсолютную и относительную погрешность.Отобразить на экране с учетом масштабирования процесс вычисления интеграла.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.08.2017, 15:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вычисление определенного интеграла методом правых прямоугольников (Turbo Pascal):

Вычисление определенного интеграла методом левых прямоугольников - Turbo Pascal
Всем добрый день, сделала программу, но никак не могу понять как в ней сделать: Программa должна содержать ввод с клавиатуры...

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

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

Вычислить значение определенного интеграла методом прямоугольников - Turbo Pascal
Нужно Вычислить значение определенного интеграла: - методом прямоугольников. Дан пример: \int_{0}^{1/2} sqrt{\,\frac...

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

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

9
ZX Spectrum-128
Модератор
Эксперт Pascal/Delphi
3374 / 2361 / 1623
Регистрация: 05.06.2014
Сообщений: 11,175
05.08.2017, 18:23 #2
Процедуры для метода левых и правых прямоугольников
0
scherbakovss201
11 / 2 / 0
Регистрация: 22.12.2015
Сообщений: 1,029
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
1292 / 1070 / 299
Регистрация: 08.01.2012
Сообщений: 4,070
06.08.2017, 12:07 #4
при -1000;1000 500 шагов маловато
0
scherbakovss201
11 / 2 / 0
Регистрация: 22.12.2015
Сообщений: 1,029
06.08.2017, 13:41  [ТС] #5
Цитата Сообщение от MansMI Посмотреть сообщение
при -1000;1000 500 шагов маловато
Я думаю количество шагов можно через консоль у пользователя запросить,а 500 єто минимум.Куда єто дело Вставить.Бо чего то не пойму.
0
MansMI
1292 / 1070 / 299
Регистрация: 08.01.2012
Сообщений: 4,070
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
Модератор
52422 / 40269 / 13600
Регистрация: 18.05.2008
Сообщений: 93,096
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
ФедосеевПавел
Модератор
2497 / 1400 / 583
Регистрация: 01.02.2015
Сообщений: 4,758
06.08.2017, 14:33 #8
Давайте сделаем поправку на подготовку ТС в математике.

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

Да, что гадать. Пусть scherbakovss201 прояснит ситуацию.
0
scherbakovss201
11 / 2 / 0
Регистрация: 22.12.2015
Сообщений: 1,029
06.08.2017, 14:46  [ТС] #9
Саму задачу я озвучил в первом посте.Есть три разных уравнения,переменные задаються пользователем и количество шагов тоже.
Далее три функции на решение трех уравнений и по каждой график,желательно разными цветами дабы отличать.
0
ФедосеевПавел
Модератор
2497 / 1400 / 583
Регистрация: 01.02.2015
Сообщений: 4,758
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
Привет! Вот еще темы с ответами:

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

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

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

Вычисление определенного интеграла - Turbo Pascal
какое то болото....а не задание


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

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

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