Консультация № 184598
28.11.2011, 17:06
100.00 руб.
28.11.2011, 17:25
0 31 1
Здравствуйте, уважаемые эксперты! Помогите решить задачу на следующую тему: "Интегрирование функции, заданной графически методом левых прямоугольников".

Составить программу на языке Borland Pascal вычисления значения интеграла на интервале [a, b] для функции, заданной графически. Значение интеграла вычислить приближённо по итерационной формуле левых прямоугольников:
(1)
где h=(b-a)/n - величина шага между двумя соседними точками разбиения интервала интегрирования; fi = f(xi) - значение функции в точке xi = a+h(i-1); i = 1,2,...n.

Вычисления закончить при выполнении условия l In-I2n l < e (эпсилон), где e>0 - достаточно малое значение, задаваемое пользователем (точность вычислений). Здесь In, I2n - значения интеграла, вычисленные по (1) при количестве интервалов разбиения n и 2n соответственно.

Численные значения всех величин, участвующих в вычислениях, считать параметрами программы, и определить их путём ввода.

График представлен на рисунке:

Обсуждение

давно
Старший Модератор
31795
6196
28.11.2011, 17:36
общий
28.11.2011, 17:37
Посмотрите kupri-ov_chisl_methods.pdf

Это практически одно и тоже, только в отличии от метода средних(центральных) прямоугольников, в этом методе высота берется с левой стороны, а не посредине отрезка Хii+1
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
28.11.2011, 17:40
общий
Нет, к сожалению четко прописано, что надо решать методом левых прямоугольников... Форума для её нахождения находится по ссылке: https://rfpro.ru/d/6786.jpg
Неизвестный
28.11.2011, 17:48
общий
Адресаты:
Если не ошибаюсь, то да именно так...
давно
Старший Модератор
31795
6196
28.11.2011, 18:11
общий
На будущее:
Цитата: 386678
< img src= >

Использование HTML-форматирования на Портале - ЗАПРЕЩЕНО!.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
28.11.2011, 19:11
общий
Адресаты:
Обязательно учту в следующий раз...
Неизвестный
29.11.2011, 16:00
общий
Кто нибудь может решить эту задачу...
давно
Старший Модератор
31795
6196
29.11.2011, 18:23
общий
Сюда заглядывали?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
29.11.2011, 20:36
общий
Адресаты:
Вот накалякал решение, только прошу помощи в отладке, ибо сомневаюсь в нем
Код:
program p184598;
var
E,a,b,s,h,R,k,x,d,In2,In1:real;
i:integer;
n:longint;
function func(x,k,d,R:real):real; {определение функции в точке x}
begin
if x<=-2*R+d then
func:=R
else
if x<d then
func:=-SQRT(abs(sqr(R)-sqr(x+(-R+d))))
else
if x<k then
func:=-x+2
else
if x<k+2*R then
func:=-sqrt(abs(sqr(R)-sqr(x+k+R)))
else
func:=0;
end;
begin {ввод исходных данных}
In1:=0;
write('Введите величину разбиения n=');
readln(n);
write('Введите границы интервала вычислений a и b (a<b): ');
readln(a,B);
write('Введите радиус R (R>0): ');
readln(r);
write('Введите d (d<0): ');
readln(d);
write('Введите k (k>0): ');
readln(k);
write('Введите точность вычисления интеграла E (E>0): ');
readln(E);
repeat
begin
h:=(b-a)/n; {расчет шага изменения аргумента}
s:=0;
for i:=1 to n do
begin
x:=a+i*h; {приращение аргумента}
s:=s+func(x,k,d,r); {сумма значений функции на отрезке [a,b]}
end;
In2:=In1; {сохранение предыдущего значения интеграла}
n:=n*2;
In1:=h*s; {расчет интеграла}
writeln(in1, in2, ' ');
end until (abs(In1-In2)<E);
writeln('Определенный интеграл функции, заданной графически, на интервале {',a,';',b,')');
writeln('Найдено и равно ',in1:0:2);
end.


