Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 02.12.2020
Сообщений: 135

Вычисление интеграла, использующее начальные значения разбиений

31.10.2021, 13:36. Показов 2570. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Объясните, пожалуйста, как вычислить интеграл, используя начальные значения разбиений? В подавляющем большинстве примеров в интернете я увидел, что общее количество разбиений известно, в отличии от моего случая.

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

https://www.cyberforum.ru/cgi-bin/latex.cgi?Int = h\sum_{i = 0}^{n - 1}y_i ,\ \ \ h = \frac{b - a}{n}

Если более конкретно, то мне не понятно, как связать начальные значения разбиений и общее количество разбиений.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.10.2021, 13:36
Ответы с готовыми решениями:

Вычисление значения интеграла
Здравствуйте! помогите пожалуйста) Вычисление значения интеграла для заданной функции на заданном отрезке. Заранее спасибо) С...

Вычисление значения интеграла
Помогите, люди добрые. В долгу не останусь

Вычисление значения интеграла
Поомогите написать программу в C++, полную программу и если можно с объяснениями, знаю что не просто скорее всего, но очень мне поможете,...

20
 Аватар для FFPowerMan
2156 / 1236 / 508
Регистрация: 11.10.2018
Сообщений: 6,236
31.10.2021, 13:48
Здравствуйте. Метод левых прямоугольников - площадь делится на прямоугольники и при этом левый верхний угол касается заданного графика функции.
Миниатюры
Вычисление интеграла, использующее начальные значения разбиений  
0
0 / 0 / 0
Регистрация: 02.12.2020
Сообщений: 135
31.10.2021, 13:54  [ТС]
FFPowerMan, то что Вы написали, я понимаю. Я не понимаю как связать начальные значения разбиений и общее количество разбиений.
0
 Аватар для FFPowerMan
2156 / 1236 / 508
Регистрация: 11.10.2018
Сообщений: 6,236
31.10.2021, 13:59
Начальное количество разбиений n = 2, и считаем интеграл - это 1 итерация, потом умножаем n на 2 и делаем так итерации пока не будет достигнута необходимая точность эпсилон.
0
0 / 0 / 0
Регистрация: 02.12.2020
Сообщений: 135
31.10.2021, 16:04  [ТС]
FFPowerMan, сейчас код исправил, но все равно результата нет... Подскажите, пожалуйста, что нужно еще исправить?

Сейчас проблема в том, что если вводимые данные такие: a = 0.5, b = 5.2, e = 0.001, n1 = 2, n2 = 3, то в выводе получается: "0.58750; 20.46850; 0.39167; 7.30502; 32.12627;". То есть цикл является бесконечным, следовательно программа не заканчивается.

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
 
var i, n1, n2: integer;
     a, b, h1, h2, e, int1, int2: double;
 function f(x: double): double;
 begin
  f := sqr(x);
 end;
 begin
  write('a = '); readln(a);
  write('b = '); readln(b);
  write('e = '); readln(e);
  write('n1 = '); readln(n1);
  write('n2 = '); readln(n2);
  h1 := (b - a) / n1;
  h2 := (b - a) / n2;
  int1 := 0;
  for i := 0 to n1 - 1 do
  begin
   int1 := h1 * (int1 + f(a + i * h1));
   write(int1 : 0 : 5, '; ');
  end;
  int2 := 0;
  for i := 0 to n2 - 1 do
  begin
   int2 := h2 * (int2 + f(a + i * h2));
   write(int2 : 0 : 5, '; ');
  end;
  while (abs(int1 - int2) > e) do
  begin
   n1 := n1 + 1;
   int1 := int1 + h1 * f(a + (n1 - 1) * h1);
   n2 := n2 + 1;
   int2 := int2 + h2 * f(a + (n2 - 1) * h2);
  end;
  write(int1 : 0 : 5, '; ', int2 : 0 : 5);
  readln;
 end.
0
 Аватар для FFPowerMan
