Программа
{ По заданной точности вычислить
интеграл, используя различные
разбиения, вывести график
подынтегральной ф-ии,
вывести результатаы вычислений
при различных разбиениях и
сравнивая их с точным значением }
Uses Crt,Graph; { Подключение модулей консоли и графики }
Const
a=1; { Левая грница интервала интегрирования }
b=7; { Правая грница интервала интегрирования }
Var
Symbol:Char; { Переменная для обработки клавиатуры }
Function F(x:real):real; { Вычисление значения подынтегральной функции }
Begin
F:=x*exp(x)
End;
Function Fproto(x:real):real; { Вычисление значения первообразной }
Begin
Fproto:=exp(x)*(x-1)
End;
Procedure Graphic; { Вывод графика }
Const
ScaleX=40; { Масштабный коэффициент по оси X }
ScaleY=0.02; { Масштабный коэффициент по оси Y }
DriverPath=''; { Путь к графическому драйверу }
Var
GraphDriver,GraphMode:integer; { Номера графического драйвера и режима }
i:integer; { Счетчик }
DifferenceX0:integer; { Смещение оси X относительно левого края экрана }
DifferenceY0:integer;{ Смещение оси Y относительно верхнего края экрана }
Begin
GraphDriver:=Detect; { Автоматическое определение драйвера }
InitGraph(GraphDriver,GraphMode,DriverPath);
{ Инициализация графического режима }
DifferenceX0:=0; { Определение смещения оси X }
DifferenceY0:=GetMaxY; { Определение смещения оси Y }
SetColor(White); { Установка белого цвета }
SetLineStyle(SolidLn,0,NormWidth);
{ Установка сплошной линии нормальной толщины }
Line(DifferenceX0,0,DifferenceX0,GetMaxY); { Ось Y }
Line(0,DifferenceY0,GetMaxX,DifferenceY0); { Ось X }
Line(Round(a*ScaleX)+DifferenceX0,DifferenceY0,
Round(a*ScaleX)+DifferenceX0,DifferenceY0-Round(F(a)*ScaleY));
{ Левая граница трапеции }
Line(Round(b*ScaleX)+DifferenceX0,DifferenceY0,
Round(b*ScaleX)+DifferenceX0,DifferenceY0-Round(F(b)*ScaleY));
{ Правая граница трапеции }
SetLineStyle(SolidLn,0,ThickWidth); { Установка сплошной толстой линии}
MoveTo(a*ScaleX+DifferenceX0,DifferenceY0-Round(F(a)*ScaleY));
{ Помещение указателя в первую точку графика }
for i:=a*ScaleX+1 to b*ScaleX do { Построение графика }
LineTo(i+DifferenceX0,DifferenceY0-Round(F(i/ScaleX)*ScaleY));
SetFillStyle(LtSlashFill,White); { Установка заполнения ///,белый цвет }
FloodFill(DifferenceX0+Round((a+b)/2*ScaleX),
DifferenceY0-Round(F((a+b)/2)/2*ScaleY),White);
{ Заполнение трапеции указанием ее средней точки }
Symbol:=ReadKey; { Чтение клавиатуры для остановки программы и
определения дальнейшего действия }
CloseGraph { Закрытие графического режима }
End;
Procedure Result; { Вычисление интеграла и определение точности
вычислений в зависимости от разбиения }
Const
StepOfBreak=50; { Шаг ряда разбиений }
Var
Eps:real; { Критерий точности вычисления }
Res:real; { Точное значение интеграла }
Sum,SumPred:real;{ Текущая интегральная и предыдущая интегральная суммы }
Step:real; { Шаг разбиения }
Fcurrent,Fpred:real;
{ Текущее и предыдущее значения подынтегральной функции }
i,k:integer; { Счетчики }
Begin
write('Задайте критерий точности вычисления ');
{ Приглашение ввести точность вычисления }
readln(Eps); { Получение точности вычисления }
writeln;
Res:=Fproto(b)-Fproto(a); { Вычисление точного значения интеграла }
writeln('Точное значение ',Res); { Вывод значения интеграла }
writeln;
writeln('РАЗБИЕНИЕ ЗНАЧЕНИЕ ПОГРЕШНОСТЬ');
i:=0; { Определение начального положения счетчика }
repeat { Цикл вычисления интеграла и вывода результатов }
i:=i+1;
SumPred:=Sum; { Сохранение предыдущего значения интеграла }
Sum:=0; { Обнуление интегральной суммы }
Step:=(b-a)/StepOfBreak/i; { Определение шага разбиения }
Fcurrent:=F(a); { Определение значения функции в левой точке участка
интегрирования перед набором интегральной суммы }
for k:=1 to StepOfBreak*i do { Набор интегральной суммы }
begin
Fpred:=Fcurrent; { Сохранение предыдущего значения функции }
Fcurrent:=F(a+k*Step); { Вычисление текущего значения функции }
Sum:=Sum+(Fpred+Fcurrent)/2
{ Набор интегральной суммы без учета шага разбиения }
end;
Sum:=Step*Sum; { Пересчет интегральной суммы, учитывающий разбиение }
if i=1 then writeln(StepOfBreak*i:6,' ',Sum)
{ Вывод первого результата }
else writeln(StepOfBreak*i:6,' ',Sum,' ',abs(Sum-Res));
{ Вывод последующих результатов вычисления интеграла,
вычисление и вывод погрешности }
if KeyPressed then Symbol:=ReadKey;
{ Если была нажата клавиша, то чтение буфера клавиатуры }
until (abs(Sum-SumPred)<=Eps)and(i>1)or(Symbol=#27);
{ Выход из цикла по критерию точности или при нажатии Esc }
if Symbol<>#27 { Если из цикла вышли не по Esc }
then { то }
begin
writeln('----------------------------------------------');
{ Оформление конца вычислений }
Symbol:=ReadKey { Чтение клавиатуры для остановки программы и
определения дальнейшего действия }
end
End;
BEGIN
repeat
Graphic;
if Symbol<>#27 then Result; { Если из графики вышли не по Esc, то
вычисление интеграла и вывод результатов }
until Symbol=#27 { Выход при нажатии Esc }
END.
Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию