# dsolve
解微分方程组
函数库: TySymbolicMath
# 语法
# 说明
S = dsolve(eqn) 求解微分方程 eqn,其中 eqn 是一个符号方程。使用 Differential 和 ==(或者 ~ )来表示微分方程。例如:@variables x y(x),D = Differential(x),eqn = D(y) == y 表示方程
S = dsolve(eqn, cond) 使用初始条件或边界条件 cond 来求解微分方程 eqn。示例
S = dsolve(_; Name=Value) 指定具有一个或多个 Name=Value 参数的其他选项。您可以在任何上述语法中,将 Name=Value 参数添加在输入参数之后进行指定。示例
# 示例
求解微分方程
求解一阶微分方程:
通过使用 Differential 指定一阶导数,通过使用 == 或 ~ 指定方程。然后,通过使用 dsolve 求解方程。
using TySymbolicMath
@variables t y(t) a
D = Differential(t)
eqn = D(y) == a * y
S = dsolve(eqn)
S = C1*exp(a*t)
下面用 ~ 来指定方程。
eqn = D(y) ~ a * y
S = dsolve(eqn)
S = C1*exp(a*t)
求解二阶微分方程
求解二阶微分方程:
using TySymbolicMath
@variables t y(t) a
D = Differential(t)
eqn = (D^2)(y) == a * y
S = dsolve(eqn)
S = C1*exp(-t*sqrt(a)) + C2*exp(t*sqrt(a))
带条件求解微分方程
求解一阶微分方程:
using TySymbolicMath
@variables t y(t) a
D = Differential(t)
eqn = D(y) == a * y
cond = substitute(y, t, 0) == 5
S = dsolve(eqn, cond)
S = 5exp(a*t)
注意
微分方程 eqn 和初始条件 cond 要么都用 == 运算符构建符号方程,要么都用 ~ 运算符构建符号方程。
接下来,求解二阶微分方程:
using TySymbolicMath
@variables t y(t) a b
D = Differential(t)
eqn = (D^2)(y) == a^2 * y
cond = [substitute(y, t, 0) == b, substitute(D(y), t, 0) == 1]
S = dsolve(eqn, cond)
S = ((1//2)*(1 + a*b)*exp(a*t)) / a + ((1//2)*(-1 + a*b)*exp(-a*t)) / a
这个二阶微分方程有两个指定的条件,因此解中常数被消除。通常,为了消除解中的常数,条件的数量必须等于方程的阶数。
求解微分方程组
求解微分方程组:
将方程组指定为一个向量。dsolve 返回一个包含解的元组。
using TySymbolicMath
@variables t y(t) z(t)
D = Differential(t)
eqn = [D(y) ~ z, D(z) ~ -y]
S = dsolve(eqn)
S = (y = C1*sin(t) + C2*cos(t), z = C1*cos(t) - C2*sin(t))
通过访问元组的元素来获取解。
S.y
ans = C1*sin(t) + C2*cos(t)
S.z
ans = C1*cos(t) - C2*sin(t)
求解微分方程的显式解和隐式解
求解微分方程:
using TySymbolicMath
@variables t y(t)
D = Differential(t)
eqn = D(y) == y + exp(-y)
S = dsolve(eqn)
┌ Warning: 该微分方程无法求显示解,但存在常量解,此时结果只返回常量解,请令 Implicit=true 来同时返回解隐式解和常量解。
S = -0.31813150520476413 + 1.3372357014306895im
要返回微分方程的隐式解,将 Implicit 选项设置为 true。隐式解的形式为
S = dsolve(eqn; Implicit=true)
S = 2-element Vector{Num}:
(-TySymbolicMath.Substitute(TySymbolicMath.Integrate(exp(y) / (1 + y*exp(y)), y), y, y(t))) == (C1 - t)
0 == (y(t) + exp(-y(t)))
当未找到显式解时,求解隐式解
如果 dsolve 无法找到显式解,它将发出警告并返回 Num[]。在这种情况下,可以尝试使用 TyMath 工具箱的 ode23、ode45 等求解器找到数值解。
using TySymbolicMath
@variables x y(x)
D = Differential(x)
eqn = D(y) ~ (x - exp(-x)) / (y + exp(y))
S = dsolve(eqn)
┌ Warning: 该微分方程既无法求显示解,又没有常量解,请令 Implicit=true 来求解隐式解。
S = Num[]
另外,您可以通过将 Implicit 选项设置为 true 来尝试找到微分方程的隐式解。隐式解的形式为
S = dsolve(eqn; Implicit=true)
S = (-exp(-x) + exp(y(x)) - (1//2)*(x^2) + (1//2)*(y(x)^2)) == C1
为具有不同单侧极限的函数指定初始条件
求解微分方程:
using TySymbolicMath
@variables x y(x)
D = Differential(x)
eqn = D(y) == exp(-1 / x) / x^2
S = dsolve(eqn)
S = C1 + exp(-1 / x)
为了从通解中消除常数,指定初始条件
cond = substitute(y, x, 0) == 1
S1 = dsolve(eqn, cond)
ERROR: 该方程无法求解或输入的方程不符合要求。
通解 S 中的函数
# 输入参数
eqn - 微分方程或方程组符号方程 | 符号表达式 | 符号向量
微分方程或方程组,指定为一个符号方程或符号表达式,它也能是由符号方程或符号表达式构成的符号向量。使用 == 或 ~ 运算符指定微分方程。如果 eqn 是一个符号表达式(没有右侧),dsolve 会假设右侧为 0,并求解方程 eqn == 0。
在方程中,使用 Differential 表示求导。例如,D = Differential(x),D(y) 表示对符号函数 y(x) 关于 x 的求导。使用 @variables 创建符号函数 y(x),然后使用 dsolve 求解方程
@variables x y(x)
D = Differential(x)
eqn = (D^2)(y) == x*y
S = dsolve(eqn)
注意
使用 @variables 创建符号函数时,需要先声明变量,再声明函数。例如,@variables x y(x)。
通过使用由方程构造的向量来指定一个微分方程组,例如:
@variables t y(t) z(t)
D = Differential(t)
eqn = [D(y) ~ z, D(z) ~ -y]
S = dsolve(eqn)
这里,y 和 z 必须是依赖于符号变量的符号函数,在本例中符号变量是 t。方程右侧必须是依赖于 t、y 和 z 的符号表达式。请注意,符号数学工具箱目前不支持复合符号函数,也就是说,不支持依赖于其他符号函数的符号函数。
cond - 初始或边界条件符号方程 | 符号向量
初始或边界条件,指定为一个符号方程,它也能是由符号方程构成的符号向量。
注意
微分方程 eqn 和初始条件 cond 要么都用 == 运算符构建符号方程,要么都用 ~ 运算符构建符号方程。
初始或边界条件必须调用 substitute 函数来创建;当条件包含导数时,需要使用 Differential 表示导数。例如:以下式子表示
cond = [substitute(y, x, 0) ~ 0, substitute(D(y), x, 0) ~ 1]
通过使用方程的向量指定多个条件。如果条件的数量少于依赖变量的数量,解中将包含任意常数 C1、C2、..。
注意
对于初始条件使通解极限不存在的情况,dsolve 暂不支持。
# 关键字参数
指定可选的、以等号分隔的 Name,Value 对组参数。Name 为参数名称,Value 为对应的值。写法为Name = Value。您可采用任意顺序指定多个名称-值对组参数,如 Name1=Value1,...,NameN=ValueN 所示。
示例: dsolve(D(y) ~ (x - exp(-x)) / (y + exp(y)); Implicit=true)
Implicit - 是否返回隐式解false(默认) | true
是否返回隐式解,指定为 false 或 true。对于一个以
默认情况下,dsolve 在求解微分方程时会尝试找到显式解
数据类型: Bool
# 输出参数
S - 微分方程的解符号方程 | 符号表达式 | 符号向量
微分方程的解,指定为一个符号方程或符号表达式(具体是看求显示解还是隐式解),它也能是由符号方程或符号表达式构成的符号向量。
数据类型: Num
# 提示
如果 dsolve 无法找到显式或隐式解,它将发出警告并返回 Num[]。在这种情况下,可以尝试使用 TyMath 工具箱的 ode23、ode45等求解器找到数值解。有时,输出可能是等价的低阶微分方程或积分形式。
# 另请参阅
isolate | linsolve | sym_linsolve | Differential | @variables | ode23 | ode45