1

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];

問題は、ルンゲ・クッタ法を実装しようとしているということです。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 次元の関数にルンゲクッタ法を実装するにはどうすればよいですか??

あなたが私を助けることができれば、私は感謝します.

前もって感謝します!

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];

私は基本的にどんな二次方程式も解くことができるMathematica プログラムを持っていることを知っています! ルンゲクッタ法で。関数を挿入するだけです

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

ここで、t は独立した値、y1 は関数自体 y(t)、y2 は y'(t) です。次の方法で関数を呼び出します。

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

ここで、aは初期の "t" 値、bは最終的な "t" 値、[アルファ]は関数の初期値と 1 次導関数 ({y1(a),y2(a0)} の形式で指定)、n表現したい等間隔の点の数。Fは、 fに与える関数にもかかわらず、挿入する必要がある関数です

ご不明な点はお気軽にどうぞ!! PS: ルンゲ クッタ問題は、初期値の問題を含む微分方程式を解きます。境界値の問題を解くためのベースとしてこのプログラムを使用しました。

4

1 に答える 1

1

あなたのコードは Mathematica にすでに組み込まれているものを実装しているだけではありませんか?つまり、オプションを使用する場合

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

NDSolveに?

(これは、「独自のものを作成する」ことに価値がないことを示唆しているわけではありません。おそらく、自分自身または学生のための学習演習として、または学生自身としてそれを行いたいと考えています。)

于 2012-01-08T23:25:19.540 に答える