2011-12-31 49 views
1

我有一个问题,而在编程数学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问题解决了带有初始值问题的微分方程,我使用这个程序作为解决边界值问题的基础,如果你只想给我发短信的话!

+0

一个快速简便的建议,不要用大写的第一个字母来命名你的函数。Mathematica使用第一个字母的大写字母函数。 – Nasser 2011-12-31 01:53:19

+0

你得到了什么错误?输出与预期的不同之处如何? – Verbeia 2011-12-31 02:56:25

+0

我想我已经解决了这个问题!谢谢@ NasserM.Abbasi,我知道,我以前检查过,但是耶和华听到很多;) – user1123767 2011-12-31 02:57:16

回答

1

不你的代码只需要实现哪些功能已经内置到数学,即,如果你使用的选项

Method -> {"ExplicitRungeKutta", "DifferenceOrder" -> 3} 

到NDSolve?

(这并不意味着有一个在“滚你自己”没有价值。也许你想这样做,作为一个学习锻炼为自己或学生,或学生自己)

+1

哦,是的,你是对的。我是一名学生,这是我必须做的工作,但我的老师刚告诉我们这样的选择存在,哈哈。谢谢 – user1123767 2012-01-19 12:15:38