How to| 绘制 NDSolve 的结果
How to| 绘制 NDSolve 的结果
NDSolve 对微分方程进行数值求解. 它所返回的解,其形式很容易用于多种不同方式. 其中一个典型的用法是生成解的图形.
ode1 = {y''[x] + Sin[y[x]] == 0, y[0] == 2, y'[0] == 1};在 NDSolve 中,方程为第一个参数,要求解的函数
为第二个参数,独立变量的变化范围为第三个参数:
sol = NDSolve[ode1, y, {x, -10, 10}]Plot[y[x] /. sol, {x, -10, 10}]常常需要将解与其导数(或多个独立变量)绘制在一起. 用 Evaluate 将您所要绘制的内容包括,可以将它们以不同的颜色显示:
Plot[Evaluate[{y[x], y'[x], y''[x]} /. sol], {x, -10, 10}]对于自由度为两个和三个的系统,在相平面内的图形往往更有助益. 这可以用 ParametricPlot 来实现:
ParametricPlot[Evaluate[{y[x], y'[x]} /. sol], {x, -10, 10}]NDSolve 可求解方程组:
s = NDSolve[{x'[t] == -y[t] - x[t] ^ 2, y'[t] == 2x[t] - y[t] ^ 3, x[0] == y[0] == 1}, {x, y}, {t, 20}]然后用 Plot 绘图:
Plot[Evaluate[{x[t], y[t]} /. s], {t, 0, 20}]用 ParametricPlot 绘图:
ParametricPlot[Evaluate[{x[t], y[t]} /. s], {t, 0, 20}]将 Manipulate 用于相平面图形,使您很容易对初始条件进行改变:
Manipulate[
Module[{sol = NDSolve[{y''[x] + Sin[y[x]] == 0, y[0] == p[[1]], y'[0] == p[[2]]}, y, {x, 0, T}]},
ParametricPlot[Evaluate[{y[x], y'[x]} /. sol], {x, 0, T}, PlotRange -> {{-4, 4}, {-3, 3}}]],
{{p, {2, 1}}, Locator}, {{T, 10}, 0, 100}]Locator 的输入允许您拖动点以改变初始条件. 参数 T 允许您对所求解问题的区间进行控制.
对于偏微分方程,往往存在多种选择. 这里以 Wolfram 的非线性波动方程为例 [更多信息]:
wws = NDSolve[{Subscript[∂, t, t]u[t, x] == Subscript[∂, x, x]u[t, x] + (1 - u[t, x]^2) (1 + 2 u[t, x]), u[0, x] == E^-x^2, u^(1, 0)[0, x] == 0, u[t, -10] == u[t, 10]}, u, {t, 0, 10}, {x, -10, 10}]获得解的全局视图的一个好方法是使用 Plot3D:
Plot3D[u[t, x] /. wws, {t, 0, 10}, {x, -10, 10}]另一种方法是 DensityPlot,它往往能对解的细节提供更多有用信息:
DensityPlot[u[t, x] /. wws, {t, 0, 10}, {x, -10, 10}]对于这类时间演变方程,最好的直觉往往来自动画. 使用 ListAnimate 往往能够得到最佳结果. 首先生成一个用相等时间间隔分开的图形列表,全部具有相同的 PlotRange:
plots = Table[Plot[u[t, x] /. wws, {x, -10, 10}, PlotRange -> {-2, 2}], {t, 0, 10, .25}];ListAnimate[plots]在这种情形中,看到波动有一定难度,因为变化的背景来自一个零初始条件. 解决这个问题的一个简单方法是求解对应的常微分方程,并将它消掉:
bg = NDSolve[{Subscript[∂, t, t]u[t] == (1 - u[t]^2) (1 + 2 u[t]), u[0] == 0, u'[0] == 0}, u, {t, 0, 10}]plots = Table[Plot[(u[t, x] /. wws) - (u[t] /. bg), {x, -10, 10}, PlotRange -> {-2, 2}], {t, 0, 10, .25}];ListAnimate[plots]