Пользователь
Регистрация: 17.10.2009
Сообщений: 20
|
Метод Рунге Кутты и Эйлера
Здраствуйте господа программисты!
нужно решить диф уравнение f(x,y)=x^2+y^2
на интервале [0,1] методом Рунге Кутты и методом эйлера
и построить график полученной функции
я чето накропал
Код:
{$N+}
const
eps = 1e-5;
x0 = 0;
y0 = 0;
type
TFunc = function(x,y: extended): extended;
function func(x,y: extended): extended; far;
begin
func :=sqr(x)+sqr(y);
end;
function Euler(f: TFunc; x0_,x_end,y0_: extended; n: word): extended;
{ где x0_ и y0_ - начальное условие
x_end - точка, в которой необходимо вычислить результат
n - количество шагов для вычисления результата }
var
i : word; { счетчик цикла }
x,h : extended; { текущая точка и длина шага }
res : extended; { переменная для накопления конечного результата функции}
begin
h:= (x_end - x0_)/n; { Находим длину шага }
res:= y0_; { устанавливаем начальные значения}
x:=x0_;
for i:=1 to n do
begin { вычисляем результат по методу Эйлера }
res:=res+h*f(x,res);
x:=x+h; { переходим к следующей точке }
end;
Euler:=res; { присваиваем конечный результат функции }
end;
function Euler2(f: TFunc; x0_,x_end,y0_: extended; n: word): extended;
{ где x0_ и y0_ - начальное условие
x_end - точка, в которой необходимо вычислить результат
n - количество шагов для вычисления результата }
var
i : word; { счетчик цикла }
x,h : extended; { текущая точка и длина шага }
res : extended; { переменная для накопления конечного результата функции}
begin
h:= (x_end - x0_)/n; { Находим длину шага }
res:= y0_; { устанавливаем начальные значения}
x:=x0_;
for i:=1 to n do
begin { вычисляем результат по исправленному методу Эйлера }
res:=res+h*(f(x,res)+f(x+h,res+h*f(x,res)))/2;
x:=x+h; { переходим к следующей точке }
end;
Euler2:=res; { присваиваем конечный результат функции }
end;
function RungeKutt(f: TFunc; x0_,x_end,y0_: extended; n: word): extended;
{ где x0_ и y0_ - начальное условие
x_end - точка, в которой необходимо вычислить результат
n - количество шагов для вычисления результата }
var
i : word; { счетчик цикла }
x,h : extended; { текущая точка и длина шага }
res : extended; { переменная для накопления конечного результата функции }
k1,k2,k3,k4: extended; { вспомогательные переменные вычисления результата }
begin
h:= (x_end - x0_)/n; { Находим длину шага }
res:= y0_; { устанавливаем начальные значения}
x:=x0_;
for i:=1 to n do
begin { вычисляем результат по методу Рунге-Кутта 4го порядка }
k1:=f(x,res);
k2:=f(x+h/2,res+h*k1/2);
k3:=f(x+h/2,res+h*k2/2);
k4:=f(x+h,res+h*k3);
res:=res+h*(k1+2*k2+2*k3+k4)/6;
x:=x+h; { переходим к следующей точке }
end;
RungeKutt:=res; { присваиваем конечный результат функции }
end;
begin
writeln('4islennoe resenie div uravnenia:');
writeln(#10,' k'' =y^2+x^2 k(0)=0; x_end=',1);
writeln(#10,'method Eilera:');
writeln('n=5 000, result: ',Euler(func,x0,1,y0,5000):5:5);
writeln('n=10 000, result: ',Euler(func,x0,1,y0,10000):5:5);
writeln('n=25 000, result: ',Euler(func,x0,1,y0,25000):5:5);
writeln(#10,'method Eilera2:');
writeln('n=50, result: ',Euler2(func,x0,1,y0,50):5:5);
writeln('n=100, result: ',Euler2(func,x0,1,y0,100):5:5);
writeln('n=250, result: ',Euler2(func,x0,1,y0,250):5:5);
writeln(#10,'method Ronge kytta:');
writeln('n=50, result: ',RungeKutt(func,x0,1,y0,50):5:5);
writeln('n=100, result: ',RungeKutt(func,x0,1,y0,100):5:5);
writeln('n=200, result: ',RungeKutt(func,x0,1,y0,200):5:5);
write(#10,'Press Enter to continue.');
readln;
end.
сделал методом Рунге Кутты в маткаде
|