【问题标题】:Using the solution of a differential equation in two separate plot commands in Mathematica在 Mathematica 的两个独立绘图命令中使用微分方程的解
【发布时间】:2009-08-25 11:51:12
【问题描述】:

我在尝试在两个单独的绘图命令中使用 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],我绘制了求解函数的参数图。我最终打算将所有这些都包含在 Manipulate 语句中,因此我不希望 NDSolve 语句出现多次(花费太长时间),而且我不能只是提前计算(因为它有很多参数)。


编辑:我想澄清和扩展我的问题:我真正想要做的是通过以下方式将我的绘图语句包含在 Manipulate 语句中:

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

由于只有 Manipulate 语句赋予参数 a 值,因此我无法事先计算 NDSolve 的答案。另外,由于我的实际方程组非常复杂且非线性,我不能使用符号函数DSolve

抱歉,如果之前不清楚。

【问题讨论】:

    标签: wolfram-mathematica plot differential-equations


    【解决方案1】:

    您的问题是 Plot[] 做了一些有趣的事情以使绘图更方便,而它所做的其中一件事就是不绘制无法用数值计算的东西。所以在你发布的表达中,

    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 只进行一次替换,而不是对每个绘图点进行一次替换。像这样简单的规则替换并不重要,但如果您想绘制更复杂的东西,使用它是一个好习惯。


    为了在 Manipulate 中完成这项工作,简单的方法是使用 With[],这是 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 轴固定;否则,随着 a 值的变化,事情会以一种丑陋的方式跳跃。当您使用 Manipulate 执行更复杂的事情时,有许多选项可用于控制更新速度,如果您的 ODE 足够复杂以至于需要一段时间才能解决,这可能很重要。

    【讨论】:

      【解决方案2】:

      与此同时,我找到了另一种方法来做到这一点。它不那么优雅,但它只使用了一个替换,所以我想我也会在这里发布它。

      这个想法是在 Plot 上使用 Hold 这样它就不会被评估,进行规则替换,然后 ReleaseHold,只是在操纵之前。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多