Политех в Сети

Сайт для Учебы

Решение дифференциальных уравнений численными методами

Рейтинг пользователей: / 2
ХудшийЛучший 

Цель: Используя численные методы решить заданную условием задачу сводящуюся к дифференциальному уравнению либо к их системе. Исследовать фазовое движение маятника в данной задаче (нарисовать фазовую траекторию), построить осциллограмму колебаний. Научится программировать задачи с участием дифференциальных уравнений. Изучить численные методы решения и программирования таких задач.

Условие задачи:

Анализ условия, решение в общем виде:

Путём подстановки длины нити в уравнение математического маятника получаем следующую систему уравнений:

Ι) Метод Эйлера.

Выбор численного метода решения и анализ его сходимости:

Данная задача решается известными нам методами: Эйлера и методом Рунге-Кутта. Для начала решим её методом Эйлера. Метод Эйлера характерен своей простотой – это его основное преимущество. Однако у него малая точность (первый порядок точности). В данном методе ошибка «накапливается» потому что приращение значения функции при переходе к следующему шагу заменяется приращением кординаты касательной к кривой решения от предыдущей точки. Метод Эйлера точнее, когда вторая производная функции имеет как можно меньшее значение и «шаги» очень малы.

Алгоритм решения уравнения:

Описание алгоритма: рассмотрев выше составленные уравнения, решаем их по методу Эйлера. Изменяя время на некоторую величину dt, программа выполняет один «шаг» и отправляет все нужные нам значения в графики. Повторяя это, получаем новые значения.

Блок-схема (Для общего случая):

Программный Код Delphi:

Var

G, l0,a, w,ww, ww0,f, f0,t, dt, f1:extended;

Function func(t, f:extended):extended;

Begin

Func:=-(g/(l0+a*sin(w*t)))*f;

End;

Procedure TForm1.Button1Click(Sender: TObject);

Begin

g:=9.81;

l0:=1;

a:=0.7;

w:=6;

Series1.Clear;

t:=0;

f0:=0.1;

ww0:=0;

dt:=0.01;

while t<13 do

begin

t:=t+dt;

ww:=ww0+func(t, f0)*dt;

f1:=f0+(ww+ww0)/2*dt;

Series1.AddXY(f1,ww);

Series2.AddXY(t, f1);

ww0:=ww;

f0:=f1;

end;

End;

End.

Полученные графии (в Delphi):

описание: e:\дифф2.png

ΙΙ) Метод Рунге-Кутта.

Выбор численного метода решения и анализ его сходимости:

Решим данную задачу методом Ренге-Кутта. Этот метод требует большого объёма вычислений по сравнению с методом Эйлера и его модификациями, однако это компенсируется повышенной точностью, что даёт возможность проводить расчёт с большим шагом. Метод Рунге-Кутта имеет четвёртый порядок точности.

Алгоритм решения уравнения:

Решение диффура проводится полностью по методу Рунге-Кутта, и не требует сложных преобразований. Сокращенный пример решения приведен в следующей блок-схеме:

Блок-схема (Для общего случая):

Программный Код Delphi:

Var

G, l0,t, dt, ww, ww0,w, a,f, f0,k1,k2,k3,k4:extended;

Function func(t, f:extended):extended;

Begin

func:=-g/(l0+a*sin(w*t))*f;

End;

Procedure TForm1.Button1Click(Sender: TObject);

Begin

G:=9.81;

L0:=1;

A:=0.7;

W:=6;

F0:=0.1;

Ww0:=0;

T:=0;

Dt:=0.01;

While t<13 do

begin

k1:=func(t, f0);

k2:=func(t+dt/2,f0+k1*dt/2);

k3:=func(t+dt/2,f0+k2*dt/2);

k4:=func(t+dt, f0+k3*dt);

ww:=ww0+(k1+2*k2+2*k3+k4)/6*dt;

f:=f0+(ww+ww0)/2*dt;

Series1.AddXY(f, ww);

t:=t+dt;

Series2.AddXY(t, f);

f0:=f;

ww0:=ww;

end;

End;

End.

Полученный график (в Delphi):

описание: e:\дифф2.png

Вывод: В ходе лабораторной работы мы решили поставленную дифференциальную задачу методами Эйлера и Рунге-Кутта. Разница в полученных значениях для данной задачи на столько мала, что практически не заметна (смотрите график). Были изучены численные методы решения дифференциальных уравнений и их систем. Так же были изучены и обработаны типичные ошибки при программировании данной задач (вывод графиков данного диффура).