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