2011-12-31 4 views
1

上の2次元のルンゲ・クッタ法私はMathematicaの8でプログラミングしているときに問題があり、ここに私のコードは次のとおりです。のMathematica 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]; 

事は、私はルンゲクッタ法を実装しようとしている、です。実際には成功しましたが、1次元の関数f[x_]しかありませんでした。このコードは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次元の関数に対してルンゲクッタ法をどのように実装しましたか?

私を助けることができたら、私は感謝します。

ありがとうございます!

PS:ルンゲクッタ法は、順序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]; 

私は基本的に2次方程式を解くことができるmathematicaプログラムを持っていることを知っています! Runge-Kutta法による。 tは独立した値であり、Y1は、関数自体のy(t)はちょうど

f[t_, y1_, y2_]:= [Insert your function here] 

にあなたの関数を挿入し、Y2は、Y '(t)です。 コールスルー機能:は最初の「T」値である

RungeKutta3[a, b, [Alpha], n, F]; 

B最後の「T」値、[アルファ]あなたの関数の初期値と一次微分(形式{y1(a)、y2(a0)}で与えられる)、nあなたが表現したいと思う点の数。ご不明な点はお気軽にお

fをに与える機能のにもかかわらず、Fは、あなたが挿入する必要が関数であります! PS:Runge-Kutta問題は、微分方程式を初期値の問題で解くために、境界値の問題を解決するためにこのプログラムをベースとして使用しました。あなたはNDSolveでオプションに

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

を使用した場合

+0

1すばやく簡単にアドバイスあなたの関数に大文字の最初の文字を指定しないでください。最初の文字の大文字の関数がMathematicaで使われている。 – Nasser

+0

どのようなエラーが表示されますか?アウトプットはあなたが期待していたものとどう違うのですか? – Verbeia

+0

私は問題を解決したと思います!ありがとう@ NasserM.Abbasi、私は前にチェックしたが、ええイブはそれほど聞いた;) – user1123767

答えて

1

はあなたのコードだけで、つまり、すでにMathematicaに組み込まれているものが実装されていませんか?

(これは、「自分自身のローリング」には価値がない提案することではありません:。おそらくあなたは、あなた自身のためか、学生のための学習運動としてそれをやりたい、または学生自身など)が

+1

ああそうです。私は学生ですが、これは私がやらなければならない仕事ですが、私の先生はちょうどそのような選択肢が存在していると笑ってくれました。ありがとう – user1123767