Простые итерации и график функции
Программа, реализующая метод простых итераций и строящая график заданной и итерационной функции.
uses crt, graph; const a=-1.5; b=1.5; n=5000; type func=function(x:real):real; {$F+} var x1,x0,eps,s, m1, m2, maxx, maxy :real; i, cx, cy, mx, my, driver, mode:integer; function fx(x:real):real; {Oписание функции} begin fx:=x end; function f(x:real):real; {Oписание функции} begin f:=2*x-cos(x) end; {Описание функциии fi(x) для эквивалентного уравнения x=fi(x)} function fi(x:real):real; begin fi:=cos(x)/2; end; {Описание метода итераций} function iterac(var x0,e:real):real; var n:integer;delta:real; begin n:=0; writeln('Промежуточныe значения метода итераций'); repeat delta:=abs(x0-fi(x0)); writeln('x', n:1,' = ',x0:8:5,' fi(x', n:1, ')=', fi(x0):8:5,' eps=',delta:8:5); x0:=fi(x0); readln; n:=n+1; until (delta300); writeln('Число итераций =',n); iterac:= x0 end; function max(f:func):real; var x,m:real; begin x:=a; m:=f(x); repeat x:=x+s; if f(x)>m then m:=f(x); until x>b+s/2; max:=m; end; function min(f:func):real; var x,m:real; begin x:=a;m:=f(x); repeat x:=x+s; if f(x) b+s/2; min:=m; end; procedure OsiXY; var sx,sy:real; strx:string; ix,iy,k:integer; begin SetBkColor(White);SetColor(Blue); line(10,cy,getmaxx-35,cy);{?бм X} line(getmaxx-45,cy-5,getmaxx-35,cy); line(getmaxx-45,cy+5,getmaxx-35,cy); line(cx,30,cx,getmaxy-20); {?бм Y} line(cx-5,40,cx,30);line(cx+5,40,cx,30); settextstyle(0,0,1); outtextxy(cx+10,40,'Y');outtextxy(getmaxx-45,cy-10,'X'); settextstyle(2,0,0); sx:=cx;k:=0; repeat sx:=sx+mx/10; ix:=round(sx); k:=k+1; line(ix,cy,ix,cy-3); if (k mod 10)=0 then begin str(round(k/10),strx); outtextxy(ix,cy+2,strx); end; until ix>getmaxx-50; sx:=cx;k:=0; repeat sx:=sx-mx/10; ix:=round(sx); k:=k-1; line(ix,cy,ix,cy-3); if (k mod 10)=0 then begin str(round(k/10),strx); outtextxy(ix-8,cy+2,strx); end; until ix<30; if round(my/10)>0 then begin sy:=cy;k:=0; repeat sy:=sy+my/10; iy:=round(sy); k:=k-1; line(cx,iy,cx+3,iy); if (k mod 10)=0 then begin str(round(k/10),strx); outtextxy(cx+5,iy-5,strx); end; until iy>getmaxy-20 ; sy:=cy;k:=0; repeat sy:=sy-my/10; iy:=round(sy); k:=k+1; line(cx,iy,cx+3,iy); if (k mod 10)=0 then begin str(round(k/10),strx); outtextxy(cx+5,iy-5,strx); end; until iy<60; end; end; procedure MyGraf(f:func;Color,R:byte); var ex,ey:word;x,y:real; begin setcolor(Color); setlinestyle(0,0,R); x:=a;y:=f(x); Moveto(round(cx+x*mx),round(cy-y*my)); Repeat x:=x+s;y:=f(x); ex:=round(cx+x*mx);ey:=round(cy-y*my); Lineto(ex,ey); if R=1 then Circle(ex,ey,R); Until ex>getmaxx-50 end; Begin s:=abs(b-a)/n; m1:=abs(max(fi)); m2:=abs(min(fi)); if m1>maxy then maxy:=m1; if m2>maxy then maxy:=m2; m1:=abs(max(fx)); m2:=abs(min(fx)); if m1>maxy then maxy:=m1;if m2>maxy then maxy:=m2; m1:=abs(max(f)); m2:=abs(min(f)); if m1>maxy then maxy:=m1; if m2>maxy then maxy:=m2; if abs(a)>abs(b) then maxx:=abs(a) else maxx:=abs(b); driver:=detect; initgraph(driver,mode,'d:\tp\bgi'); cleardevice; mx:=round((getmaxx-50)/(2*maxx)); my:=round((getmaxy-100)/(2*maxy)); if my<20 then my:=20; cx:=round(getmaxx/2);cy:=round(getmaxy/2); setcolor(Blue); OsiXY; MyGraf(fi,Green,1); MyGraf(fx,Blue,2); readln; closegraph; TextBackGround(Blue); TextColor(Yellow); clrscr; write('Начальное значение корня = ');readln(x0); write('Точность вычисления корня = ');readln(eps); x1:=iterac(x0,eps); writeln('Приближенное значение корня с точностью ',eps:7:5); writeln('x =',x1:8:6); readln; driver:=detect; initgraph(driver,mode,'d:\tp\bgi'); cleardevice; OsiXY; MyGraf(f,Magenta,3); readln end.