2156 / 1236 / 508
Регистрация: 11.10.2018
Сообщений: 6,236
31.10.2021, 16:15
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
Program Int;
var i, n1, n2: integer;
    a, b, h1, h2, e, int1, int2, x: double;
 
 function f(x: double): double;
 begin
  f := sqr(x);
 end;
 
 begin
  {
  write('a = '); readln(a);
  write('b = '); readln(b);
  write('e = '); readln(e);
  write('n1 = '); readln(n1);
  write('n2 = '); readln(n2);
  }
  a := 2;
  b := 3;
  e := 0.001;
  n1 := 12;
  n2 := 100;
 
  h1 := (b - a)/n1;
  h2 := (b - a)/n2;
  writeln('h1 = ', h1);
  writeln('h2 = ', h2);
 
  int1 := 2;
  int2 := 0;
  while(abs(int1 - int2) > e) do
  begin
   for i := 0 to n1 - 1 do
    int1 := int1 + f(a + i*h1);
 
   for i := 0 to n2 - 1 do
    int2 := int2 + f(a + i*h2);
 
   writeln(h1*int1:10:5, '; ', h2*int2:10:5);
   readln;
  end;
 
 
  //writeln(h1*int1:10:5, '; ', h2*int2:10:5);
  //readln;
 end.
Добавлено через 1 минуту
Цитата Сообщение от Maks Smirnov Посмотреть сообщение
"0.58750; 20.46850; 0.39167; 7.30502; 32.12627;".
- строку-то переносить надо writeln.
0
0 / 0 / 0
Регистрация: 02.12.2020
Сообщений: 135
31.10.2021, 16:28  [ТС]
FFPowerMan, я написал в своей программе,

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
int1 := 0;
  for i := 0 to n1 - 1 do
  begin
   int1 := h1 * (int1 + f(a + i * h1));
   write(int1 : 0 : 5, '; ');
  end;
  int2 := 0;
  for i := 0 to n2 - 1 do
  begin
   int2 := h2 * (int2 + f(a + i * h2));
   write(int2 : 0 : 5, '; ');
  end;
так как пользователь вводит значения начальных разбиений.

Объясните, пожалуйста, почему Вы написали так:
Цитата Сообщение от FFPowerMan Посмотреть сообщение
int1 := 2; int2 := 0;
?

Значение начального разбиения - начальное значение интеграла?
0
 Аватар для FFPowerMan
2156 / 1236 / 508
Регистрация: 11.10.2018
Сообщений: 6,236
31.10.2021, 16:35
Чтобы цикл сработал у Вас не входил в цикл потому что 0 - 0 < eps.
Короче вот так:
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
Program Int;
var i, n1, n2: integer;
    a, b, h1, h2, e, int1, int2, x: double;
 
 function f(x: double): double;
 begin
  f := sqr(x);
 end;
 
 begin
  {
  write('a = '); readln(a);
  write('b = '); readln(b);
  write('e = '); readln(e);
  write('n1 = '); readln(n1);
  write('n2 = '); readln(n2);
  }
  a := 2;
  b := 3;
  e := 0.001;
  n1 := 2;
  n2 := 4;
 
  writeln('h1 = ', h1);
  writeln('h2 = ', h2);
 
  int1 := 2;
  int2 := 0;
  while(abs(int1 - int2) > e) do
  begin
    h1 := (b - a)/n1;
    h2 := (b - a)/n2;
    int1 := 0;
    for i := 0 to n1 - 1 do
      int1 := int1 + f(a + i*h1);
    int1 := int1*h1;
 
    int2 := 0;
    for i := 0 to n2 - 1 do
      int2 := int2 + f(a + i*h2);
    int2 := int2*h2;
 
    writeln(int1:10:5, '; ', int2:10:5);
    n1 := n2;
    n2 := n2*2;
  end;
 
 
  writeln(int1:10:5, '; ', int2:10:5);
  readln;
 end.
Добавлено через 2 минуты
Цитата Сообщение от Maks Smirnov Посмотреть сообщение
Pascal
1
int2:0
- здесь не 0, это ширина поля.
0
0 / 0 / 0
Регистрация: 02.12.2020
Сообщений: 135
31.10.2021, 16:39  [ТС]
FFPowerMan, почему 0 - 0, если получается 32.12627 - 20.46850?

Цитата Сообщение от Maks Smirnov Посмотреть сообщение
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
  int1 := 0;
  for i := 0 to n1 - 1 do
  begin
   int1 := h1 * (int1 + f(a + i * h1));
   write(int1 : 0 : 5, '; ');
  end;
  int2 := 0;
  for i := 0 to n2 - 1 do
  begin
   int2 := h2 * (int2 + f(a + i * h2));
   write(int2 : 0 : 5, '; ');
  end;
