Площадь, ограниченная тремя графиками
Вычисление площади, ограниченной тремя графиками, нахождение точек пересечения графиков методом половинного деления, вычисление площади методом средних прямоугольников, вывод графиков на экран в графическом режиме.
program plosh_graf_uravn_integral;
uses crt,graph;
const
minx=90;maxx=550;{Левая и правая границы системы координат}
miny=460;maxy=40; {Нижняя и верхняя границы системы координат}
minmasx=0;maxmasx=3.5; {Огграничения по допустимому масштабу}
minmasy=0;maxmasy=2.5;
n=100; {Размер массива, по которому строится график}
e=0.00001;{Точность вычисления корня}
type
func=function(x:real):real;
var
{gd,gm - номер драйвера и номер графического режима}
gd,gm,i,j,nolx,noly:integer;
edx,edy,a,b,x1,x2,x3,s1,s2:real;
{Mассивы вводимых точек по x и по у}
fp1,fp2,fp3:array[1..n] of pointtype;
ss1:string;
{$F+}
function f1(x:real):real;
begin
f1:=exp(-sqr(x))+0.5
end;
function f2(x:real):real;
begin
f2:=ln(sqr(x)+2)
end;
function f3(x:real):real;
begin
f3:=2*cos(2*x/3)
end;
function f21(x:real):real;
begin
f21:=f2(x)-f1(x)
end;
function f23(x:real):real;
begin
f23:=f2(x)-f3(x)
end;
function f31(x:real):real;
begin
f31:=f3(x)-f1(x)
end;
procedure integral(f:func;a,b:real; var s1:real);
var
i1,s,d:real;n,k:integer; { Процедура вычисления интеграла }
begin { от f от a до b c точностью e }
d:=b-a; { методом центральных прямоугольников }
i1:=d*(f(a+d/4)+f(b-d/4))/2;
s:=f(a+d/8)+f(a+3*d/8)+f(a+5*d/8)+f(a+7*d/8);
s1:=d*s/4;
n:=8;
while abs(s1-i1)>=e do
begin
s:=0;
for i:=1 to n do
s:=s+f(a+(2*i-1)*d/(2*n));
i1:=s1; s1:=s*d/n;
n:=2*n;
end;
end;
procedure reshur(f:func; a,b:real; var x:real);
var
c:real;
begin
while (b-a)>e do
begin
c:=((a+b)/2);
if f(a)*f(c)<0
then b:=c else a:=c
end;
x:=c;
end;
procedure grafregim;
{Установка графического режима и масштаба вывода на экран
(edx, edy - количество пикселей в единице по оcям X и Y)}
begin
{Предполагается, что путь к графическому драйверу egavga.bgi
d:\tp\bgi,если не так, то нужно исправить}
gd:=detect;initgraph(gd,gm,'d:/tp/bgi');
if graphresult<>grok then halt(1);
cleardevice;
{Масштаб вывода на экран, положение начала координат}
edx:=(maxx-minx)/(maxmasx-minmasx);
edy:=-(maxy-miny)/(maxmasy-minmasy);
nolx:=round(maxx-maxmasx*edx);
noly:=round(maxy+maxmasy*edy)
end;
procedure osikoord;
{Рисует оси координат}
var
i:integer;stri:string;
begin
setcolor(blue);
line(nolx,miny,nolx,maxy);{ocь y}
line(minx,noly,maxx,noly);{ось x}
line(nolx-5,maxy+15,nolx,maxy); {Стрелка для оси y}
line(nolx+5,maxy+15,nolx,maxy); {Стрелка для оси y}
line(maxx-15,noly+5,maxx,noly); {Стрелка для оси x}
line(maxx-15,noly-5,maxx,noly); {Стрелка для оси x}
outtextxy(nolx-10,maxy,'Y');{Вывод Y}
outtextxy(maxx,noly+10,'X');{Вывод X}
{Вывод значений по оси X}
j:=0;
for i:=round(minmasx) to round(maxmasx)-1 do
begin
str(i,stri);
if i<>0 then
begin
outtextxy(minx+j*round(edx),noly+10,stri);
line(minx+j*round(edx),noly-5,minx+j*round(edx),noly);
end;
j:=j+1
end;
j:=0;
{ Вывод значений по оси Y}
for i:=round(minmasy) to round(maxmasy)-1 do
begin
str(i,stri);
if i<>0 then
begin
outtextxy(nolx-20,miny-j*round(edy),stri);
line(nolx+5,miny-j*round(edy),nolx,miny-j*round(edy));
end;
j:=j+1;
end;
end;
procedure grafiki;
var
d:real;
begin
setbkcolor(white);
d:=(maxmasx-minmasx)/n; {единиц графика на точку по X}
for i:=1 to n do
begin
fp1[i].x:=round( nolx+(i-1)*d*edx);
fp2[i].x:=fp1[i].x;
fp3[i].x:=fp1[i].x;
fp1[i].y:=round( noly-f1((i-1)*d)*edy );
fp2[i].y:=round( noly-f2((i-1)*d)*edy );
fp3[i].y:=round( noly-f3((i-1)*d)*edy );
end;
setcolor(magenta);
outtextxy(400,160,'1: y=exp(-x^2)+0.5');
for i:=1 to n do drawpoly(i,fp1);
setcolor(blue);
outtextxy(400,180,'2: y=ln(2+x^2)');
for i:=1 to n do drawpoly(i,fp2);
setcolor(red);
outtextxy(400,200,'3: y=2*cos(2x/3)');
for i:=1 to n do drawpoly(i,fp3)
end;
Begin
grafregim; osikoord; grafiki;
readln; RestoreCrtMode;
TextBackGround(Blue); TextColor(Yellow); clrscr;
writeln('Промежуток для поиска корней: от a до b');
write( ' a= '); readln(a); write(' b= '); readln(b);
writeln('Координаты пересечения графиков');
writeln('Первое уравнение exp(-x^2)+0.5=ln(2+x*x) ');
reshur(f21,a,b,x1); writeln('x1=',x1:6:4);
writeln('Второе уравнение ln(2+x*x)=2*cos(2x/3)');
reshur(f23,a,b,x2); writeln('x2=',x2:6:4);
writeln('Третье уравнение exp(-x*x+0.5)=2*cos(2x/3) ');
reshur(f31,a,b,x3); writeln('x3=',x3:6:4);
integral(f21,x1,x2,s1);integral(f31,x2,x3,s2);
writeln('Площадь между вторым и первым графиками ',s1:6:4);
writeln('Площадь между третьим и первым графиками ',s2:6:4);
s1:=s1+s2;
writeln('Площадь равна ',s1:6:4); readln;
SetGraphMode(gm);
osikoord; grafiki;
str(s1:10:6,ss1);
outtextxy(200,240,'Площадь, ограниченная тремя графиками ='+ss1);
readln
End.
