3_теориЛеготкина / Цель
.docЦель: изучение методов численного интегрирования обыкновенных дифференциальных уравнений на ЭВМ, сравнительный анализ решения
Задание: решить уравнение y”+4y=exp(3x)(13x+7), начальные условия у(0)=0,
y'(0)=-4, интервал интегрирования 0-2, точное решение у=cos(2x)-sin(2x)+exp(3x)(x-1);
Листинг программы
Program difur; uses crt;
const a=0; b=2; h=0.1;
var z,x,y,yisp,Uisp,Upro,Umod,ypro,ymod,zpro,zmod,zisp:array[0..100]of real;
i,n :integer;
begin
clrscr;
n:=round((b-a)/h);
x[0]:=0;
y[0]:=0;
for i:=0 to n do
begin
x[i]:=x[0]+i*h;
y[i]:=cos(2*57.295*x[i])-sin(2*57.295*x[i])+exp(3*x[i])*(x[i]-1);
end;
ypro[0]:=0;
ymod[0]:=0;
yisp[0]:=0;
zmod[0]:=-4;
zisp[0]:=-4;
Методы Эйлера
for i:=0 to 3 do
begin
x[i]:=x[0]+i*h;
простой
Upro[i]:= exp(3*x[i])*(13*x[i]+7)-4*ypro[i]; ypro[i+1]:=ypro[i]+h*Upro[i];
модифицированный
Umod[i]:=exp(3*(x[i]+h/2))*(13*(x[i]+h/2)+7)-4*(ymod[i]+h/2*zmod[i]); ymod[i+1]:=ymod[i]+h*Umod[i]; zmod[i+1]:=zmod[i]+h*(zmod[i]+h/2*ymod[i+1]);
исправленный
Uisp[i]:=0.5*((exp(3*x[i])*(13*x[i]+7)-4*yisp[i])+exp(3*(x[i]+h))*(13*(x[i]+h)+7)-4*(yisp[i]+h*zisp[i])); yisp[i+1]:=yisp[i]+h*Uisp[i];
zisp[i+1]:=zisp[i]+h/2*(zisp[i]+(zisp[i]+h*yisp[i+1]));
end;
Методы Милна
Простой
for i:=3 to n do
begin x[i]:=x[0]+i*h;
1формула
ypro[i+1]:=ypro[i-3]+4*(h/3)*(2*Upro[i-2]-Upro[i-1]+2*Upro[i]); Upro[i+1]:=exp(3*x[i+1])*(13*x[i+1]+7)-4*ypro[i+1];
2 формула
ypro[i+1]:=ypro[i-1]+h/3*(Upro[i+1]+4*Upro[i]+Upro[i-1]);
end;
Модифицированный
for i:=3 to n do
begin
x[i]:=x[0]+i*h;
1 формула
ymod[i+1]:=ymod[i-3]+4*h/3*(2*Umod[i-2]-Umod[i-1]+2*Umod[i]);
Umod[i+1]:=exp(3*(x[i+1]+h/2))*(13*(x[i+1]+h/2)+7)-4*(ymod[i+1]+h/2*ymod[i+1]);
2 формула
ymod[i+1]:=ymod[i-1]+h/3*(Umod[i+1]+4*Umod[i]+Umod[i-1]);
end;
Исправленный
for i:=3 to n do
begin
x[i]:=x[0]+i*h;
1 формула
yisp[i+1]:=yisp[i-3]+4*h/3*(2*Uisp[i-2]-Uisp[i-1]+2*Uisp[i]);
Uisp[i+1]:=0.5*((exp(3*x[i+1])*(13*x[i+1]+7)-4*yisp[i+1])+exp(3*(x[i+1]+h))*(13*(x[i+1]+h)+7)-4*(yisp[i+1]+h*yisp[i+1]));
2 формула
yisp[i+1]:=yisp[i-1]+h/3*(Uisp[i+1]+4*Uisp[i]+Uisp[i-1]);
end;
writeln(' Методы Эйлера ');
writeln('Шаг x Простой Исправл. Модифиц. Точное');
for i:=0 to 2 do begin
write(i:2,' ',a+i*h:2:2,' ',ypro[i]:7:5); write(' ',yisp[i]:7:5);
write(' ',ymod[i]:7:5);writeln(' ',y[i]:7:5); end;
writeln(' Метод Милна ');
for i:=3 to 7 do
begin
write(i:2,' ',a+i*h:2:2,' ',ypro[i]:7:5,' ',yisp[i]:7:5);
write(' ',ymod[i]:7:5); writeln(' ', y[i]:7:5);
end;
for i:=8 to n do
begin
write(i:2,' ',a+i*h:2:2,' ',ypro[i]:7:5,' ',yisp[i]:7:5);
write(' ',ymod[i]:7:5); writeln(' ', y[i]:7:5);
end;
readln;
end.
Вывод: т.к. точное решение в моем варианте кардинально отличается от написанного алгоритма, то, если его не учитывать, можно предположить, что исправленный и модифицированный методы Эйлера более точные, чем простой.