gpt4 book ai didi

wolfram-mathematica - 在 Mathematica 的两个独立绘图命令中使用微分方程的解

转载 作者:行者123 更新时间:2023-12-04 14:07:37 31 4
gpt4 key购买 nike

我在尝试使用来自 的答案时遇到问题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}]

由于只有 操纵语句给参数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 轴固定;否则,随着 a 值的变化,事情会以一种丑陋的方式跳来跳去。当您使用 Manipulate 做更复杂的事情时,有许多选项可以控制更新速度,如果您的 ODE 足够复杂以至于需要一段时间来解决,这可能很重要。

关于wolfram-mathematica - 在 Mathematica 的两个独立绘图命令中使用微分方程的解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1327789/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com