主要内容

dsolve

求解微分方程组

说明

S = dsolve(eqn) 求解微分方程 eqn,其中 eqn 是符号方程。使用 diff== 来表示微分方程。例如,diff(y,x) == y 表示方程 dy/dx = y。通过将 eqn 指定为由微分方程组中的方程组成的向量来求解该微分方程组。

示例

S = dsolve(eqn,cond) 求解具有初始条件或边界条件 condeqn

示例

S = dsolve(___,Name=Value) 使用由一个或多个 Name=Value 参量指定的附加选项。

示例

[y1,...,yN] = dsolve(___) 将解赋值给变量 y1,...,yN

示例

示例

全部折叠

求解一阶微分方程 dydt=ay

使用 diff 指定一阶导数,并使用 == 指定方程。然后,使用 dsolve 求解方程。

syms y(t) a
eqn = diff(y,t) == a*y;
S = dsolve(eqn)
S = C1eat

解中包含一个常数。要消除常数,请参阅求解具有条件的微分方程。有关完整的工作流,请参阅Solve Partial Differential Equation of Tsunami Model

求解二阶微分方程 d2ydt2=ay

使用 diff(y,t,2) 指定 y 的二阶导数,并使用 == 指定方程。然后,使用 dsolve 求解方程。

syms y(t) a
eqn = diff(y,t,2) == a*y;
ySol(t) = dsolve(eqn)
ySol(t) = C1e-at+C2eat

求解具有初始条件 y(0)=5 的一阶微分方程 dydt=ay

使用 == 运算符将初始条件指定为 dsolve 的第二个输入。指定条件会从解中消除任意常数,例如 C1C2...

syms y(t) a
eqn = diff(y,t) == a*y;
cond = y(0) == 5;
ySol(t) = dsolve(eqn,cond)
ySol(t) = 5eat

接下来,求解具有初始条件 y(0)=by(0)=1 的二阶微分方程 d2ydt2=a2y

通过将 diff(y,t) 赋值给 Dy 然后使用 Dy(0) == 1 来指定第二个初始条件。

syms y(t) a b
eqn = diff(y,t,2) == a^2*y;
Dy = diff(y,t);
cond = [y(0)==b, Dy(0)==1];
ySol(t) = dsolve(eqn,cond)
ySol(t) = 

eatab+12a+e-atab-12a

此二阶微分方程有两个指定条件,因此常数从解中消除。一般来说,要从解中消除常数,条件的数量必须等于方程的阶数。

求解微分方程组

dydt=zdzdt=-y.

将方程组指定为向量。dsolve 会返回包含解的结构体。

syms y(t) z(t)
eqns = [diff(y,t) == z, diff(z,t) == -y];
S = dsolve(eqns)
S = struct with fields:
    z: C2*cos(t) - C1*sin(t)
    y: C1*cos(t) + C2*sin(t)

通过访问结构体的元素来获得解。

ySol(t) = S.y
ySol(t) = C1cos(t)+C2sin(t)
zSol(t) = S.z
zSol(t) = C2cos(t)-C1sin(t)

在求解多个函数时,dsolve 默认返回一个结构体。您也可以通过将输出显式指定为向量来直接将解赋值给函数或变量。dsolve 使用 symvar 按字母顺序对输出进行排序。

求解一个微分方程组并将输出赋值给函数。

syms y(t) z(t)
eqns = [diff(y,t)==z, diff(z,t)==-y];
[ySol(t),zSol(t)] = dsolve(eqns)
ySol(t) = C1cos(t)+C2sin(t)
zSol(t) = C2cos(t)-C1sin(t)

求解微分方程 ty(t)=e-y(t)+y(t)dsolve 会返回用朗伯 W 函数表示的显式解,其中包含一个常数值。

syms y(t)
eqn = diff(y) == y+exp(-y)
eqn(t) = 

t y(t)=e-y(t)+y(t)

sol = dsolve(eqn)
sol = Wlambertw0(-1)

要返回该微分方程的隐式解,请将 Implicit 选项设置为 true。隐式解的形式为 F(y(t))=g(t)

sol = dsolve(eqn,Implicit=true)
sol = 

(eyyey+1 dy|y=y(t)=C1+te-y(t)ey(t)y(t)+1=0)

如果 dsolve 无法通过解析方式求出微分方程的显式解,则它会返回空符号数组。您可以使用 MATLAB® 数值求解器(例如 ode45)来求解该微分方程。有关详细信息,请参阅Solve a Second-Order Differential Equation Numerically

syms y(x)
eqn = diff(y) == (x-exp(-x))/(y(x)+exp(y(x)));
S = dsolve(eqn)
Warning: Unable to find symbolic solution.
 
S =
 
[ empty sym ]
 

您也可以通过将 Implicit 选项指定为 true 来尝试求出微分方程的隐式解。隐式解的形式为 F(y(x))=g(x)

S = dsolve(eqn,Implicit=true)
S = 

ey(x)+y(x)22=C1+e-x+x22

求解具有条件 y(a)=1 的微分方程 dydt=ay+y。默认情况下,dsolve 会应用并非普遍正确但能产生更简单解的简化操作。有关详细信息,请参阅算法

syms a y(t)
eqn = diff(y) == a/sqrt(y) + y;
cond = y(a) == 1;
ySimplified = dsolve(eqn,cond)
ySimplified = 

e3t2-3a2+log(a+1)-a2/3

要返回包含参数 a 的所有可能值的解,可通过将 IgnoreAnalyticConstraints 设置为 false 来关闭简化。

yNotSimplified = dsolve(eqn,cond,IgnoreAnalyticConstraints=false)
yNotSimplified = 

{{{σ1} if  -π2<σ2{σ1,--a+e3t2-3a2+log(a+-12+σ33/2)+2πC2i2/312+σ3} if  σ2-π2 if  C2Z if  C2Zwhere  σ1=-a+e3t2-3a2+log(a+1)+2πC2i2/3  σ2=angle(e3C12+3t2-a)  σ3=3i2

求解二阶微分方程 (x2-1)22x2y(x)+(x+1)xy(x)-y(x)=0dsolve 返回的解包含一个具有未计算积分的项。

syms y(x)
eqn = (x^2-1)^2*diff(y,2) + (x+1)*diff(y) - y == 0;
S = dsolve(eqn)
S = 

C2x+1+C1x+1e12x-11-x1/4x+19/4 dx

要返回该微分方程在 x=-1 附近的级数解,请将 ExpansionPoint 设置为 -1dsolve 会以皮瑟级数展开的形式返回两个线性无关解。

S = dsolve(eqn,ExpansionPoint=-1)
S = 

(1x+11/4-5x+13/44+5x+17/448+5x+111/4336+115x+115/433792+169x+119/4184320x+1)

通过将 ExpansionPoint 设置为 Inf 来求展开点 附近的其他级数解。

S = dsolve(eqn,ExpansionPoint=Inf)
S = 

(16x2+18x4+190x5+1x-16x2-18x4)

级数展开的默认截断阶数是 6。要在皮瑟级数解中取更多项,请将 Order 设置为 8。

S = dsolve(eqn,ExpansionPoint=Inf,Order=8)
S = 

(16x2+18x4+190x5+37336x6+371680x7+1x-16x2-18x4-190x5-37336x6)

在不指定初始条件的情况下求解微分方程 dydx=1x2e-1x

syms y(x)
eqn = diff(y) == exp(-1/x)/x^2;
ySol(x) = dsolve(eqn)
ySol(x) = 

C1+e-1x

要从解中消除常数,请指定初始条件 y(0)=1

cond = y(0) == 1;
S = dsolve(eqn,cond)
S = 

e-1x+1

ySol(x) 中的函数 e-1xx=0 处具有不同的单侧极限。该函数具有右侧极限 limx0+ e-1x=0,但其左侧极限 limx0- e-1x= 未定义。

当您为在 x0 处具有不同单侧极限的函数指定条件 y(x0) 时,dsolve 会将该条件视为右侧极限 lim xx0+

输入参数

全部折叠

微分方程或方程组,指定为符号方程或由符号方程组成的向量。使用 == 运算符指定微分方程。如果 eqn 是符号表达式(没有等号右侧部分),求解器会假定等号右侧为 0,并求解方程 eqn == 0

在方程中,使用 diff 来表示微分。例如,diff(y,x) 对符号函数 y(x) 关于 x 求导。使用 syms 创建符号函数 y(x),并使用 dsolve 求解方程 d2y(x)/dx2 = x*y(x)

syms y(x)
S = dsolve(diff(y,x,2) == x*y)

使用方程向量指定微分方程组,例如 syms y(t) z(t); S = dsolve([diff(y,t) == z, diff(z,t) == -y])。在这里,yz 必须是依赖于符号变量的符号函数,在本例中符号变量是 t。等号右侧必须是依赖于 tyz 的符号表达式。请注意,Symbolic Math Toolbox™ 当前不支持复合符号函数,即依赖于其他符号函数的符号函数。

初始条件或边界条件,指定为符号方程或由符号方程组成的向量。

当条件包含导数时,使用 diff 表示该导数。将 diff 调用赋值给一个变量,并使用该变量来指定条件。例如,请参阅求解具有条件的微分方程

使用方程向量来指定多个条件。如果条件数少于因变量数,解将包含任意常数 C1C2...

名称-值参数

全部折叠

将可选参量对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须出现在其他参量之后,但对各个参量对组的顺序没有要求。

示例: IgnoreAnalyticConstraints=false 不应用内部简化。

如果使用的是 R2021a 之前的版本,请使用逗号分隔每个名称和值,并用引号将 Name 引起来。

皮瑟级数解的展开点,指定为数字或者符号数、符号变量、符号函数或符号表达式。指定此选项会以皮瑟级数(允许有负指数和分数指数的幂级数)的形式返回微分方程的解。展开点不能依赖于级数变量。例如,请参阅求微分方程的级数解

数据类型: single | double | sym
复数支持:

使用内部简化的选项,指定为 truefalse

默认情况下,求解器在求解微分方程时会应用简化,这可能会导致结果并非在所有情况下都成立。换句话说,此选项应用方便的数学恒等式,但结果可能并不适用于变量的所有可能值。因此,默认情况下,求解器不保证结果的完整性。如果 IgnoreAnalyticConstraintstrue,请务必验证由 dsolve 函数返回的结果。有关详细信息,请参阅算法

要在不进行这些简化的情况下求解常微分方程,请将 IgnoreAnalyticConstraints 设置为 false。当 IgnoreAnalyticConstraints 设置为 false 时,所得到的结果对于参量的所有值都是正确的。对于某些方程,如果将 IgnoreAnalyticConstraints 设置为 falsedsolve 可能不会返回显式解。

返回隐式解的选项,指定为 falsetrue。对于变量为 xy(x) 的微分方程,隐式解的形式为 F(y(x)) = g(x)

默认情况下,求解器在求解微分方程时会尝试以解析方式求出显式解 y(x) = f(x)。如果 dsolve 无法求出显式解,您可以通过将 Implicit 选项指定为 true 来尝试求出隐式形式的解。

求解器使用显式公式的多项式方程的最大次数,指定为小于 5 的正整数。当求解次数大于 MaxDegree 的多项式方程时,dsolve 不使用显式公式。

皮瑟级数解的截断阶数,指定为正整数或符号正整数。指定此选项会以皮瑟级数(允许有负指数和分数指数的幂级数)的形式返回微分方程的解。截断阶数 nO 项中的指数:O(varn)O(varn)

输出参量

全部折叠

微分方程的解,以符号表达式或符号表达式向量形式返回。S 的大小是解的数量。

存储微分方程解的变量,以符号变量向量形式返回。输出变量的数量必须与方程组中因变量的数量相等。dsolve 按字母顺序对因变量进行排序,然后将变量的解赋值给输出变量或符号数组。

提示

  • 如果 dsolve 无法求出显式解或隐式解,则它会发出警告并返回空的 sym。在这种情况下,请尝试使用 MATLAB® ode23ode45 函数来求数值解。有时,输出是等效的低阶微分方程或积分。

  • 即使 IgnoreAnalyticConstraintsfalsedsolve 也并不总是返回完整的解。

  • 如果 dsolve 返回在 x0 处具有不同单侧极限的函数,并且您指定了条件 y(x0),则 dsolve 会将该条件视为右侧极限 limxx0+ 

算法

如果您没有将 IgnoreAnalyticConstraints 设置为 false,则 dsolve 会在求解方程时应用以下一些规则:

  • 对于 ab 的所有值,有 log(a) + log(b) = log(a·b)。特别地,以下等式对于 abc 的所有值均成立:

    (a·b)c = ac·bc.

  • 对于 ab 的所有值,有 log(ab) = b·log(a)。特别地,以下等式对于 abc 的所有值均成立:

    (ab)c = ab·c.

  • 如果 fg 是标准数学函数,并且对于所有小正数都有 f(g(x)) = x,则假设 f(g(x)) = x 对于所有的复数 x 都成立。特别地:

    • log(ex) = x

    • asin(sin(x)) = x, acos(cos(x)) = x, atan(tan(x)) = x

    • asinh(sinh(x)) = x, acosh(cosh(x)) = x, atanh(tanh(x)) = x

    • 对于朗伯 W 函数的所有分支索引 k,都有 Wk(x·ex) = x

  • 求解器可以将方程的两边乘以除 0 之外的任何表达式。

  • 多项式方程的解必须是完整的。

版本历史记录

在 R2006a 之前推出

全部展开