unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
yy0: TEdit;
tt0: TEdit;
Label1: TLabel;
Label2: TLabel;
nn: TEdit;
Label3: TLabel;
bb: TEdit;
Label4: TLabel;
ListBox1: TListBox;
Button1: TButton;
gr: TImage;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
i,n:integer;
q1,q2:array [1..10000] of real;
implementation
{$R *.dfm}
Procedure RK;
function f(tt,yy:real):real;
begin
f:=3*tt*yy+tt-6*tt; {Правая часть приведеного диф. уравнеия}
end;
var
k1,k2,k3,k4,y0,t0,y,t,h,b:real;
begin
DecimalSeparator:='.'; {Переименовывание разделителя десятичных чисел}
y0:=StrToFloat(form1.yy0.text); {считывание данных из тектових блоков}
t0:=StrToFloat(form1.tt0.text);
b:=StrToFloat(form1.bb.Text);
n:=StrToInt(form1.nn.text);
h:=(b-t0)/n; y:=y0; t:=t0; {Вычисление шага, присвоения нулевых значений, переменным у,t}
for i:=1 to n do {Начало цикла вычислений}
begin
q1[i]:=t; {Занесение значений t,y к массивив}
q2[i]:=y;
form1.ListBox1.Items.Add('t = '+FloatToStr(t)+' y = '+FloatToStr(y)); {Виведение значений t,y}
k1:=f(t,y);
k2:=f((t+h/2),(y+(h*k1)/2));
k3:=f((t+h/2),(y+(h*k2)/2));
k4:=f((t+h),(y+h*k3));
y:=y+(h*(k1+2*k2+2*k3+k4))/6; {Вычисление следующего значения в по итерационной формуле}
t:=t+h; {Вычисление следующего значения t}
end;
form1.ListBox1.Items.Add('t = '+FloatToStr(t)+' y = '+FloatToStr(y)); {Выведение последнего значения t,y}
end;
Procedure graph;
var
x1,x2,x,y,y1,y2,my,mx:real;
h,w,l,b:integer;
zh,zw,zn,zz,x0,y0:integer;
i:integer;
begin
DecimalSeparator:='.'; {Переименовывание разделителя десятичных чисел}
form1.gr.Canvas.Brush.color:=clWhite; {Закрашивание области графика}
form1.gr.canvas.Brush.style:=bsSolid;
form1.gr.Canvas.rectangle(0,0,form1.gr.clientWidth,form1.gr.clientHeight);
x1:=q1[1]; {Задання наименьшего и наибольшего значения х из массивив}
x2:=q1[n];
l:=60; {Задание Х,У координат левой нижней точки графику}
w:=form1.gr.ClientWidth-80; {Задание ширины и высоты области графику}
b:=form1.gr.ClientHeight-30;
h:=form1.gr.clientHeight-60;
zn:=10; {Количество квадратов сетки}
i:=1;
repeat
y:=q2[i]; {Знахождение максимального и минимального значения у}
if y<y1 then y1:=y;
if y>y2 then y2:=y;
i:=i+1; until i>n;
my:=h/(y2-y1); mx:=w/(x2-x1); {Вычисление масштаба по у, х}
x0:=l; {Задання координат, откуда станет строиться график}
y0:=b;
with form1.gr.Canvas do
begin pen.color:=cllime;
zh:=h div 10;
zw:=w div 10;
for zz:=0 to (zn-1) do
begin
zh:=zh*zz; zw:=zw*zz;
moveto(l+zw,b); lineto(l+zw,b-h); {Рисование осей}
moveto(l,(b - zh)); lineto(w+l,(b - zh));
textout(l+zw,y0 + 10, FloatToStrF(x1+(x2-x1)*zz/zn,ffGeneral,4,2)); {Подписование осей}
textout(l-50,(y0 - zh), FloatToStrF(y1+(y2-y1)*zz/zn,ffGeneral,4,2));
zh:=h div 10;
zw:=w div 10;
end;
textout(l-50,b-h-10,FloatToStrF(y2,ffGeneral,4,2));
textout( (l+round(x2*mx)) , y0 + 10,FloatToStrF(x2,ffGeneral,4,2));
x:=x1;
x0:=l-round(x1*mx);
pen.Color:=clred; {построение графика}
for i:=2 to n do
begin
moveto(x0+round(q1[i-1]*mx),(y0+round(y1*my)-round(q2[i-1]*my)) );
lineto(x0+round(q1[i]*mx),(y0+round(y1*my)-round(q2[i]*my)));
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
form1.listbox1.Items.Clear; {Очистка таблицы, вычисления, построение графика}
Rk; graph;
end;
end.