Так она и должна с разрывами рисовать при быстром изменении значения функции, график-то рисуется точками.
Рисовать графики стоит не одновременно, а сначала полностью один, затем другой. Это позволит использовать LineTo вместо PutPixel. Разрывы будут исключены. Можно рисовать и одновременно оба, но для каждой функции надо будет помнить предыдущее значение и использовать Line для рисования.
Добавлено спустя 31 минуту 42 секунды:Вот немного переделал:
Код: Выделить всё
program oo;
uses crt, graph;
const
gamma=0.0;
w0=1;
n=1000;
dt=0.01;
var
fi,v,a0,t,E,E0,fi0,v0,fi_n,v_n,fi1,v1:extended;
i,gd,gm: integer;
xa,ya,xb,yb,x,y: integer;
first: boolean;
function fun(v,fi:extended):extended;
begin
fun:=-2*gamma*v-sqr(w0)*sin(fi);
end;
begin
gd:=detect;
initgraph(gd,gm, '');
v:=1;fi:=1;t:=0;E0:=sqr(v)/2-sqr(w0)*cos(fi);
first:=true;
repeat
fi0:=fi;v0:=v;a0:=fun(v0,fi0);
{ fi:=fi+v*dt;
v:=v+a0*dt; }
fi1:=fi+v*dt;
v1:=v+fun(v,fi)*dt;
fi_n:=fi+dt*(v+v1)/2;
v_n:=v+dt/2*(fun(v,fi)+fun(v1,fi1));
fi:=fi_n;
v:=v_n;
E:=sqr(v)/2-sqr(w0)*cos(fi);
t:=t+dt;
if first then
begin
line(320,0,320,480);
line(0,240,640,240);
xa:=320+trunc(fi*100);
ya:=240-trunc(v*100);
xb:=320+trunc(t*5);
yb:=240-trunc((E/E0-1)*500000);
first:= false;
continue
end;
x:=320+trunc(fi*100);
y:=240-trunc(v*100);
setcolor(green); line(xa,ya,x,y);
xa:=x; ya:=y;
x:=320+trunc(t*5);
y:=240-trunc((E/E0-1)*500000);
Setcolor(red); line(xb,yb,x,y);
xb:=x; yb:=y;
until keypressed;
readln;
end.
Советую посмотреть ещё здесь
viewtopic.php?f=1&t=2053