Простые итерации и график функции

Программа, реализующая метод простых итераций и строящая график заданной и итерационной функции.
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.
Онлайн всего: 38
Гостей: 38
Пользователей: 0

STUDLAB Сообщить про опечатку на сайте