Цитата Сообщение от Maks Smirnov Посмотреть сообщение
"0.58750; 20.46850; 0.39167; 7.30502; 32.12627;"
0
 Аватар для FFPowerMan
2156 / 1236 / 508
Регистрация: 11.10.2018
Сообщений: 6,236
31.10.2021, 16:42
Цитата Сообщение от Maks Smirnov Посмотреть сообщение
почему 0 - 0, если получается 32.12627 - 20.46850?
- в первоначальной версии кода так не получалось, а получалось 0 - 0 < eps, а по условию должно быть > 0 и поэтому проходит цикл.
0
0 / 0 / 0
Регистрация: 02.12.2020
Сообщений: 135
31.10.2021, 16:48  [ТС]
FFPowerMan, в последней моей версии кода, что неправильно в данном фрагменте?

Цитата Сообщение от Maks Smirnov Посмотреть сообщение
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
int1 := 0;
  for i := 0 to n1 - 1 do
  begin
   int1 := h1 * (int1 + f(a + i * h1));
   write(int1 : 0 : 5, '; ');
  end;
  int2 := 0;
  for i := 0 to n2 - 1 do
  begin
   int2 := h2 * (int2 + f(a + i * h2));
   write(int2 : 0 : 5, '; ');
  end;
0
 Аватар для FFPowerMan
2156 / 1236 / 508
Регистрация: 11.10.2018
Сообщений: 6,236
31.10.2021, 16:52
Я указал на недостатки, читаем мой код и исправляем ошибки.
В Вашем коде:
не надо каждый раз умножать на h1, оно вынесено за скобки и также write не надо выводить на каждой итерации, здесь не надо, writeln потом;
по поводу 0, что это ширина поля я уже сказал;
все тоже самое для второй части.

Добавлено через 35 секунд
Не забываем про тэги кода [PASCAL][/PASCAL].
0
0 / 0 / 0
Регистрация: 02.12.2020
Сообщений: 135
31.10.2021, 19:05  [ТС]
FFPowerMan, скажите, пожалуйста, что у меня неправильно в приведенном ниже коде? Я полагаю, что шаг, так как я изменяю в цикле n, от которого обратно пропорционально зависит h.

Я так и не понял, значение начального разбиения это начальное значение переменной int1_1 или количество разбиений - n?

(В условии написано - начальные разбиения, так как в результате надо вывести таблицу со строками n1 и n2. Поэтому исправленный код сделал относительно n1.)

Цитата Сообщение от Maks Smirnov Посмотреть сообщение
Задание: Вычислить значение определенного интеграла от выбранной подынтегральной функции и заданных с клавиатуры интервала интегрирования, точности и двух значений начальных разбиений. Например, методом левых прямоугольников.

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
program Project1;
var n1: integer;
a, b, h1, e, int1_1, int1_2, x1: double;
function f(x: double): double;
begin
f := sqrt(x);
end;
begin
write('a = '); readln(a);
write('b = '); readln(b);
write('e = '); readln(e);
write('n1 = '); readln(n1);
h1 := (b - a) / n1;
x1 := a + (n1 - 1) * h1;
int1_1 := h1 * f(x1);
x1 := x1 + h1;
int1_2 := h1 * f(x1);
while (abs(int1_1 - int1_2) > e) do
begin
n1 := n1 + 1;
int1_1 := int1_2;
x1 := x1 + h1;
int1_2 := int1_2 + h1 * f(x1);
end;
write(int1_2 : 0 : 5);
readln;
end.
0
 Аватар для FFPowerMan
2156 / 1236 / 508
Регистрация: 11.10.2018
Сообщений: 6,236
31.10.2021, 19:33
Функция теперь sqrt? Зачем менять функцию, еще больше запутаетесь.
0
0 / 0 / 0
Регистрация: 02.12.2020
Сообщений: 135
31.10.2021, 19:41  [ТС]
FFPowerMan, да.
0
 Аватар для FFPowerMan
