我在尝试使用答案时遇到了问题 ndsolve 在两个单独的绘图命令中。为了说明问题,我将使用一个简单的微分方程,只有一个绘图命令。如果我写这样的东西:

{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}]

因为只有 操纵 语句为参数提供价值 一个, ,我无法计算出答案 ndsolve 预先。另外,由于我的实际方程式系统非常复杂且非线性,因此我无法使用符号功能 DSOLVE.

对不起,如果以前不清楚。

有帮助吗?

解决方案

您的问题是,情节[]做了一些有趣的事情来使绘图更加方便,而它所做的事情之一就是不是绘制无法通过数字评估的事情。因此,在您发布的表达中,

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

只是继续评估 用NDSLOVE的解决方案进行规则替换,从而产生一个空图的图形对象。该图形对象不包含对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} 

图中的评估[]确保Mathematica仅进行一次替代,而不是为每个绘图点进行一次替代。对于这样的简单规则替代而言,这并不重要,但是在您想绘制更复杂的东西的情况下,使用它是一个很好的习惯。


为了用操纵进行这项工作,简单的方法是与[]一起使用,这是Mathematica的范围之一。它是您只想在不使用它作为可变的情况下替换某些东西的地方使用的地方。

例如,

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轴固定;否则,随着变化的价值,事情会以丑陋的方式跳动。当您通过操纵进行更复杂的事情时,有许多选择可以控制更新速度,如果您的颂歌变得足够复杂,以至于需要一段时间才能解决,这可能很重要。

其他提示

同时,我找到了另一种方法。它不那么优雅,但是它只使用一种替代,所以我想我也会在这里发布它。

这个想法是使用 抓住阴谋 因此,它不会得到评估,进行规则替代,然后 释放, ,就在 操纵.

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