Составить программу для вычисления значения интеграла - Turbo Pascal
Формулировка задачи:
Помогите пожалуйста составить программу на языке Turbo Pascal 7.0 вычисления значения интеграла на интервале [a, b] для функции, заданной графически. Значение интеграла вычислить приближённо по итерационной формуле левых прямоугольников:
где h=(b-a)/n - величина шага между двумя соседними точками разбиения интервала интегрирования; fi = f(xi) - значение функции в точке xi = a+h(i-1); i = 1, 2, ..., n.
Вычисления закончить при выполнении условия |In-I2n| < z, где z>0 - достаточно малое значение, задаваемое пользователем (точность вычислений). Здесь In, I2n - значения интеграла, вычисленные по (1) при количестве интервалов разбиения n и 2n соответственно.
Функция:
Решение задачи: «Составить программу для вычисления значения интеграла»
textual
Листинг программы
uses crt;
var r,a,b,z,h,xi,fi,s1,s2:real;
n,i:integer;
begin
repeat
write('Введите радиус R>0 R=');
readln(r);
until r>0;
repeat
write('Введите левый край интервала a>=',-2*r:0:1,' a=');
readln(a);
until a>=-2*r;
repeat
write('Введите правый край интервала b>',a:0:1,' b=');
readln(b);
until b>a;
repeat
write('Введите число разбиений n>1 n=');
readln(n);
until n>1;
repeat
write('Введите точность 0<z<1 e=');
readln(z);
until (z>0)and(z<1);
s1:=0;
s2:=2*z;
repeat
s1:=s2;
h:=(b-a)/n;
s2:=0;
for i:=1 to n do
begin
xi:=a+(i-1)*h;
if xi<=-r then fi:=xi+r
else if xi<=r then fi:=sqrt(r*r-xi*xi)
else if xi<=0 then fi:=sqrt(r*r-sqr(xi+r))
else fi:=0.5*xi-2*r;
s2:=s2+fi*h;
end;
n:=n*2;
until abs(s1-s2)<z;
writeln('Интеграл на отрезке [',a:0:1,';',b:0:1,']=',s2:0:4);
end.
Объяснение кода листинга программы
- Создается переменная
r, которая предназначена для хранения значения радиуса. - Создается переменная
a, которая предназначена для хранения значения левого края интервала. - Создается переменная
b, которая предназначена для хранения значения правого края интервала. - Создается переменная
z, которая предназначена для хранения значения точности. - Выполняется цикл
repeat, который предназначен для получения значения радиуса, левого и правого краев интервала, а также числа разбиений и точности. - Внутри цикла
repeatпеременныеr,a,bиzсчитываются из входных данных. - Выполняется проверка на корректность введенных значений: радиус должен быть больше нуля, левый край интервала должен быть больше или равен минус двум радиусам, правый край интервала должен быть больше левого края, число разбиений должно быть больше единицы, а точность должна быть меньше единицы.
- Если все условия выполняются, то присваиваются переменным
s1иs2начальные значения:s1равна 0, аs2равна 2*z. - Вычисляется шаг
hдля разбиения интервала на отрезки. - Выполняется цикл
for, который предназначен для вычисления значений интеграла на каждом отрезке интервала. - Внутри цикла
forпеременнойxiприсваивается значение левого края интервала, увеличенное на текущий шагh. - Вычисляется значение
fi, которое является произведением числаiи шагаh. - Проверяется условие, при котором
xiменьше или равно минус радиусуr. Если это условие выполняется, то значениеfiприсваивается значениюxiплюсr. - Если условие из предыдущего пункта не выполняется, то проверяется, находится ли
xiвнутри интервала отrдоa. Если это условие выполняется, то значениеfiвычисляется как квадратный корень из разности квадратовrиxi. - Если условие из предыдущего пункта не выполняется, то проверяется, находится ли
xiвнутри интервала отaдо0. Если это условие выполняется, то значениеfiвычисляется как половинаxiминус2*r. - Значение
s2увеличивается на произведениеfiи шагаh. - После завершения цикла
forвыполняется проверка на изменение значенияs1иs2. Если изменение превышает заданную точностьz, то значениеnудваивается. - Выводится значение интеграла на отрезке интервала [
a,b] с помощью функцииwriteln. - Выполняется цикл
repeat, который предназначен для повторного вычисления значения интеграла с новыми значениямиr,a,bиz. - Конец программы.