DiscreteVariables
是 NDSolve 和其他函数的一个选项,指定只在时间积分中离散时间发生改变的变量.
更多信息
- DiscreteVariables->{v1, v2,…} 指定 v1、v2、… 应该被视为只在离散时间发生改变的变量.
- 离散变量 v 的值可以通过 WhenEvent[event,v->val] 或者 WhenEvent[event,v->"DiscontinuitySignature"] 改变.
- 离散变量解 v 可以通过使用 NDSolve[eqn,{v,…},…] 返回.
- DiscreteVariables->{vspec1,vspec2,…} 可用于指定离散变量的范围.
- vspeci 的可能形式是:
-
v v 具有范围 Reals 或者 Complexes Element[v,Reals] v 具有范围 Reals Element[v,Complexes] v 具有范围 Complexes Element[v,Integers] v 具有范围 Integers Element[v,{n1,…}] v 具有离散范围 {n1,…} {v,vmin,vmax} v 具有范围 
vspeciactioni 执行 actioni 当不再满足 vspeci 时 - 几乎所有地方,关于时间的离散变量的导数都是零,并且不应该出现在方程中.
- 对于偏微分方程,在线半离散化方法中,离散变量只取决于时间自变量.
范例
打开所有单元 关闭所有单元基本范例 (2)
sol = NDSolve[{y'[t] == a[t], WhenEvent[Mod[t, 1], a[t] -> y[t]], y[0] == 1, a[0] == 1}, {y, a}, {t, 0, 4}, DiscreteVariables -> {a}]Plot[Evaluate[{y[t], a[t]} /. sol], {t, 0, 4}]sol = NDSolve[{y''[t] + a[t]y[t] == 0, WhenEvent[y[t], a[t] -> a[t] + 1], y[0] == 1, y'[0] == 0, a[0] == 1}, {y, a}, {t, 0, 20}, DiscreteVariables -> a]Plot[y[t] /. sol, {t, 0, 20}]Plot[a[t] /. sol, {t, 0, 20}]范围 (7)
sol = NDSolve[{y'[t] == a[t], y[0] == 0, a[0] == 0, WhenEvent[Mod[t, 1], a[t] -> a[t] + 1]}, {y, a}, {t, 0, 4}, DiscreteVariables -> a];Plot[Evaluate[{y[t], a[t]} /. sol], {t, 0, 4}]sol = NDSolve[{y''[t] == -y[t], y[0] == y'[0] == 1, a[0] == 0, WhenEvent[y[t] == 0, a[t] -> a[t] + 1]}, {y, a}, {t, 0, 10}, DiscreteVariables -> a];Plot[Evaluate[{y[t], a[t]} /. sol], {t, 0, 10}]eqns = {y''[t] + .5 b[t]y'[t] == -a[t]y[t], a[0] == y[0] == y'[0] == 1, b[0] == 2};sol1 = NDSolve[{eqns, WhenEvent[y[t] == 0, {a[t], b[t]} -> {a[t] + 1, b[t] + a[t]}]}, {y, a, b}, {t, 0, 8}, DiscreteVariables -> {a, b}];Plot[Evaluate[{y[t], a[t], b[t]} /. sol1], {t, 0, 8}]sol2 = NDSolve[{eqns, WhenEvent[y[t] == 0, {a[t] -> a[t] + 1, b[t] -> b[t] + a[t]}]}, {y, a, b}, {t, 0, 8}, DiscreteVariables -> {a, b}];Plot[Evaluate[{y[t], a[t], b[t]} /. sol2], {t, 0, 10}]eqns = {x''[t] == -x[t], x[0] == 1, x'[0] == 0, a[0] == 1, WhenEvent[x[t], a[t] -> a[t] + 1]};NDSolve[eqns, x[t], {t, 0, 10}, DiscreteVariables -> {a[t]∈{1, 2, 3}}]NDSolve[eqns, x[t], {t, 0, 10}, DiscreteVariables -> {{a[t], 0, 3}}]NDSolve[eqns, x, {t, 0, 10}, DiscreteVariables -> {a[t]∈{1, 3, 5, 7} :> Print[{a[t], t}]}]NDSolve[eqns, x, {t, 0, 10}, DiscreteVariables -> {a[t]∈{2, 3} :> Print[{a[t], t}]}]NDSolve[{y'[t] == Switch[a[t], up, 1, down, -1], y[0] == 0, a[0] == up, WhenEvent[y[t] ^ 2 - 1 == 0, a[t] -> Switch[a[t], up, down, down, up]]}, y, {t, 0, 10}, DiscreteVariables -> {a[t]∈{up, down}}];Plot[y[t] /. %, {t, 0, 10}]通过是行动 "DiscontinuitySignature",允许滑动模式解:
sol = NDSolve[{y'[t] == -a[t], y[0] == -1, a[0] == -1, WhenEvent[y[t], a[t] -> "DiscontinuitySignature"]}, {y, a}, {t, 0, 5}, DiscreteVariables -> {a[t]∈{-1, 0, 1}}];vf = VectorPlot[{1, -Sign[y]}, {x, 0, 5}, {y, -1, 1}, VectorColorFunction -> None, VectorStyle -> {Gray, Arrowheads[.04]}, VectorPoints -> 10, FrameLabel -> {t, y}];Show[vf, Plot[y[t] /. sol, {t, 0, 5}, PlotRange -> {-1, 1}, PlotStyle -> {Red}]]Plot[a[t] /. sol, {t, 0, 5}]c[t_] = Sin[t];sol = NDSolve[{Derivative[1][x][t] == 1, Derivative[1][y][t] == -v[t], WhenEvent[y[t] - c[t], v[t] -> "DiscontinuitySignature"], x[0] == 0, y[0] == .5, v[0] == 1}, {x, y, v}, {t, 0, 6}, DiscreteVariables -> {v∈{-1, 0, 1}}];curve = Plot[c[x], {x, 0, 2}, PlotStyle -> Red];Show[curve, ParametricPlot[{{x[t], y[t]}} /. sol, {t, 0, 2}]]应用 (5)
rhs[t_, x_, 1] = -x;
rhs[t_, x_, 2] = 1;sol = NDSolve[{x'[t] == rhs[t, x[t], a[t]], x[0] == 1, a[0] == 1, WhenEvent[x[t] - .1, a[t] -> 2], WhenEvent[x[t] - 2, a[t] -> 1]}, {x, a}, {t, 0, 15}, DiscreteVariables -> {a[t]∈{1, 2}}];Plot[x[t] /. sol, {t, 0, 10}]Do[rhs[t_, x_, i] = t RandomReal[{-.1, .1}] + x RandomReal[{-1, 1}] + RandomReal[{-.1, .1}], {i, 11}]NDSolve[{x'[t] == rhs[t, x[t], a[t]], x[0] == 0, a[0] == 1, WhenEvent[Mod[t, 1], a[t] -> a[t] + 1]}, x, {t, 0, 10}, DiscreteVariables -> {a[t]∈Range[11]}];Plot[x[t] /. %, {t, 0, 10}]c = .75;
xsol = NDSolve[{y''[t] == -9.8, y[0] == 13.5, y'[0] == 5, a[0] == 13, WhenEvent[y[t] - a[t] == 0, y'[t] -> -c y'[t]], WhenEvent[Mod[t, 1], a[t] -> a[t] - 1]}, {y, a}, {t, 0, 8}, DiscreteVariables -> {a}] ;Plot[Evaluate[{y[t], a[t]} /. xsol], {t, 0, 8}, Filling -> {2 -> 0}]kin[v_] := .5 v ^ 2;
pot[y_] := 9.8y;
energy[y_, v_] := kin[v] + pot[y];Plot[Evaluate[{kin[y'[t]], pot[y[t]], energy[y[t], y'[t]]} /. xsol], {t, 0, 8}]τ = 1.0;
sol = NDSolve[{y'[t] == y[t] + u[t], y[0] == 1, u[0] == 0, WhenEvent[Mod[t, τ], u[t] -> -2y[t]]}, {y, u}, {t, 0, 20}, DiscreteVariables -> u];Plot[Evaluate[{u[t], y[t]} /. sol], {t, 0, 10}, PlotRange -> {-6, 6}]sol = NDSolve[{Subscript[∂, t, t]u[t, x] == a[t]Subscript[∂, x, x]u[t, x], u[0, x] == E^-x^2, u^(1, 0)[0, x] == 0, u[t, -10] == u[t, 10], a[0] == 1, WhenEvent[Mod[t, 1], a[t] -> Sqrt[t]]}, u, {t, 0, 40}, {x, -10, 10}, DiscreteVariables -> {a[t]}];DensityPlot[Evaluate[First[u[t, x] /. sol]], {t, 0, 40}, {x, -10, 10}, PlotPoints -> 50]属性和关系 (1)
NDSolve 自动处理费连续函数,以使用离散变量的 Sign 相同的方式:
sol1 = NDSolve[{y'[t] == Sign[1 - y[t]], y[0] == 0}, y, {t, 0, 2}];Plot[y[t] /. sol1, {t, 0, 2}]使用离散变量下的 "DiscontinuitySignature" 来模拟 Sign 函数:
sol2 = NDSolve[{Derivative[1][y][t] == a[t], WhenEvent[1 - y[t], a[t] -> "DiscontinuitySignature"], y[0] == 0, a[0] == 1}, y, {t, 0, 2}, DiscreteVariables -> {a∈{-1, 0, 1}}];Plot[y[t] /. sol2, {t, 0, 2}]可能存在的问题 (3)
NDSolve[{x''[t] == -x[t], x[0] == 1, x'[0] == 0, y[0] == 0, WhenEvent[x[t], y[t] -> y[t] + 1]}, {x, y}, {t, 0, 8}, DiscreteVariables -> {{y[t], 0, 2}}]离散变量的导数无法出现在传递给 NDSolve 的方程中:
NDSolve[{x''[t] == -a'[t] x[t], x[0] == 1, x'[0] == 0, a[0] == 0, WhenEvent[x[t], a[t] -> a[t] + 1]}, {x, a}, {t, 0, 8}, DiscreteVariables -> {{a[t], 0, 2}}]使用 "DiscontinuitySignature" 操作的离散变量的范围必须是 {-1,0,1}:
sol = NDSolve[{Derivative[1][y][t] == a[t], WhenEvent[1 - y[t], a[t] -> "DiscontinuitySignature"], y[0] == 0, a[0] == 1}, y, {t, 0, 2}, DiscreteVariables -> {a∈{-2, -1, 0, 1}}];sol = NDSolve[{Derivative[1][y][t] == a[t], WhenEvent[1 - y[t], a[t] -> "DiscontinuitySignature"], y[0] == 0, a[0] == 1}, y, {t, 0, 2}, DiscreteVariables -> {a∈{-1, 1}}];Plot[{y[t] /. sol}, {t, 0, 2}]对于滑动模式解,指定范围为 Element[a,{-1,0,1}]:
sol = NDSolve[{Derivative[1][y][t] == a[t], WhenEvent[1 - y[t], a[t] -> "DiscontinuitySignature"], y[0] == 0, a[0] == 1}, y, {t, 0, 2}, DiscreteVariables -> {a∈{-1, 0, 1}}];Plot[{y[t] /. sol}, {t, 0, 2}]相关指南
文本
Wolfram Research (2012),DiscreteVariables,Wolfram 语言函数,https://reference.wolfram.com/language/ref/DiscreteVariables.html.
CMS
Wolfram 语言. 2012. "DiscreteVariables." Wolfram 语言与系统参考资料中心. Wolfram Research. https://reference.wolfram.com/language/ref/DiscreteVariables.html.
APA
Wolfram 语言. (2012). DiscreteVariables. Wolfram 语言与系统参考资料中心. 追溯自 https://reference.wolfram.com/language/ref/DiscreteVariables.html 年
BibTeX
@misc{reference.wolfram_2026_discretevariables, author="Wolfram Research", title="{DiscreteVariables}", year="2012", howpublished="\url{https://reference.wolfram.com/language/ref/DiscreteVariables.html}", note=[Accessed: 15-September-2026]}
BibLaTeX
@online{reference.wolfram_2026_discretevariables, organization={Wolfram Research}, title={DiscreteVariables}, year={2012}, url={https://reference.wolfram.com/language/ref/DiscreteVariables.html}, note=[Accessed: 15-September-2026]}