質問

からの答えを使用しようとしているときに問題に遭遇しました ndsolve 2つの個別のプロットコマンドで。問題を説明するために、単純な微分方程式と1つのプロットコマンドのみを使用します。私がこのようなものを書いた場合:

{Plot[x[t], {t, 0, 10}], x[4]} 
/. NDSolve[{x'[s] == - x[s], x[0] == 1}, x, {s, 0, 10}]

方程式を解決し、X [4]を問題なく計算しますが、プロットは空になり、その理由はわかりません。

私の実際の問題では、私の方程式はいくつかの機能の非常に複雑なシステムであり、 X [4 解決された関数のパラメトリックプロットを描画します。私は最終的にこれをすべてに含めるつもりです 操作 声明なので、私は望まない ndsolve 複数回(時間がかかりすぎる)表示するステートメントと事前に計算することはできません(多くのパラメーターがあるため)。


編集:私は自分の質問を明確にし、拡張したい:私が実際にやりたいことは、私のプロットステートメントをに含めることです 操作 次の方法での声明:

Manipulate[{Plot[x[t], {t, 0, 10}], x[4]} 
/. NDSolve[{x'[s] == - a*x[s], x[0] == 1}, x, {s, 0, 10}]
,{{a,1},0,5}]

からです 操作 ステートメントはパラメーターに価値を与えます a, 、への答えを計算することはできません ndsolve 予め。また、私の実際の方程式システムは非常に複雑で非線形であるため、シンボリック機能を使用できません dsolve.

以前にはっきりしていなかった場合は申し訳ありません。

役に立ちましたか?

解決

あなたの問題は、プロットがいくつかの面白いことをして、プロットをより便利にすることであり、それが行うことの1つは、数値的に評価できないことをプロットしないことです。だからあなたが投稿した表現で、

Plot[x[t], {t, 0, 10}]

先に進んで評価します ndsolveのソリューションでルールの代替を行い、空のプロットのグラフィックオブジェクトを生成します。そのグラフィックオブジェクトにはXへの参照が含まれていないため、代用するものは何もありません。

プロットの前に置換が行われるようにしたい。また、複数の場所で置換を行うことができることを確認したい場合は、ソリューションを変数に保存する必要があります。

sol = NDSolve[{x'[s] == - x[s], x[0] == 1}, x, {s, 0, 10}];
{Plot[Evaluate[x[t] /. sol], {t, 0, 10}], x[4] /. sol} 

プロット内のevaluate []は、Mathematicaが各プロットポイントに対して1回ではなく、1回だけでは置換を行うことを確認します。このような単純なルール代替にとって重要ではありませんが、もっと複雑なものをプロットしたい場合に使用するのは良い習慣です。


この作業を操作で作るために、単純な方法は、Mathematicaのスコーピング構造の1つである[]で使用することです。それは、変異できる変数として使用せずに何かを置き換えたい場所を使用するものです。

例えば、

Manipulate[
  With[{sol = NDSolve[{x'[s] == - x[s], x[0] == 1}, x, {s, 0, 10}]},
    {Plot[x[t] /. sol // Evaluate, {t, 0, 10}, PlotRange -> {0, 1}], 
     x[4] /. sol}],
  {{a, 1}, {0, 5}}]

plotrangeオプションを使用して、y軸を固定します。それ以外の場合は、変化の価値として醜い方法で物事が飛び回ります。操作でより複雑なことを行うと、更新速度を制御するための多くのオプションがあります。これは、オードが十分に複雑である場合に重要になる可能性があります。

他のヒント

その間、私はこれを行う別の方法を見つけました。それほどエレガントではありませんが、1つの置換のみを使用しているので、ここにも投稿すると思いました。

アイデアは使用することです 所有プロット だから、それは評価されず、ルールの代替を行い、そしてその後 リリースホールド, 、その直前 操作.

Manipulate[ReleaseHold[
  Hold[ {Plot[x[t], {t, 0, 10}, PlotRange -> {0, 1}], x[4]} ]
 /.NDSolve[{x'[s] == -a x[s], x[0] == 1}, x, {s, 0, 10}]
], {{a, 1}, 0, 5}]
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top