2156 / 1236 / 508
Регистрация: 11.10.2018
Сообщений: 6,236
31.10.2021, 19:43
Цитата Сообщение от Maks Smirnov Посмотреть сообщение
Pascal
1
(n1 - 1)
- тут не знаю, по Вашей задаче n1 = 2 в типичной форме и потом будет умножаться на 2. При n = 2 у Вас будет x1 = a + h1 - это неправильно, потому что при левых треугольниках должно быть x1 = a.
Мне кажется я правильно написал в сообщении №8, чем-то код не устраивает? Копипаст его, да и все.
2 Ваших интеграла должны в общем цикле считаться, а чтобы войти в цикл нужно просто любые 2 числа взять и присвоить int1 = 2 и int = 0, чтобы разница между ними была больше eps. Потом в цикле сразу заново их пересчитаете, да и все.
0
0 / 0 / 0
Регистрация: 02.12.2020
Сообщений: 135
06.11.2021, 13:22  [ТС]
Здравствуйте!

Некоторое время назад я задавал этот вопрос на этом же форуме, но собеседник не понял того, что мне не понятно, поэтому задаю вопрос второй раз.

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

Объясните, пожалуйста, чем является начальное разбиение? (например, начальным значением int или n)

В интернете я нашел много примеров, где дается значение разбиения как константа, а не значение, которое вводит пользователь и которое судя по всему может изменяться.

Вот формулы для этого метода: https://www.cyberforum.ru/cgi-bin/latex.cgi?Int = h*\sum_{i = 0}^{n - 1}yi; https://www.cyberforum.ru/cgi-bin/latex.cgi?h = \frac{b - a}{n}.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
06.11.2021, 13:47
Maks Smirnov,
см. сообщение #4 темы. В нем приведен ответ на ваш вопрос.
0
0 / 0 / 0
Регистрация: 02.12.2020
Сообщений: 135
06.11.2021, 13:53  [ТС]
bormant, прочитайте, пожалуйста условие моей задачи с начала до конца, тогда Вы увидите, что там написано, что:
Цитата Сообщение от Maks Smirnov Посмотреть сообщение
заданных с клавиатуры
Цитата Сообщение от Maks Smirnov Посмотреть сообщение
значения начального разбиения
. Именно поэтому у меня возникла проблема. Другими словами, ответа на свою проблему я не получил.

bormant, восстановите, пожалуйста, тему, которую я создал сегодня, чтобы другие пользователи ее тоже увидели и возможно помогли мне в решении проблемы.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
06.11.2021, 14:15
Цитата Сообщение от Maks Smirnov Посмотреть сообщение
заданных с клавиатуры
Pascal
1
2
3
  repeat
    Write('Начальное количество разбиений: '); ReadLn(n);
  until n>1;
Добавлено через 6 минут
Цитата Сообщение от Maks Smirnov Посмотреть сообщение
ответа на свою проблему я не получил
Исчерпывающий ответ вы получили в сообщении #4. Некие дополнительные подробности -- в сообщениях ниже.
Но, судя по всему, его -- ответа -- пока еще не поняли. Но не все еще потеряно, поверьте.

Добавлено через 6 минут
PS. Если интересны другие варианты вычисления интеграла, можно посмотреть там (левые, правые, центральные, прямоугольники, трапеция, Монте-Карло):
https://www.cyberforum.ru/post10226890.html

Вот там в функциях
function Int*(a, b: Real; n: Word; f: TFunc): Real; --
a и b -- пределы интегрирования,
f -- интегрируемая функция,
n -- то самое количество разбиений, используемое при приближенном вычислении интеграла.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.11.2021, 14:15
Помогаю со студенческими работами здесь

Вычисление значения интеграла от 0 до а
Помогите создать программу для вычисления значения интеграла от 0 до а (arctg(x)/x)dx Для действителього предела lal&lt;1 c точностью e c...

Вычисление значения интеграла на интервале [a, b]
Составить программу на языке Turbo Pascal 7.0 вычисления значения интеграла на интервале для функции, заданной графически. Значение...

вычисление приближённого значения интеграла
Вычислить с точность до 0,001 \int_{0}^{1}{x}^{10}sinx dx

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

Вычисление значения определенного интеграла
Нужно написать программу на чистом Си, которая решает такой интеграл. \int_{0}^{2}\frac{dx}{\sqrt{4-{x}^{2}}} Ответ: пи/6


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru