我尝试在两个单独的绘图命令中使用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.
对不起,如果以前不清楚.
你的问题是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}
Plot中的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轴固定; 否则,随着变化的价值,事物会以丑陋的方式跳跃.当您使用Manipulate执行更复杂的操作时,有许多选项可用于控制更新速度,如果您的ODE足够复杂以至于需要一段时间才能解决,这一点非常重要.