Вывести график полученный из 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
для ожидания нажатия клавиши- Да
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д