Вывести график полученный из 2 функций методом прямоугольников - Free Pascal
Формулировка задачи:
Добырй день!
Нужно написать программу, которая будет выводить график полученный из 2 функций методом прямоугольников.
Функции оебе записал, но не могу сделать метод прямоугольников и вывести функции. Помогите пожалуйста.
Листинг программы
- function f1(var x1: real):real;
- begin
- f1:= x1^2+0.4*x1+0.1;
- end;
- finction f2(var x2: real):real;
- f2:=-0.2*x2+0.8;
- end;
Решение задачи: «Вывести график полученный из 2 функций методом прямоугольников»
textual
Листинг программы
- uses graph,wincrt;
- const n=20;{количество разбиений}
- a=-1.5;{интервал по х для графиков}
- b=1.5;
- type func=function(x:real):real;
- {функции по условию}
- function F1(x:real):real;
- begin
- F1:=x*x+0.4*x+0.1;
- end;
- function F2(x:real):real;
- begin
- F2:=-0.2*x+0.8;
- end;
- {вычисление интеграла методом прямоугольников}
- function Integral(f:func;xn,xk:real):real;
- var h,x,s:real;
- i:integer;
- begin
- h:=(xk-xn)/n;
- x:=xn+h/2;
- s:=0;
- for i:=1 to n do
- begin
- s:=s+f(x);
- x:=x+h
- end;
- Integral:=s*h;
- end;
- var max,mx,my,dx:real;
- x,x1,x2,xz,yz,p1,p2,p:real;
- x0,y0,i,z,k:integer;
- s:string;
- begin
- initgraph(x0,y0,' ');
- {найдем максимум для масштаба по У
- а также абциссы точек пересечения графиков х1,х2}
- x:=a;
- max:=F1(a);
- dx:=0.001;
- k:=0;
- while x<=b+dx do
- begin
- if F1(x)>max then max:=F1(x);
- if F2(x)>max then max:=F2(x);
- if (abs(F1(x)-F2(x))<2*dx) and(k=0) then
- begin
- k:=1;
- x1:=x;{первое пересечение}
- end
- else if (abs(F1(x)-F2(x))<2*dx) and(k=1)
- then x2:=x; {второе}
- x:=x+dx;
- end;
- {определим площадь фигуры}
- p1:=Integral(@F1,x1,x2);
- p2:=Integral(@F2,x1,x2);
- p:=abs(p1-p2);
- x0:=getmaxX div 2;
- mx:=(x0-30)/b;{масштаб по Х}
- y0:=getmaxY-50;
- my:=(y0-20)/max;{по У}
- if 2*b>max then z:=trunc(2*b)+1{количество засечек по осям}
- else z:=trunc(max)+1;
- setfillstyle(1,15);{цвет фона белый};
- bar(0,0,getmaxX,getmaxY);
- setcolor(8);{цвет линий}
- settextstyle(0,0,2);
- line(0,y0,getmaxX,y0);{оси}
- line(x0,0,X0,getmaxY);
- for i:=1 to z do{максимальное количество засечек в одну сторону}
- begin
- line(x0-3,y0-round(i*my),x0+3,y0-round(i*my));{засечки на оси У}
- line(x0+round(i*mx),y0-3,x0+round(i*mx),y0+3); {засечки на оси Х}
- line(x0-round(i*mx/2),y0-3,x0-round(i*mx/2),y0+3);
- {подпись оси У}
- str(i,s);
- outtextXY(x0-35,y0-round(i*my),s);{соответственно засечкам}
- {подпись оси Х}
- str(i/2:0:1,s);
- outtextXY(x0+round(i*mx/2),y0+10,s);
- outtextXY(x0-round(i*mx/2),y0+10,'-'+s);
- end;
- {центр}
- outtextXY(x0+5,y0+10,'0');
- {подписи концов осей}
- outtextXY(getmaxX-10,y0-10,'X');
- outtextXY(x0+5,10, 'Y');
- {графики}
- x:=a;
- while x<=b do
- begin
- putpixel(x0+round(x*mx),y0-round(F1(x)*my),9);
- putpixel(x0+round(x*mx),y0-round(F2(x)*my),12);
- x:=x+dx;
- end;
- {название}
- outtextXY(x0+20,20,'Grafiki functij');
- setcolor(9);
- outtextXY(x0+20,40,'y=x^2+0.4x+0.1');
- setcolor(12);
- outtextXY(x0+20,60,'y=-0.2x+0.8');
- setcolor(8);
- outtextXY(x0+20,80,'na intervale [-1.5;1.5]');
- {область перекрытия}
- setcolor(13);
- x:=x1-10*dx;{рисуем линию по 1 графику}
- moveto(x0+round(x*mx),y0-round(F1(x)*my));
- while x<=x2+10*dx do
- begin
- lineto(x0+round(x*mx),y0-round(F1(x)*my));
- x:=x+dx;
- end;
- {то же по 2}
- x:=x1-10*dx;
- moveto(x0+round(x*mx),y0-round(F1(x)*my));
- while x<=x2+10*dx do
- begin
- lineto(x0+round(x*mx),y0-round(F2(x)*my));
- x:=x+dx;
- end;
- {заливаем}
- xz:=(x2+x1)/2;
- yz:=F1(xz);
- setfillstyle(1,14);
- floodfill(x0+round(xz*mx),y0-round(yz*my)-10,13);
- str(p:0:2,s);
- settextstyle(0,0,2);
- outtextXY(x0+round(xz*mx)-40,y0-round(yz*my)-100,'S='+s);
- readkey
- end.
Объяснение кода листинга программы
- Объединение двух функций в одну новую функцию с помощью оператора
+
- Нет
- Использование оператора
If
для определения, какая из двух функций должна быть вычислена- Нет
- Использование оператора
While
для цикла по точкам на интервале- Да
- Использование функции
Integral
для вычисления площади под графиком- Да
- Использование функции
Abs
для вычисления абсолютного значения разности функций- Да
- Использование функции
Round
для округления чисел до ближайшего целого числа- Да
- Использование функции
Trunc
для округления чисел до ближайшего целого числа в меньшую сторону- Да
- Использование функции
Moveto
для перемещения курсора в начало линии- Да
- Использование функции
Lineto
для рисования линии между двумя точками- Да
- Использование функции
Floodfill
для заливки прямоугольника цветом- Да
- Использование функции
OuttextXY
для вывода текста на экран- Да
- Использование функции
Readkey
для ожидания нажатия клавиши- Да
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д