Сомневаюсь именно в функции func, потому как в ней определяются интервалы
Неизвестный
29.11.2011, 20:37
общий
Адресаты:
помоему я неверно использую уравнение нижней полуокружности в этой функции.....ваше мнение?
Неизвестный
29.11.2011, 21:02
общий
29.11.2011, 21:05
поидее же рассматривая интервал от -2*R+d до d и от k до k+2*R уравнение полуокружности причем нижней его части.....
y=[$8730$]R2-(x-x0)2 это уравнение верхней полуокружности....а нижней получается со знаком -....но помоему чтото тут нетак
давно
Старший Модератор
31795
6196
29.11.2011, 21:18
общий
По моему на интервале: x=-(2*R+d):-d
точно R- нужно


Попробую в графичеком режиме формулы проверить.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
29.11.2011, 21:20
общий
function func(x,k,d,R:real):real; {определение функции в точке x}
begin
if x<=-2*R+d then
func:=R
else
if x<d then
func:=R-SQRT(sqr(R)-sqr(x-(-d+r)))
else
if x<k then
func:=-x+2
else
if x<k+2*R then
func:=R-sqrt(sqr(R)-sqr(x-(k+r)))
else
func:=0;
end;
есть еще такой вариант но чтото всеравно помоему не то)
Неизвестный
29.11.2011, 21:32
общий
29.11.2011, 21:34
Если выражать уравнение нижней части окружности то
(x-x0)2+(y-y0)2=R2
y=-(y0+[$8730$]((x-x0)2-R2))

Так вроде но в таком случае при
a=-4 b=5 n=2 k=2 d=-1 выдает что невозможно посчитать значение
Неизвестный
29.11.2011, 21:37
общий
Код:
program p184598;
var
E,a,b,s,h,R,k,x,d,In2,In1:real;
i:integer;
n:longint;
function func(x,k,d,R:real):real; {определение функции в точке x}
begin
if x<=-2*R+d then
func:=R
else
if x<d then
func:=-(R+SQRT(sqr(x+(-R+d))-sqr(R)))
else
if x<k then
func:=-x+2
else
if x<k+2*R then
func:=-(R+sqrt(sqr(x+k+R)-sqr(R)))
else
func:=0;
end;
begin {ввод исходных данных}
In1:=0;
write('Введите величину разбиения n=');
readln(n);
write('Введите границы интервала вычислений a и b (a<b): ');
readln(a,B);
write('Введите радиус R (R>0): ');
readln(r);
write('Введите d (d<0): ');
readln(d);
write('Введите k (k>0): ');
readln(k);
write('Введите точность вычисления интеграла E (E>0): ');
readln(E);
repeat
begin
h:=(b-a)/n; {расчет шага изменения аргумента}
s:=0;
for i:=1 to n do
begin
x:=a+i*h; {приращение аргумента}
s:=s+func(x,k,d,r); {сумма значений функции на отрезке [a,b]}
end;
In2:=In1; {сохранение предыдущего значения интеграла}
n:=n*2;
In1:=h*s; {расчет интеграла}
writeln(in1, in2, ' ');
end until (abs(In1-In2)<E);
end.

Если следовать *моей математике*то этот код работает как надо....
давно
Старший Модератор
31795
6196
29.11.2011, 22:14
общий

Не совсем так:


код под АВС, я формулы проверяю:
Код:
uses GraphABC;
var
r,d,k:real;
x:integer;
function F(x:real):real; {îïðåäåëåíèå ôóíêöèè â òî÷êå x}
begin
if x<=-2*R+d then f:=R
else
if x<d then f:=-(R+SQRT(sqr(x+(-R+d))-sqr(R)))
else
if x<k then f:=-x+k
else
if x<k+2*R then f:=-(R+sqrt(sqr(x+k+R)-sqr(R)))
else f:=0;
end;
begin
r:=20{write('enter R');readln(r)};
k:=10{write('enter K');readln(k)};
d:=k-r;
line(0,200,400,200);
line(200,0,200,400);
for x:=-100 to 100 do
SetPixel(200+x,200-round(F(x)),clRed)
end.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
29.11.2011, 22:16
общий
тогда что тут нехватает или как рассматривать интервалы?
давно
Старший Модератор
31795
6196
29.11.2011, 22:25
общий
29.11.2011, 22:26
тоже самое но с эталонными окружностями:

пока подумаю над вычислением именно этих участков, завтра отпишусь.
Код:
uses GraphABC;
var
r,d,k:real;
x:integer;
function F(x:real):real; {??????????? ??????? ? ????? x}
begin
if x<=-2*R+d then f:=R
else
if x<d then f:=-(R+SQRT(sqr(x+(-R+d))-sqr(R)))
else
if x<k then f:=-x+k
else
if x<k+2*R then f:=-(R+sqrt(sqr(x+k+R)-sqr(R)))
else f:=0;
end;
begin
r:=20{write('enter R');readln(r)};
k:=10{write('enter K');readln(k)};
d:=k-r;
line(0,200,400,200);
line(200,0,200,400);
circle(round(200-r+d),round(200-r),round(r));
circle(round(200+r+k),200,round(r));
for x:=-100 to 100 do
SetPixel(200+x,200-round(F(x)),clRed)
end.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
29.11.2011, 22:30
общий
Адресаты:
хорошо
давно
Старший Модератор
31795
6196
30.11.2011, 12:07
общий
30.11.2011, 17:05
Вот

Код:
function F(x:real):real; {??????????? ??????? ? ????? x}
begin
if x<=-2*R+d then f:=R
else if x<d then f:=R-sqrt(r*r-(x+r-d)*(x+r-d))
else if x<k then f:=-x+k
else if x<k+2*R then f:=-sqrt(r*r-(x-r-k)*(x-r-k))
else f:=0;
end;




Да, ещё:
Код:
    for i:=1 to n do
begin
x:=a+i*h; {приращение аргумента}
s:=s+func(x,k,d,r); {сумма значений функции на отрезке [a,b]}
end;

так реализовывается правые прямоугольники, для левых нужно I:=0 to N-1
Вроде всё.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
30.11.2011, 21:27
общий
01.12.2011, 12:02
это ответ
Здравствуйте, Посетитель - 386678!
Надеюсь это то что вам нужно
Будут какие вопросы или дополнения пишите.



Приложение:
program p184598;
var
E,a,b,s,h,R,k,x,d,In2,In1:real;
i:integer;
n:longint;
function func(x,k,d,R:real):real; {определение функции в точке x}
begin
if x<=-2*R+d then func:=R
else
if x<d then func:=R-SQRT(sqr(R)-sqr(x+R-d))
else
if x<k then func:=-x+k
else
if x<k+2*R then func:=-sqrt(sqr(R)-sqr(x-k-R))
else func:=0;
end;
begin {ввод исходных данных}
In1:=0;
write('Введите величину разбиения n=');
readln(n);
write('Введите границы интервала вычислений a и b (a<b): ');
readln(a,B);
write('Введите радиус R (R>0): ');
readln(r);
write('Введите d (d<0): ');
readln(d);
write('Введите k (k>0): ');
readln(k);
write('Введите точность вычисления интеграла E (E>0): ');
readln(E);
repeat
begin
h:=(b-a)/n; {расчет шага изменения аргумента}
s:=0;
for i:=0 to n-1 do
begin
x:=a+i*h; {приращение аргумента}
s:=s+func(x,k,d,r); {сумма значений функции на отрезке [a,b]}
end;
In2:=In1; {сохранение предыдущего значения интеграла}
n:=n*2;
In1:=h*s; {расчет интеграла}
end until (abs(In1-In2)<E);
writeln('Результат rez=',In1);
end.
5
давно
Старший Модератор
31795
6196
30.11.2011, 21:38
общий
30.11.2011, 21:39
код ниже позволяет построить нужную функцию
Код:
function F(x:real):real;
begin
if x<=-2*R+d then f:=R
else if x<d then f:=R-sqrt(r*r-(x+r-d)*(x+r-d))
else if x<k then f:=-x+k
else if x<k+2*R then f:=-sqrt(r*r-(x-r-k)*(x-r-k))
else f:=0;
end;


Ваш код, этого не позволяет:
Код:
function func(x,k,d,R:real):real;
begin
if x<=-2*R+d then func:=R
else
if x<d then func:=-(R+SQRT(sqr(x+(-R+d))-sqr(R)))сравните строчку
else
if x<k then func:=-x+k
else
if x<k+2*R then func:=-(R+sqrt(sqr(x+k+R)-sqr(R)))и эту строчку
else func:=0;
end;
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
30.11.2011, 21:44
общий
Адресаты:
Код:
program p184598;
var
E,a,b,s,h,R,k,x,d,In2,In1:real;
i:integer;
n:longint;
function func(x,k,d,R:real):real; {определение функции в точке x}
begin
if x<=-2*R+d then f:=R
else if x<d then f:=R-sqrt(r*r-(x+r-d)*(x+r-d))
else if x<k then f:=-x+k
else if x<k+2*R then f:=-sqrt(r*r-(x-r-k)*(x-r-k))
else f:=0;
end;
begin {ввод исходных данных}
In1:=0;
write('Введите величину разбиения n=');
readln(n);
write('Введите границы интервала вычислений a и b (a<b): ');
readln(a,B);
write('Введите радиус R (R>0): ');
readln(r);
write('Введите d (d<0): ');
readln(d);
write('Введите k (k>0): ');
readln(k);
write('Введите точность вычисления интеграла E (E>0): ');
readln(E);
repeat
begin
h:=(b-a)/n; {расчет шага изменения аргумента}
s:=0;
for i:=0 to n-1 do
begin
x:=a+i*h; {приращение аргумента}
s:=s+func(x,k,d,r); {сумма значений функции на отрезке [a,b]}
end;
In2:=In1; {сохранение предыдущего значения интеграла}
n:=n*2;
In1:=h*s; {расчет интеграла}
end until (abs(In1-In2)<E);
writeln('Результат rez=',rez);
end.

извините. Поправте тогда меня в ответе
Неизвестный
30.11.2011, 22:44
общий
При компиляции выводит ошибку... На строке 44. Если не трудно не могли бы Вы расписать подробнее о решении задачи с математической стороны... И за что отвечают переменные: d, k
Неизвестный
30.11.2011, 23:24
общий
Вот рабочий код
Код:
program p184598;
var
E,a,b,s,h,R,k,x,d,In2,In1:real;
i:integer;
n:longint;
function func(x,k,d,R:real):real; {определение функции в точке x}
begin
if x<=-2*R+d then func:=R
else if x<d then func:=R-sqrt(r*r-(x+r-d)*(x+r-d))
else if x<k then func:=-x+k
else if x<k+2*R then func:=-sqrt(r*r-(x-r-k)*(x-r-k))
else func:=0;
end;
begin {ввод исходных данных}
In1:=0;
write('Введите величину разбиения n=');
readln(n);
write('Введите границы интервала вычислений a и b (a<b): ');
readln(a,B);
write('Введите радиус R (R>0): ');
readln(r);
write('Введите d (d<0): ');
readln(d);
write('Введите k (k>0): ');
readln(k);
write('Введите точность вычисления интеграла E (E>0): ');
readln(E);
repeat
begin
h:=(b-a)/n; {расчет шага изменения аргумента}
s:=0;
for i:=0 to n-1 do
begin
x:=a+i*h; {приращение аргумента}
s:=s+func(x,k,d,r); {сумма значений функции на отрезке [a,b]}
end;
In2:=In1; {сохранение предыдущего значения интеграла}
n:=n*2;
In1:=h*s; {расчет интеграла}
end until (abs(In1-In2)<E);
writeln('Результат rez=',in1);
end.


На счет математики:
пользовался источниками
1)первый
2)второй

А на счет самой математики....посмотрите алгоритм как считается все....и весь метод станет понятен
Неизвестный
30.11.2011, 23:26
общий
30.11.2011, 23:28
посмотрите на график...... d это как раз тот x при котором мы рассматриваем уже другой интервал.... k аналогично d.....рассматривая функцию заданную графически нужно разделить её на интервалы, в которых мы можем описать уравнения прямых(кривых) и так далее.....
Неизвестный
02.12.2011, 14:16
общий
Помогите решить эту же задачу но без использования процедур и функций...
Неизвестный
03.12.2011, 03:24
общий
будет сделано 4 декабря
Неизвестный
11.12.2011, 22:48
общий
Код:
program p184598;
var
E,a,b,s,h,R,k,x,d,In2,In1,fc:real;
i:integer;
n:longint;
if x<=-2*R+d then func:=R
else
if x<d then func:=R-SQRT(sqr(R)-sqr(x+R-d))
else
if x<k then func:=-x+k
else
if x<k+2*R then func:=-sqrt(sqr(R)-sqr(x-k-R))
else func:=0;
begin {ввод исходных данных}
In1:=0;
write('Введите величину разбиения n=');
readln(n);
write('Введите границы интервала вычислений a и b (a<b): ');
readln(a,B);
write('Введите радиус R (R>0): ');
readln(r);
write('Введите d (d<0): ');
readln(d);
write('Введите k (k>0): ');
readln(k);
write('Введите точность вычисления интеграла E (E>0): ');
readln(E);
repeat
begin
h:=(b-a)/n; {расчет шага изменения аргумента}
s:=0;
for i:=0 to n-1 do
begin
x:=a+i*h; {приращение аргумента}
if x<=-2*R+d then fc:=R
else
if x<d then fc:=R-SQRT(sqr(R)-sqr(x+R-d))
else
if x<k then fc:=-x+k
else
if x<k+2*R then fc:=-sqrt(sqr(R)-sqr(x-k-R))
else fc:=0;
s:=s+func(x,k,d,r); {сумма значений функции на отрезке [a,b]}
end;
In2:=In1; {сохранение предыдущего значения интеграла}
n:=n*2;
In1:=h*s; {расчет интеграла}
end until (abs(In1-In2)<E);
writeln('Результат rez=',In1);
end.


запоздало но все же....извиняюсь за свой интернет
Неизвестный
12.12.2011, 01:08
общий
спасибо...
Неизвестный
12.12.2011, 02:28
общий
вот рабочий
Код:
program p184598;
var
E,a,b,s,h,R,k,x,d,In2,In1,fc:real;
i:integer;
n:longint;
begin {ввод исходных данных}
In1:=0;
write('Введите величину разбиения n=');
readln(n);
write('Введите границы интервала вычислений a и b (a<b): ');
readln(a,B);
write('Введите радиус R (R>0): ');
readln(r);
write('Введите d (d<0): ');
readln(d);
write('Введите k (k>0): ');
readln(k);
write('Введите точность вычисления интеграла E (E>0): ');
readln(E);
repeat
begin
h:=(b-a)/n; {расчет шага изменения аргумента}
s:=0;
for i:=0 to n-1 do
begin
x:=a+i*h; {приращение аргумента}
if x<=-2*R+d then fc:=R
else
if x<d then fc:=R-SQRT(sqr(R)-sqr(x+R-d))
else
if x<k then fc:=-x+k
else
if x<k+2*R then fc:=-sqrt(sqr(R)-sqr(x-k-R))
else fc:=0;
s:=s+fс; {сумма значений функции на отрезке [a,b]}
end;
In2:=In1; {сохранение предыдущего значения интеграла}
n:=n*2;
In1:=h*s; {расчет интеграла}
end until (abs(In1-In2)<E);
writeln('Результат rez=',In1);
end.
Форма ответа