初始和边界值问题
初始 (IVP) 和边界值问题 (BVP) 综述
DSolve 可用于求解微分方程或微分方程组的通解. 通解提供有关问题的完整解空间结构的信息. 然而,在实践中,人们通常仅对满足与应用领域相关的某些条件的特定解感兴趣. 这些条件通常有两种类型.
- 解
和/或其导数要求在一个单点上有特定的值,例如,
和
. 这类问题传统上称为初值问题 (IVP),因为假定系统从固定的初始点(本例中为0)开始演化. - 解
需要在一对点上有特定的值,例如,
和
. 这些问题称为边值问题 (BVP),因为点 0 和点 1 被视为应用中感兴趣领域的边界点(或边).
IVP 和 BVP 的符号解需要问题的通解知识. 最后一步,使用初始值或边界值获得特定解,主要涉及代数运算,并且对于 IVP 和 BVP 类似.
由于最终的代数步骤涉及线性方程的解,因此线性微分方程的 IVP 和 BVP 被相当容易地求解. 然而,如果基础方程是非线性的,那么解可以有几个分支,或者来自通解的任意常数可以出现在超越函数的不同参数中. 因此,并非总能完成非线性问题的最终代数步骤. 最后,如果基础方程具有分段(即,不连续)系数,则 IVP 在系数连续的区域上自然地分解为更简单的IVP.
线性 IVP 和 BVP
linearequation = y'[t] - 3 * t * y[t] == 1;generalsolution = DSolve[linearequation, y[t], t]particularsolution = DSolve[{linearequation, y[0] == 4}, y, t]linearequation /. particularsolution[[1]]y[0] /. particularsolution[[1]]particularsolution = DSolve[{linearequation, y[0] == a}, y, t]Plot[Evaluate[Table[y[t] /. particularsolution[[1]] /. a -> i, {i, -2, 2, 0.6}]], {t, -1.8, 1.8}, PlotRange -> {-4, 4}]linearsecondorderODE = x''[t] + 5 * x'[t] + 6 * x[t] == 0;generalsolution = DSolve[linearsecondorderODE, x, t]particularsolution = DSolve[{linearsecondorderODE, x[0] == 1, x'[0] == 1}, x, t]linearsecondorderODE /. particularsolution[[1]]//Simplifyx[0] /. particularsolution[[1]]x'[0] /. particularsolution[[1]]Plot[x[t] /. particularsolution, {t, -1 / 3, 2}]particularsolution = DSolve[{linearsecondorderODE, x[0] == 1, x'[0] == x0}, x, t]Show[GraphicsGrid[Partition[Table[Plot[Evaluate[x[t] /. particularsolution[[1]] /. x0 -> i], {t, -1, 3}, PlotStyle -> {Red}, PlotLabel -> StringJoin["x0= ", ToString[i]], Ticks -> None], {i, -4, 1}], {3}], ImageSize -> 400]]inhomogeneousequation = y''[x] + y[x] == E ^ x;generalsolution = DSolve[inhomogeneousequation, y, x]DSolve[{inhomogeneousequation, y[0] == 1, y[1] == 1 / 2}, y, x]应当注意,与初始值问题相反,当规定边界值时,没有一般存在或唯一性定理,并且在某些情况下可能没有解.
DSolve[{inhomogeneousequation, y[0] == 1, y[Pi] == 6}, y, x]先前对线性方程的讨论泛化了高阶线性 ODE 和 ODE 线性系统的情况.
fourthorderODE = y''''[x] + 2 * y''[x] + y[x] == Cos[x];sol = DSolve[{fourthorderODE, y[0] == 1, y'[0] == 6, y''[0] == 3, y'''[0] == -1}, y, x]{fourthorderODE, y[0], y'[0], y''[0], y'''[0]} /. sol//SimplifyDSolve[{fourthorderODE, y[0] == 1, y'[0] == 6}, y, x]Clear[x, y, z, t]linearsystem = {x'[t] == x[t] - 4 * y[t] + 1, y'[t] == 4 * x[t] + y[t], z'[t] == z[t]};initialvalues = {x[0] == 2, y[0] == -1, z[0] == 1};sol = DSolve[Join[linearsystem, initialvalues], {x, y, z}, t]{linearsystem, initialvalues} /. sol[[1]]//SimplifyPlot[Evaluate[{x[t], y[t], z[t]} /. sol], {t, -2, 1}]ParametricPlot3D[Evaluate[{x[t], y[t], z[t]} /. sol], {t, -7, -3}, PlotRange -> All]非线性 IVP 和 BVP
许多实际应用需要针对非线性 ODE 的 IVP 和 BVP 的解. 例如,考虑逻辑方程,它发生在人口动力学中.
LogisticEquation = y'[t] == r(1 - (y[t] / K)) * y[t];DSolve[LogisticEquation, y, t]DSolve[{LogisticEquation /. {r -> (1 / 2), K -> 4}, y[0] == 1}, y, t]sol = DSolve[{LogisticEquation, y[0] == a * K}, y, t]{LogisticEquation, y[0]} /. sol[[1]]//SimplifyPlot[Evaluate[Table[y[t] /. sol[[1]] /. {K -> 4, a -> i, r -> (1 / 3)}, {i, 2, 1 / 10, -1 / 3}]], {t, 0, 8}, PlotRange -> All]eqn = y''[x] - (1 / 2) * (y'[x] ^ 2 / y[x]) + 1 / (2 * y[x]) == 0;sol = DSolve[{eqn, y[0] == 1, y'[0] == 2}, y, x]{eqn, y[0], y'[0]} /. sol[[1]]//Simplifygeneralsolution = DSolve[{y''[x] / 2 == y[x] ^ 3 - y[x]}, y[x], x](sol = DSolve[{y''[x] / 2 == y[x] ^ 3 - y[x], y[0] == 0, y'[Infinity] == 0}, y[x], x] )//QuietPlot[{y[x] /. sol[[2]], 1}, {x, -2, 2}, PlotRange -> All]对于非线性方程,可能无法始终获得 IVP 或 BVP 的符号解. 在这种情况下可能需要数值方法.
带有分段系数的 IVP
在现代应用中出现的微分方程通常具有不连续的系数. DSolve 可以使用分段系数处理各种这样的 ODE. 这些方程中使用的一些函数是 UnitStep、Max、Min、Sign 和 Abs. 这些函数及其组合可以转换为 Piecewise 对象.
PiecewiseExpand[UnitStep[x] + Max[x, x ^ 2]]DSolve[y'[x] == UnitStep[x], y, x]eqn = {y'[x] == UnitStep[x], y[0] == 1};sol = DSolve[eqn, y, x]Plot[y[x] /. sol, {x, -3, 3}]Simplify[eqn /. sol[[1]], x > 0 || x < 0]sol = DSolve[ {y'[x] + Max[x, 1] y[x] == 0, y[0] == 1}, y[x], x ]Plot[y[x] /. sol, {x, -3, 3}]分段 ODE 可以被认为是不相交间隔上的 ODE 的集合,使得系数和边界条件的表达式从一个区间变化到另一个区间. 因此,不同的区间具有不同的解,并且通过在不同的区间上将解拼接在一起来获得 ODE 的最终解.
FinalSol = DSolve[ {y'[t] == If[ t ≤ 2, y[t], -y[t] / 2], y[0] == 1}, y, t]SolFromMinusInfinityToTwo = DSolve[{y'[t] == y[t], y[0] == 1}, y, t]SolFromTwoToInfinity = DSolve[{y'[t] == -y[t] / 2, y[2] == E ^ 2}, y, t]如果问题中存在大量不连续性,则在问题的公式化中直接使用 Piecewise 是很方便的.
eqn = {y''[t] + y[t] == Piecewise[{{-1, t < 0}, {1, t < 1}, {Sin[t], t < 2}}], y[0] == 1, y'[0] == 1};sol = DSolve[ eqn, y, t ]eqn = {y''[x] - Clip[x] * y[x] == 0, y[0] == 0, y'[0] == -1};DSolve[eqn, y, x]