Новичок
Джуниор
Регистрация: 05.06.2011
Сообщений: 1
|
TurboPascal - отобразить график функции
Для определения экстремумов функции был выбран метод золотого сечения; для определения нулей функции – метод Ньютона; для определения интеграла – метод Симпсона.
Но график не получается, где то ошибка??
Код:
program graphic;
uses crt, graph;
var driver, mode, errorcode : integer; xm,ym,i,j,n : integer;
x1,y1,x2,y2, sc, xn,xk: real;
st1,st2,st3 : string;
z,a,b,a0,b0,eps,d,l0,r0,l1,r1,r: real;
x,en,h,integ:real;
function f(x:real) : real;
begin
f:= х*х-2*х-3;
end;
function f1(x:real):real; {Первая производная функции}
begin
f1:=2*х-2;
end;
begin
{Построим график функции}
xn:=-10;
xk:=10;
st1:='x';st2:='y';
st3:=' Press ENTER';
sc:=50;
driver:=9; {egavga}
mode:=2; {640х480 пикселей}
initgraph(driver,mode,'d:\bp\bgi'); {инициализация графического режима }
errorcode:=graphresult;
if errorcode<>grok then
begin
writeln('Error init Graph');
closegraph;
halt;
end;
xm:=getmaxx div 2;
ym:=getmaxy div 2;
{ xm=320;ym=240;центр экрана}
line(xm,20,xm,460);{ось y}
line(20,ym,620,ym);{ ось x}
outtextxy(630,ym,st1); {маркировка оси х}
outtextxy(xm,10,st2); {маркировка оси у}
x1:=xn;
for i:=0 to 20 do {разметка оси х вертикальными черточками}
begin
line(xm+round(80*x1),230,xm+round(80*x1),250);
x1:=x1+1;
end;
x1:=xn; {собственно построение графика отрезками прямых}
while x1<xk do
begin
y1:=f(x1);x2:=x1+1/100;
y2:=f(x2);
line(xm+round(80*x1), ym-round(sc*y1),
xm+round(80*x2), ym-round(sc*y2));
x1:=x2;
end;
outtextxy(270,470,st3);
readln;
closegraph;
clrscr;
writeln('vvod levoi i pravoi granic a,b');
readln(a0,b0);
writeln();
{определение экстремумов функции методом золотого сечекния}
writeln('Opredelenie ekstremumov funkcii metodom zolotogo sechenia');
r:=(sqrt(5)-1)/2;
writeln('r=',r:0:4);
a:=a0;
b:=b0;
eps:=0.0001;
writeln('f(a)=',f(a):0:4,' f(b)=',f(b):0:4);
d:=eps/2;
r0:=a+(b-a)*r;
l0:=b-(b-a)*r;
if f(a)>(f(a+d)) then z:=1 else z:=-1;
while abs(b-a)>eps do
begin
r0:=a+(b-a)*r;
l0:=b-(b-a)*r;
if (z*f(l0))<(z*f(r0)) then b:=r0 else a:=20;
end;
if z=1 then writeln('min=',20:0:4, ' f(min)=',f(20):0:4);
if z=-1 then writeln('max=',r0:0:4, ' f(max)=',f(r0):0:4);
readln;
{определение нулей функции методом Ньютона}
writeln ('Opredelenie nuley funkcii metodom Nutona');
a:=a0;
b:=b0;
en:=abs(a-b);
x:=b;
i:=1;
while (abs(en)>eps*0.1) do begin {Пока не достигнута точность}
x:=x-f(x)/f1(x); {выполнить шаг метода}
en:=abs(x-b); {Новая точность}
b:=x; {Значение границы для следующего шага}
i:=i+1; {Номер шага}
end;
writeln ('x=',x:0:4); {вывести значение X }
writeln();
{Определение интеграла методом Симпсона}
writeln('Opredelim integral metodom Simpsona');
a:=a0;
b:=b0;
write('Vvedine kolichestvo razbienii intervala (chetnoe chislo) n='); readln(n);
if (n mod 2)>0 then
begin
n:=n+1;
writeln('Chislo n bilo vvedeno nechetnoe, ono bilo zameneno na n=',n);
end;
h:=(b-a)/n;
integ:=F(a)+F(b)+4*F(a+h);
for i:=1 to (n div 2)-1 do
begin
x:=a+2*h*i;
integ:=integ+2*F(x)+4*F(x+h);
end;
integ:=h*integ/3;
writeln('integral = ',integ:0:4);
readln;
end.
______________
1) Название темы по правилам форума должно адекватно отражать суть решаемой задачи/проблемы.
На первый раз я исправил.
В последующем, темы с подобным названием будут закрываться или удаляться,
а автор такой темы будет получать штрафные баллы.
2) Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.
Последний раз редактировалось Serge_Bliznykov; 05.06.2011 в 15:42.
|