Wolfram mathematica 在Mathematica的两个单独绘图命令中使用微分方程的解

Wolfram mathematica 在Mathematica的两个单独绘图命令中使用微分方程的解,wolfram-mathematica,plot,differential-equations,Wolfram Mathematica,Plot,Differential Equations,尝试在两个单独的绘图命令中使用NDSolve的答案时遇到问题。为了说明这个问题,我将使用一个简单的微分方程和一个plot命令。如果我这样写: {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的答案时遇到问题。为了说明这个问题,我将使用一个简单的微分方程和一个plot命令。如果我这样写:

{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}]
由于只有Operate语句为参数a赋值,因此我无法事先计算NDSolve的答案。另外,由于我的实际方程组非常复杂和非线性,我不能使用符号函数DSolve

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

抱歉,如果之前不清楚的话。

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


为了使这项工作具有可操作性,最简单的方法是使用[],这是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}}]

使用“绘图范围”选项保持y轴固定;否则,当a的价值发生变化时,事情会以一种丑陋的方式跳跃。当您使用Operate执行更复杂的操作时,有许多选项可用于控制更新速度,如果您的ODE足够复杂,需要一段时间才能解决,则这一点非常重要。

同时,我找到了另一种方法来实现这一点。它不那么优雅,但它只使用了一个替代品,所以我想我也会把它贴在这里

想法是在绘图上使用保持,这样它就不会被评估,进行规则替换,然后释放保持,就在操作之前

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