我有一个问题,而在编程数学8,这里是我的代码:2维龙格 - 库塔法对数学8
f[t_, y_] := {y, y};
RungeKutta3[a_, b_, Alpha_, n_, f_] :=
Module[{h, j, k1, k2, k3},
h = (b - a)/n;
Y = T = Table[0, {100 + 1}];
Y[[1]] = Alpha;
T[[1]] = a;
For[j = 1, j <= n, ++j,
k1 = f[T[[j]], Y[[j]]];
k2 = f[T[[j]] + h/2, Y[[j]] + k1*h/2];
k3 = f[T[[j]] + h, Y[[j]] + (-k1 + 2 k2)h];
Y[[j + 1]] = Y[[j]] + h/6(k1 + 4 k2 + k3);
(* Print[j, "----->", Y[[j]]];*)
T[[j + 1]] = T[[j]] + h;
];];
RungeKutta3[0., 1., {300., 500}, 2, f];
的事情是,我试图实现一个龙格 - 库塔方法。实际上,我的成功,但只有一个功能f[x_]
有1维。此代码适用于2维,但它不起作用,我不知道为什么。下面是仅有1维的代码示例(请注意,当我称之为“RungeKutta3”时,我必须更改第一行来定义函数和最后一行)。
f[t_, y_] := y;
RungeKutta3[a_, b_, Alpha_, n_, f_] :=
Module[{h, j, k1, k2, k3},
h = (b - a)/n;
Y = T = Table[0, {100 + 1}];
Y[[1]] = Alpha;
T[[1]] = a;
For[j = 1, j <= n, ++j,
k1 = f[T[[j]], Y[[j]]];
k2 = f[T[[j]] + h/2, Y[[j]] + k1*h/2];
k3 = f[T[[j]] + h, Y[[j]] + (-k1 + 2 k2)*h];
Y[[j + 1]] = Y[[j]] + h/6*(k1 + 4 k2 + k3);
(* Print[j, "----->", Y[[j]]];*)
T[[j + 1]] = T[[j]] + h;
];];
RungeKutta3[0., 1., 300., 100, f];
总结一下,我如何实现一个2维函数的Runge-Kutta方法?
如果你能帮助我,我将不胜感激。
在此先感谢!
PS:所述Runge-Kutta方法是3阶
----------------------
问题解决了!检查代码,如果有人需要任何帮助,只需询问!
f[t_, y1_, y2_] := 3 t*y2 + Log[y1] + 4 y1 - 2 t^2 * y1 - Log[t^2 + 1] - t^2;
F[t_, {y1_, y2_}] := {y2, f[t, y1, y2]};
RungeKutta3[a_, b_, [Alpha]_, n_, f_] :=
Module[{h, j, k1, k2, k3, Y, T, R},
h = (b - a)/n;
Y = T = Table[0, {n + 1}];
Y[[1]] = [Alpha]; T[[1]] = a;
For[j = 1, j <= n, ++j,
k1 = f[T[[j]], Y[[j]]];
k2 = f[T[[j]] + h/2, Y[[j]] + k1*h/2];
k3 = f[T[[j]] + h, Y[[j]] + (-k1 + 2 k2)*h];
Y[[j + 1]] = Y[[j]] + h/6*(k1 + 4 k2 + k3);
T[[j + 1]] = T[[j]] + h;
];
R = Table[0, {n + 1}];
For[j = 1, j <= n + 1, j++, R[[j]] = Y[[j]][[1]]];
Print[ListPlot[Transpose[{T, R}]]]
];
RungeKutta3[0., 1, {1., 0.}, 1000, F];
我知道基本上有一个mathematica程序,可以解决任何二阶方程!通过Runge-Kutta方法。只需插入您的功能
f[t_, y1_, y2_]:= [Insert your function here]
其中t是独立值,y1是函数本身y(t),y2是y'(t)。 调用函数通过:
RungeKutta3[a, b, [Alpha], n, F];
其中一个是初始“t”的值,b最后的“t”的值,α-你的函数的初始值和一阶导数(以{y1(a),y2(a0)})的形式给出,n您想要表示的等间隔点数。 ˚F是你尽管功能的插入你给˚F
任何问题随时问功能! PS:Runge-Kutta问题解决了带有初始值问题的微分方程,我使用这个程序作为解决边界值问题的基础,如果你只想给我发短信的话!
一个快速简便的建议,不要用大写的第一个字母来命名你的函数。Mathematica使用第一个字母的大写字母函数。 – Nasser 2011-12-31 01:53:19
你得到了什么错误?输出与预期的不同之处如何? – Verbeia 2011-12-31 02:56:25
我想我已经解决了这个问题!谢谢@ NasserM.Abbasi,我知道,我以前检查过,但是耶和华听到很多;) – user1123767 2011-12-31 02:57:16