вторник, 7 октября 2008 г.

Основы информатики. Вычисление обыкновенных дифференциальных уравнений.

Аппарат дифференциальных уравнений, несомненно, является наиболее мощным и наиболее распространенным средством описания процессов и явлений в самых разнообразных областях. Следовательно, именно дифференциальные уравнения являются наиболее часто используемыми инструментами математического моделирования. Именно поэтому дифференциальным уравнениям в данной главе уделено наибольшее внимание.
Предполагается, что читателю известны начальные сведения из теории обыкновенных дифференциальных уравнений (ОДУ). Освежив в памяти эти сведения, читатель вспомнит о том, что для ОДУ порядка выше первого (для определенности будем говорить об уравнениях второго порядка) возможны две принципиально различные постановки задачи решения уравнения. Если все начальные условия, определяющие, в конечном итоге, значения функции и ее производных, заданы в одной точке - на одном из концов интервала изменений независимой переменной, то говорят, что сформулирована задача Коши, или начальная задача. Если условия заданы на обоих концах интервала, на котором строится решение, то такая задача решения ОДУ называется краевой. Для уравнений первого порядка имеет смысл говорить только о начальной задаче, поскольку для них задается единственное условие. Основное наше внимание будет уделено решению задач Коши для ОДУ. Начнем с уравнения первого порядка, которое в общем виде можно представить в форме F(y',y,x)=0 c начальным условием y(x0)=y0. Далее будем считать, что уравнение может быть разрешено относительно производной так, что приводится к виду:
Все методы интегрирования ОДУ в задачах Коши сводятся к приближенному вычислению последующего значения yi в точке xi через предыдущее значение yi-1 в точке xi-1, при заданном из начального условия значении y0. В простейших случаях можно исходить из непосредственного определения понятия производной, переходя от бесконечно малых к конечным разностям:При этом нетрудно убедится, что из дифференциального уравнения следует:
Внимательный читатель заметит, что не мешало бы поставить индексы у x и y в аргументах функции f(y,x). Читатель, несомненно, прав. Вот вопрос о том, какие индексы поставить, весьма нетривиален. Вообще-то мы можем выбрать i или i-1 для независимой переменной и искомой функции произвольно. Все равно приближенное равенство должно быть справедливым. Обе возможности, действительно, можно реализовать. Если выбор за индексом i-1, то получаем формулу МЕТОДА ЭЙЛЕРА:
В противном случае имеем формулу НЕЯВНОЙ СХЕМЫ:

Задание:Решить дифференциальное уравнение 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.

Скачать проект

Комментариев нет: