主要内容

solve

方程和方程组求解器

说明

S = solve(eqn,var) 关于变量 var 求解符号方程 eqn。如果您未指定 varsymvar 函数会确定要关于哪个变量进行求解。例如,solve(x + 1 == 2, x) 关于 x 求解方程 x + 1 = 2

示例

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

示例

Y = solve(eqns,vars) 关于变量 vars 求解方程组 eqns,并返回包含解的结构体。如果您未指定 varssolve 会使用 symvar 来找出要关于哪些变量进行求解。在这种情况下,symvar 求出的变量数量与方程 eqns 的数量相等。

示例

Y = solve(eqns,vars,Name=Value) 使用由一个或多个 Name=Value 参量指定的附加选项。

示例

[y1,...,yN] = solve(eqns,vars) 关于变量 vars 求解方程组 eqns。解被赋值给变量 y1,...,yN。如果您未指定变量,solve 会使用 symvar 来找出要关于哪些变量进行求解。在这种情况下,symvar 求出的变量数量与输出参量 N 的数量相等。

示例

[y1,...,yN] = solve(eqns,vars,Name=Value) 使用由一个或多个 Name=Value 参量指定的附加选项。

[y1,...,yN,parameters,conditions] = solve(eqns,vars,ReturnConditions=true) 返回额外参量 parametersconditions,这两者分别指定解中的参数以及解的条件。

示例

示例

全部折叠

在不指定要求解的变量的情况下求解以下二次方程。solve 会选择 x 来返回解。

syms a b c x
eqn = a*x^2 + b*x + c == 0
eqn = ax2+bx+c=0
S = solve(eqn)
S = 

(-b+b2-4ac2a-b-b2-4ac2a)

指定要求解的变量并关于 a 求解该二次方程。

Sa = solve(eqn,a)
Sa = 

-c+bxx2

求解一个五次多项式方程。它有五个解。

syms x
eqn = x^5 == 3125;
S = solve(eqn,x)
S = 

(5-σ1-54-525-5i4-σ1-54+525-5i4σ1-54-525+5i4σ1-54+525+5i4)where  σ1=554

通过将 Real 参量设置为 true 来仅返回实数解。此方程唯一的实数解是 5

S = solve(eqn,x,Real=true)
S = 5

solve 无法以符号形式求解方程时,它会尝试使用 vpasolve 求出数值解。vpasolve 函数会返回求出的第一个解。

尝试求解以下方程。solve 会返回一个数值解,因为它无法求出符号解。

syms x
eqn = sin(x) == x^2 - 1;
S = solve(eqn,x)
Warning: Unable to solve symbolically. Returning a numeric solution using <a href="matlab:web(fullfile(docroot, 'symbolic/vpasolve.html'))">vpasolve</a>.
S = -0.63673265080528201088799090383828

绘制该方程左右两边的图。观察可知该方程还有一个正解。

fplot([lhs(eqn) rhs(eqn)], [-2 2])

Figure contains an axes object. The axes object contains 2 objects of type functionline.

通过直接调用数值求解器 vpasolve 并指定区间来求出另一个解。

V = vpasolve(eqn,x,[0 2])
V = 1.4096240040025962492355939705895

在求解多个变量的方程时,将输出存储在结构体数组中要比存储在单独的变量中更方便。当您指定单个输出参量并且存在多个输出时,solve 函数会返回一个结构体。

求解一个方程组并以结构体数组的形式返回解。

syms u v
eqns = [2*u + v == 0, u - v == 1];
S = solve(eqns,[u v])
S = struct with fields:
    u: 1/3
    v: -2/3

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

S.u
ans = 

13

S.v
ans = 

-23

使用结构体数组时,您可以方便地将解代入其他表达式。

使用 subs 函数将解 S 代入其他表达式。

expr1 = u^2;
e1 = subs(expr1,S)
e1 = 

19

expr2 = 3*v + u;
e2 = subs(expr2,S)
e2 = 

-53

如果 solve 返回空对象,则说明不存在解。

eqns = [3*u+2, 3*u+1];
S = solve(eqns,u)
 
S =
 
Empty sym: 0-by-1
 

solve 函数可以求解不等式并返回满足不等式的解。求解以下不等式。

x>0

y>0

x2+y2+xy<1

ReturnConditions 设置为 true 以返回解中的任何参数以及解的条件。

syms x y
eqn1 = x > 0;
eqn2 = y > 0;
eqn3 = x^2 + y^2 + x*y < 1;
eqns = [eqn1 eqn2 eqn3];

S = solve(eqns,[x y],ReturnConditions=true);
S.x
ans = 

u-3v22-v2

S.y
ans = v
S.parameters
ans = (uv)
S.conditions
ans = 4v2<uu<40<v

参数 uv 不存在于 MATLAB® 工作区中,必须使用 S.parameters 来获得。

使用 subsisAlways 检查值 u = 7/2v = 1/2 是否满足条件。

condWithValues = subs(S.conditions, S.parameters, [7/2,1/2]);
isAlways(condWithValues)
ans = logical
   1

isAlways 返回逻辑值 1 (true),表示这些值满足条件。将这些参数值代入 S.xS.y 来求出 xy 的解。

xSol = subs(S.x, S.parameters, [7/2,1/2])
xSol = 

114-14

ySol = subs(S.y, S.parameters, [7/2,1/2])
ySol = 

12

求解以下方程组。

2u2+v2=0

u-v=1

在求解多个变量的方程时,您指定这些变量的顺序决定了求解器返回解的顺序。通过显式指定变量,将解赋值给变量 solvsolu。求解器会为每个变量返回解的数组。

syms u v
eqns = [2*u^2 + v^2 == 0, u - v == 1];
vars = [v u];
[solv, solu] = solve(eqns,vars)
solv = 

(-23-2i3-23+2i3)

solu = 

(13-2i313+2i3)

具有相同索引的项构成解对组。

solutions = [solv solu]
solutions = 

(-23-2i313-2i3-23+2i313+2i3)

通过将 ReturnConditions 指定为 true,返回包含解的参数和条件的方程的完整解。

求解方程 sin(x)=0。为输出参量 parametersconditions 提供两个额外的输出变量。

syms x
eqn = sin(x) == 0;
[solx,parameters,conditions] = solve(eqn,x,ReturnConditions=true)
solx = πk
parameters = k
conditions = kZ

πk 包含参数 k,其中 k 必须是整数。变量 k 不存在于 MATLAB® 工作区中,必须使用 parameters 来获得。

将解限制为 0<x<2π。求出满足此限制的 k 的有效值。假设条件 conditions,并使用 solve 来求出 k。将求出的 k 值代入 x 的解中。

assume(conditions)
restriction = [solx > 0, solx < 2*pi];
solk = solve(restriction,parameters)
solk = 1
valx = subs(solx,parameters,solk)
valx = π

或者,通过选择 k 的值来确定 x 的解。使用 isAlways 检查所选的值是否满足 k 的条件。

检查 k=4 是否满足 k 的条件。

condk4 = subs(conditions,parameters,4);
isAlways(condk4)
ans = logical
   1

isAlways 返回逻辑值 1 (true),这意味着 4 是 k 的有效值。用 4 代入 k 以求出 x 的解。使用 vpa 获得数值逼近值。

valx = subs(solx,parameters,4)
valx = 4π
vpa(valx)
ans = 12.5664

求解方程 exp(log(x)log(3x))=4

当您定义符号变量 x 时,该变量默认表示一个复数值。solve 函数仅应用对 x 的所有值都有效的数学规则或简化。求解器不会假定 x 是正实数,因此它不会应用对数恒等式 log(3x)=log(3)+log(x)。因此,solve 无法以符号形式求解该方程。

syms x
eqn = exp(log(x)*log(3*x)) == 4;
S = solve(eqn,x)
Warning: Unable to solve symbolically. Returning a numeric solution using <a href="matlab:web(fullfile(docroot, 'symbolic/vpasolve.html'))">vpasolve</a>.
S = -14.009379055223370038369334703094-2.9255310052111119036668717988769i

要应用可能使 solve 求出符号解的数学规则,请将 IgnoreAnalyticConstraints 名称-值参量指定为 true。有关详细信息,请参阅算法

S = solve(eqn,x,IgnoreAnalyticConstraints=true)
S = 

(3e-log(256)+log(3)2233elog(256)+log(3)223)

此处,solve 应用了对数恒等式,使得求解器通过假定 x 是正实数来求出解。由于这些恒等式通常并非总是成立,因此在求解器忽略约束时,验证解是一个很好的做法。

例如,用第二个解代入原始方程中的 x 来验证解。使用 isAlways 检查得到的方程是否为 true

verifyeqn = subs(eqn,x,S(2))
verifyeqn = 

elog(3elog(256)+log(3)22)log(3elog(256)+log(3)223)=4

tf = isAlways(verifyeqn)
tf = logical
   1

solve 函数可能不会返回简化的解。例如,求解一个方程。

syms x
S = solve((sin(x) - 2*cos(x))/(sin(x) + 2*cos(x)) == 1/2, x)
S = 

(-log(--14037+4837i2)i-log(-14037+4837i2)i)

要简化解,请使用 simplify

S = simplify(S)
S = 

(-log(37-137-637i)ilog(2)i-log(-14037+4837i)i2)

使用 simplify 并执行更多步骤来进一步简化解。

S = simplify(S,Steps=50)
S = 

(atan(6)-ππ2-atan(1235)2)

symsyms 函数用于为符号变量设置假设。

假设变量 x 为正数。

syms x positive

当您针对设置了假设的变量求解方程时,求解器仅返回与假设相符的解。针对 x 求解以下方程。

eqn = x^2 + 5*x - 6 == 0;
S = solve(eqn,x)
S = 1

通过将 IgnoreProperties 设置为 true,允许返回不满足假设的解。

S = solve(eqn,x,IgnoreProperties=true)
S = 

(-61)

为了进一步的计算,请使用 syms 重新创建变量 x 以清除对它设置的假设。

syms x

求解多项式方程时,求解器可能会使用 root 返回解。求解一个三次多项式方程。

syms x a
eqn = x^3 + x^2 + a == 0;
solve(eqn, x)
ans = 

(root(z3+z2+a,z,1)root(z3+z2+a,z,2)root(z3+z2+a,z,3))

通过使用 MaxDegree 参量调用求解器,尝试获得此类方程的显式解。此参量指定求解器尝试返回其显式解的多项式的最大次数。默认值为 2。增大此值,可以获得更高阶多项式的显式解。

通过将 MaxDegree 的值增大到 3 来求解相同方程的显式解。

S = solve(eqn,x,MaxDegree=3)
S = 

(19σ1+σ1-13-118σ1-σ12-13-319σ1-σ1i2-118σ1-σ12-13+319σ1-σ1i2)where  σ1=a2+1272-1729-a2-1271/3

求解方程 sin(x)+cos(2x)=1

求解器不会返回无限多个周期性解,而会选择它认为最实用的三个解。

syms x
eqn = sin(x) + cos(2*x) == 1;
S = solve(eqn,x)
S = 

(0π65π6)

通过将 PrincipalValue 设置为 true 来仅选择一个解。

S1 = solve(eqn,x,PrincipalValue=true)
S1 = 0

使用 solve 求解包含多个变量的方程时,您指定变量的顺序会影响解。在某些情况下,不同的顺序可能会得到满足待求解方程或方程组的不同解。

求解一个包含两个未知数 ab 的方程。

syms a b
eqn = a*exp(1i*b) == 1
eqn = aebi=1

首先,按先 ab 的顺序指定要求解的变量。在此情况下,解包含一个任意参数,a 为指数函数,b 为任意值。

[sola,solb,parameters,conditions] = solve(eqn,a,b,ReturnConditions=true)
sola = e-zi
solb = z
parameters = z
conditions = symtrue

接下来,以相反的顺序指定要求解的变量,即先 ba。在此情况下,解包含一个非零任意参数和一个整数参数。b 的解是一个对数函数加上 2π 的整数倍,a 的解一个是任意非零值。

[solb,sola,parameters,conditions] = solve(eqn,b,a,ReturnConditions=true)
solb = 

2πk-log(1z)i

sola = z
parameters = (kz)
conditions = kZz0

自 R2025a 起

您可以求解未知数为符号函数或其导数的符号方程。

例如,创建一个涉及符号函数 f(x) 的二次方程。使用 solvef(x)

syms f(x) b c
eq = f(x)*x^2 + b*x + c == 0;
fsol = solve(eq,f(x))
fsol = 

-c+bxx2

接下来,创建一个涉及符号函数 θ(t) 的三角函数的方程。在 ReturnConditions 设置为 true 的情况下,使用 solveθ(t)

syms t theta(t)
eq = 3 == -9.8*sin(theta(t));
[thetasol,param,cond] = solve(eq,theta(t),ReturnConditions=true)
thetasol = 

(2πk-asin(1549)π+asin(1549)+2πk)

param = k
cond = 

(kZkZ)

然后,求解一个涉及 f(x) 的导数和变量 a 的方程组。

syms f(x) a
eq1 = diff(f,x) == 3*a - 2*x;
eq2 = diff(f,x) == a + x^2;
[Df,asol] = solve([eq1 eq2],diff(f,x),a)
Df = 

3x22+x

asol = 

x22+x

输出 Df 表示 diff(f,x) 的解。基于这个解,您可以使用 dsolve 来求解关于 f(x) 的微分方程。

fsol(x) = dsolve(diff(f,x) == Df)
fsol(x) = 

C1+x2x+12

输入参数

全部折叠

要求解的方程,指定为符号表达式或符号方程。关系运算符 == 用于定义符号方程。如果 eqn 是符号表达式(没有等号右侧部分),求解器会假定等号右侧为 0,并求解方程 eqn == 0

要求解的变量,指定为符号变量或符号函数 (自 R2025a 起)。默认情况下,solve 使用由 symvar 确定的变量。

要求解的方程组,指定为符号表达式或符号方程。如果 eqns 的任何元素是符号表达式(没有等号右侧部分),solve 会假定该元素等于 0

要求解的变量,指定为符号向量、符号矩阵或逗号分隔的变量列表。默认情况下,solve 使用由 symvar 确定的变量。

您指定这些变量的顺序决定了求解器返回解的顺序。在少数情况下,不同的顺序可能会得到不同的解,但这些解都满足待求解的方程或方程组。

示例: [x y z]

示例: x,y,z

名称-值参数

全部折叠

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

示例: Real=true 指定求解器返回实数解。

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

仅返回实数解的选项,指定为下列值之一:

false返回所有解。
true仅返回原始方程的每个子表达式都表示实数的那些解。此选项还假定方程的所有符号参数都表示实数。

请参阅求解多项式方程并返回实数解

返回解中的参数以及解成立的条件的选项,指定为下列值之一:

false不返回参数化的解以及解成立的条件。solve 函数会用合适的值替换参数。
true返回解中的参数以及解成立的条件。对于只有一个输出变量的调用,solve 返回包含字段 parametersconditions 的结构体。对于多个输出变量的情况,solve 将参数和条件赋值给最后两个输出变量。此行为意味着输出变量的数量必须等于要求解变量的数量加二。

请参阅求解不等式

示例: [v1,v2,params,conditions] = solve(sin(x) + y == 0,y^2 == 3,ReturnConditions=true) 返回 params 中的参数以及 conditions 中的条件。

应用于表达式和方程的简化规则,指定为下列值之一:

false使用严格的简化规则。
true对表达式和方程应用纯代数简化。将 IgnoreAnalyticConstraints 设置为 true 可以得到更简单的解,但这可能会导致结果并非在所有情况下都成立。换句话说,此选项应用方便的数学恒等式,但结果可能并不适用于变量的所有可能值。在某些情况下,它还允许 solve 求解以其他方式无法求解的方程和方程组。有关详细信息,请参阅算法

请参阅应用数学规则

返回与变量属性不一致的解的选项,指定为下列值之一:

false不包含与变量属性不一致的解。
true包含与变量属性不一致的解。

请参阅忽略对变量的假设

求解器使用显式公式的多项式方程的最大次数,指定为小于 5 的正整数。在求解次数大于指定值的多项式方程时,求解器不会使用涉及方根的显式公式。

请参阅求解高次多项式方程

返回一个解的选项,指定为下列值之一:

false返回所有解。
true仅返回一个解。如果方程或方程组没有解,则求解器返回一个空的符号对象。

请参阅返回一个解

输出参量

全部折叠

方程的解,以符号数组形式返回。符号数组的大小对应于解的数量。

方程组的解,以结构体形式返回。结构体中字段的数量对应于方程组中自变量的数量。如果 ReturnConditions 设置为 true,则 solve 函数会返回两个额外的字段,分别包含解中的参数以及解成立的条件。

方程组的解,以符号变量形式返回。输出变量或符号数组的数量必须等于方程组中自变量的数量。如果您显式指定自变量 vars,则求解器会按照相同的顺序返回解。如果您不指定 vars,则工具箱会按字母顺序对自变量进行排序,然后将这些变量的解赋值给输出变量。

解中的参数,以生成的参数向量形式返回。仅当 ReturnConditions 设置为 true 时才会返回此输出参量。如果提供了单个输出参量,则 parameters 作为结构体的一个字段返回。如果提供了多个输出参量,则 parameters 作为倒数第二个输出参量返回。生成的参数不会出现在 MATLAB® 工作区中。必须使用 parameters 来获得它们。

示例: [solx, params, conditions] = solve(sin(x) == 0, ReturnConditions=true) 返回参量 params 中的参数 k

解成立的条件,以符号表达式向量形式返回。仅当 ReturnConditions 设置为 true 时才会返回此输出参量。如果提供了单个输出参量,则 conditions 作为结构体的一个字段返回。如果提供了多个输出参量,则 conditions 作为最后一个输出参量返回。

示例: syms x; [solx, params, conditions] = solve(sin(x) == 0, ReturnConditions=true) 返回 conditions 中的条件 in(k, 'integer')solx 中的解仅在 k 为整数的条件下才成立。

提示

  • 如果 solve 无法求出解并且 ReturnConditionsfalse,则 solve 函数会在内部调用数值求解器 vpasolve 来尝试求出数值解。对于没有符号参数的多项式方程和方程组,数值求解器会返回所有解。对于没有符号参数的非多项式方程和方程组,数值求解器仅会返回一个解(如果存在解的话)。

  • 如果 solve 无法求出解并且 ReturnConditionstrue,则 solve 会返回空解并发出警告。如果不存在解,则 solve 会返回空解且不发出警告。

  • 如果解中包含参数且 ReturnConditionstrue,则 solve 函数会返回解中的参数以及解成立的条件。如果 ReturnConditionsfalse,则 solve 函数会选择参数的值并返回相应的结果,或者返回参数化的解而不选择特定的值。在后一种情况下,solve 还会发出警告,指出返回的解中参数的值。

  • 如果一个参数不出现在任何条件中,这意味着该参数可以取任何复数值。

  • 除了 solve 引入的参数外,solve 的输出还可以包含输入方程中的参数。

  • solve 引入的参数不会出现在 MATLAB 工作区中。必须使用包含这些参数的输出参量来获得它们。要在 MATLAB 工作区中使用这些参数,还可以使用 syms 来初始化相关参数。例如,如果参数是 k,可以使用 syms k

  • 变量名称 parametersconditions 不允许作为 solve 的输入。

  • 要求解微分方程,可以使用 dsolve 函数。

  • 在求解方程组时,务必要将结果赋值给输出参量。输出参量可用于获得方程组的解的值。

  • MaxDegree 仅接受小于 5 的正整数,因为一般来说,高于 4 次的多项式的根没有显式表达式。

  • 输出变量 y1,...,yN 不指定 solve 求解方程或方程组所关于的变量。如果 y1,...,yN 是出现在 eqns 中的变量,则无法保证 solve(eqns) 会按照正确的顺序将解赋值给 y1,...,yN。因此,运行 [b,a] = solve(eqns) 时,可能会将 a 的解赋值给 b,反之亦然。为了确保返回解的顺序正确,请指定变量 vars。例如,调用 [b,a] = solve(eqns,b,a) 会将 a 的解赋值给 a,将 b 的解赋值给 b

算法

使用 IgnoreAnalyticConstraints 时,求解器会对方程两边的表达式应用以下一些规则。

  • 对于 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 之前推出

全部展开