4

私は次の動作するMathematicaコードを持っています:

ODENInit[n_, xIni_] := 
    Join[{x[1][0] == xIni}, Table[x[i][0] == 0, {i, 2, n}]]
ODEN[n_] := 
    Join[{x[1]'[t] == k1 - k2 x[1][t]}, 
    Table[x[i]'[t] == k1 x[i - 1][t] - k2 x[i][t], {i, 2, n}]]
ODENVars[n_] := Table[x[i][t], {i, 1, n}];

Manipulate[
    Module[{sol}, 
        sol = NDSolve[
            Join[ODEN[10], ODENInit[10, 0]] /. {k1 -> mk1, k2 -> mk2}, 
                 ODENVars[10], {t, 0, 10}];
        Plot[Evaluate@Table[x[i][t] /. sol, {i, 1, 10}], {t, 0, 10}]], 
    {{mk1, 1}, 0.1, 10, .1}, {{mk2, 1}, 0.1, 10, .1}]

k1とk2のパラメーターをダミーのパラメーター(ここではmk1とmk2)に再割り当てする必要がないように、操作部分を書き直す方法はありますか?事前にヒントをありがとう。

4

1 に答える 1

5

はい、関数の引数にするだけODENです。コードを改善するためのいくつかのポイント:

Initialization1)を使用して関数を導入することにより、コードを信頼できるものにします

3)ControlType -> Noneダミーのローカライズされた変数を導入して、Module内部の追加を回避するために使用しますmanipulate-とにかくそのコンテンツをManipulateラップするためです。DynamicModule

Manipulate[

 sol = NDSolve[Join[ODEN[10, k1, k2], ODENInit[10, 0]], 
   ODENVars[10], {t, 0, 10}];

 Plot[Evaluate@Table[x[i][t] /. sol, {i, 1, 10}], {t, 0, 10}],

 {{k1, 1}, 0.1, 10, .1},
 {{k2, 1}, 0.1, 10, .1},
 {sol, ControlType -> None},

 Initialization :> {

   ODENInit[n_, xIni_] := 
    Join[{x[1][0] == xIni}, Table[x[i][0] == 0, {i, 2, n}]],

   ODEN[n_, k1_, k2_] := 
    Join[{x[1]'[t] == k1 - k2 x[1][t]}, 
     Table[x[i]'[t] == k1 x[i - 1][t] - k2 x[i][t], {i, 2, n}]],

   ODENVars[n_] := Table[x[i][t], {i, 1, n}]

   }]

ここに画像の説明を入力してください

あなたのコメントに答えるために、あなたが本当にk関数の外でグローバルに定義されたままにする傾向があるなら、これは次のようになります:

Manipulate[

 Block[{sol, k1 = mk1, k2 = mk2},
  sol = NDSolve[Join[ODEN[10], ODENInit[10, 0]], 
    ODENVars[10], {t, 0, 10}];
  Plot[Evaluate@Table[x[i][t] /. sol, {i, 1, 10}], {t, 0, 10}]],

 {{mk1, 1}, 0.1, 10, .1}, {{mk2, 1}, 0.1, 10, .1}]
于 2012-12-12T18:28:08.687 に答える