solve

solve是一个数学术语。在MATLAB中,solve函数主要是用来求解代数方程多项式方程)的符号解析解。也能解一些简单其他方程的数值解,不过对于解其他方程的能力很弱,此时求出的解往往是不精确或不完整的。注意可能得到的只是部分的结果,并不是全部解。

solve(eq)

solve(eq, var)

solve(eq1, eq2, ..., eqn)

g = solve(eq1, eq2, ..., eqn, var1, var2, ..., varn)

其中,eq代表一个符号表达式或字符串,var代表一个变量名称

详细的解释:

g=solve(eq)

函数求代数方程的符号解析解。参量eq表示符号表达式或字符串。若eq是一符号表达式或一没有等号的字符串,则函数对方程的默认变量求解方程eq=0,默认变量由命令findsym(eq)确定。若输出参量g为单一变量,则对于有多重解的非线性方程,g为一行向量。

g=solve(eq,var)

用法同上,var为指定变量。即对符号表达式或没有等号的字符串eq中指定的变量var求解方程eq(var)=0。

g=solve(eq1,eq2,…,eqn)

函数求代数方程的符号解析解。参量eq1,eq2,…,eqn表示符号表达式或字符串。函数对方程组eq1,eq2,…,eqn中由命令findsym确定的n个变量如x1,x2,…,xn求解。若g为一单个变量,则g为一包含n个解的结构;若g为有n个变量的向量,则分别返回结果给相应的变量。

g=solve(eq1,eq2,…,eqn,var1,var2,…,varn)

用法同上,var1,var2,…,varn为指定变量,即对方程组eq1,eq2,…,eqn中指定的n个变量var1,var2,…,varn求解。

g= solve(eqn1,...,eqn,,var1,...,varn,Name,Value)

用法同上,Name和Value用来对解方程做一些更高级的控制。不填时,按默认值求解。若要控制多个Name对应的Value值,没有顺序要求。Name和Value的选项如下。

Name

Value

'ReturnConditions'

默认为false,当为true时额外提供两个参数。

Example: [v1, v2, params, conditions] = solve(sin(x) +y == 0,y^2 == 3,'ReturnConditions',true)

'IgnoreAnalyticConstraints'

默认为false,当为true时会先对原方程进行一些化简操作后再解,以得到较为精简的结果,这也有可能使一些原本用solve解不出来的方程可以得到解。但置为true时也有可能使解不完整或产生错误

'IgnoreProperties'

默认为false,当为true时求解时会忽略变量定义时的一些假设,比如假设变量为正(syms x positive)

'MaxDegree'

默认为3,当复杂多项式方程的阶数高于'MaxDegree'时,solve可能只给出隐式解,调整该项可以让solve给出一些更高阶代数方程的显性解。注意该项最大为4(在数学上更高阶的多项式方程往往很少有解析解)

'PrincipalValue'

默认为false,为true时只给出一个主要的解

'Real'

默认为false,为true时只给出实数解


  

如果以x为变量

如果以b为变量

对于一些简单的超越方程,solve可以自动调用数值计算系统给出一个解,但可能不是完整的解

例子:

以上方程没有解析解,故求解器自动调用数值计算系统试图寻找数值解。但要想在整个定义域内寻根将要花费大量时间和资源,故solve只找出一个解。

结果:
  

如果对这个该函数画图后会发现其实这个方程是有两个解的。

为求出另一个根可以调用MuPAD的数值求解器,并

指明求解区间,或者用fsolve等其他方法数值求解,

下面用evalin函数调用MuPAD求解另一个在0~2之间的根

结果:
  

高级控制的例子

这样就得到复数域上的5个解,结果:

如果只想要实数域上的解,那么在Name和Value的地方加上:

结果:

ans =

5
  

1 solve解非代数方程的能力较弱,最好结合其他方式求解非代数方程

2 如果解得是一个方程组,而且采用了形如[a,b]=solve(a+b==1, 2*a-b==4,a,b) 的格式,那么,在MATLAB R2014a中没问题,可以保证输出的a,b就等于相应的解,但是在R2012b等早先版本中不能保证输出的顺序就是你声明变量时的顺序。所以最好采用g=solve(a+b==1, 2*a-b==4,a,b)这种单输出格式,这样输出的是一个结构体,g.ag.b就是对应的解。

MuPAD是MATLAB现在的符号计算引擎(以前为maple),也可以单独使用,单独使用时语法有所不同。

solve(eq, x, <Options>) 单个方程,指定变量

solve(eq, x = a .. b, <Options>) 单个方程,指定区间

solve(eq, vars, <Options>) 方程组

solve(eq, <Options>)

solve(system, x, <Options>)

solve(system, vars, <Options>)

solve(system, <Options>)

solve(ODE)

solve(REC)

solve(x^7 + x^2 + x, x)

solve({x + y + z = 3, x + y = 2}, {x, y, z}) 或 solve({x + y + z = 3, x + y = 2}, [x, y, z]) {[x = 2 - z1, y = z1, z = 1]} 方程组可以用前面介绍的集合,序列的方式混合 也即{ }和[ ]交叉使用

代数符号方程 S := solve(a*x^2 + b*x + c, x)


  

R:=rec(eq, y(n), <cond>);solve(R)

参数:

eq:

方程或表达式

y:

未知函数

n:

索引号

cond:

初始值或边界集合

由此可见,Rec主要是返回多项式的结果表达式,对于复杂问题,有直接法,for多重循环,滤波器法,Z变换法。

ode::solve(o, <Type = OdeType>, <Opts>)solve(o, <Type = OdeType>, <Opts>)

o: 常微分方程

Type = OdeType 方程类型Abel, Bernoulli, Chini, Clairaut, ExactFirstOrder, ExactSecondOrder, Homogeneous, Lagrange, Riccati.

Opts 与解法有关选项

例子o:= ode(y'(x) = y(x)^2, y(x));solve(o)o:= ode({y'(x) = a*y(x)^2, y(a) = ln(a)}, y(x)):solve(o)

调用方法:Solve[expr,vars]

例:Solve[x^2 + a x + 1 == 0, x]

相关词汇