Здравствуйте, уважаемые товарищи.
Подскажите пожалуйста, как можно с помощью Mathematica реализовать метод рунге кутта для системы из 2 уравнений с двумя переменными
где мы знаем значения
В итоге надо применить метод к системе в таком ввиде
Я нашёл решение похожей задачи и код для неё тут
http://wps.prenhall.com/wps/media/objects/884/905485/chapt4/proj4.3A/proj4-3A.pdfВ коде реализован метод Рунге кутта для системы из 2 уравенений, для примера
Код:
pi = N[Pi];
f[t_,x_,y_] := -pi*y
g[t_,x_,y_] := pi*x
t = t0; x = x0; y = y0;
Do[k1 = f[t, x, y];
l1 = g[t, x, y];(*left-hand slopes*)
k2 = f[t + h/2, x + h*k1/2, y + h*l1/2];
l2 = g[t + h/2, x + h*k1/2, y + h*l1/2];(*1st midpt slopes*)
k3 = f[t + h/2, x + h*k2/2, y + h*l2/2];
l3 = g[t + h/2, x + h*k2/2, y + h*l2/2];(*2nd midpt slopes*)
k4 = f[t + h, x + h*k3, y + h*l3];
l4 = g[t + h, x + h*k3, y + h*l3];(*right-hand slopes*)
k = (k1 + 2*k2 + 2*k3 + k4)/6;(*average x-slope*)
l = (l1 + 2*l2 + 2*l3 + l4)/6;(*average y-slope*)
x = x + h*k;(*update x*)y = y + h*l;(*update y*)t = t + h;(*update t*)
If[ Floor[i/m] == i/m,
Print[180*t,PaddedForm[x,{10,4}],
PaddedForm[y,{10,4}]]],
(* display each mth value *)
{i,1,n} ]
15. 0.9659 0.2588
30. 0.8660 0.5000
45. 0.7071 0.7071
60. 0.5000 0.8660
75. 0.2588 0.9659
90. 0.0000 1.0000
Я попытался переделать, но в результате программа выдаёт очень странный результат
Код:
f[t_, x_, y_] := 2*x - 0.002*x*y
g[t_, x_, y_] := -1*y + 0.002*x*y
t0 = 0; x0 = 1; y0 = 0; tf = 0.5;
n = 12;(*number of subintervals*)m = 2;
(*to print every mth step*)h = (tf - t0)/n;(*step size*)
t = t0; x = x0; y = y0;
Do[k1 = f[t, x, y];
l1 = g[t, x, y];(*left-hand slopes*)
k2 = f[t + h/2, x + h*k1/2, y + h*l1/2];
l2 = g[t + h/2, x + h*k1/2, y + h*l1/2];(*1st midpt slopes*)
k3 = f[t + h/2, x + h*k2/2, y + h*l2/2];
l3 = g[t + h/2, x + h*k2/2, y + h*l2/2];(*2nd midpt slopes*)
k4 = f[t + h, x + h*k3, y + h*l3];
l4 = g[t + h, x + h*k3, y + h*l3];(*right-hand slopes*)
k = (k1 + 2*k2 + 2*k3 + k4)/6;(*average x-slope*)
l = (l1 + 2*l2 + 2*l3 + l4)/6;(*average y-slope*)
x = x + h*k;(*update x*)y = y + h*l;(*update y*)t = t + h;(*update t*)
If[Floor[i/m] == i/m,
Print[180*t, PaddedForm[x, {10, 4}],
PaddedForm[y, {10, 4}]]],(*display each mth value*){i, 1, n}]
(Оффтоп)
15. 0.9659 0.2588
30. 0.8660 0.5000
45. 0.7071 0.7071
60. 0.5000 0.8660
75. 0.2588 0.9659
90. 3.8197*10^(-6) 1.0000
Помогите пожалуйста понять, что нужно изменить
Спасибо большое