Предполагается, что читателю известны начальные сведения из теории обыкновенных дифференциальных уравнений (ОДУ). Освежив в памяти эти сведения, читатель вспомнит о том, что для ОДУ порядка выше первого (для определенности будем говорить об уравнениях второго порядка) возможны две принципиально различные постановки задачи решения уравнения. Если все начальные условия, определяющие, в конечном итоге, значения функции и ее производных, заданы в одной точке - на одном из концов интервала изменений независимой переменной, то говорят, что сформулирована задача Коши, или начальная задача. Если условия заданы на обоих концах интервала, на котором строится решение, то такая задача решения ОДУ называется краевой. Для уравнений первого порядка имеет смысл говорить только о начальной задаче, поскольку для них задается единственное условие. Основное наше внимание будет уделено решению задач Коши для ОДУ. Начнем с уравнения первого порядка, которое в общем виде можно представить в форме F(y',y,x)=0 c начальным условием y(x0)=y0. Далее будем считать, что уравнение может быть разрешено относительно производной так, что приводится к виду:
Задание:Решить дифференциальное уравнение y'=y на интервале от 0 до 2 с начальным условием y(0)=1 методом Эйлера и по неявной схеме. Сравнить оба численных решения с точным y=exp(x) путем построения графиков решений. Предусмотреть возможность изменения величины шага интегрирования, и убедиться в том, что с уменьшением шага точность улучшается.
Программный код для МЕТОДА ЭЙЛЕРА:
procedure TForm1.Button2Click(Sender: TObject);
var
x,y,k:real;
begin
paintbox1.Canvas.Pen.Color:=clred;
x:=0;
y:=1;
paintbox1.Canvas.MoveTo(c.X+round(x*f.x),c.y-round(y*f.y));
k:=strtofloat(edit1.Text);
while x<=2 do
begin
paintbox1.Canvas.LineTo(c.x+round(x*f.x),c.y-round(y*f.y));
x:=x+k;
y:=y+y*k;
end;
end;
Программный код для МЕТОДА НЕЯВНОЙ ФУНКЦИИ:
procedure TForm1.Button3Click(Sender: TObject);
var
x,y,k:real;
begin
paintbox1.Canvas.Pen.Color:=clgreen;
x:=0;
y:=1;
paintbox1.Canvas.MoveTo(c.X+round(x*f.x),c.y-round(y*f.y));
k:=strtofloat(edit1.Text);
while x<=2 do
begin
paintbox1.Canvas.LineTo(c.x+round(x*f.x),c.y-round(y*f.y));
x:=x+k;
y:=(y+y*k)*k+y;
end;
end;
Здесь c.x и c.y координаты начала трсчета(центр координатной системы), f.x и f.y фокусы масштабирования по соответствующим осям. Советую всем качать исходник. Если у кого то Delphi ниже 7-й версии, то удалите в исходнике слово XPMan в разделе Uses, и строчку XPManifest1: TXPManifest; в разделе type.
Комментариев нет:
Отправить комментарий