新闻资讯
看你所看,想你所想

solve

solve

solve

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

基本介绍

  • 外文名:solve
  • 作用:求解代数方程
  • 类别:符号解析解
  • 结果:只是部分的结果,并不是全部解

Matlab中的用法

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为变数
syms a b c x;solve('a*x^2 + b*x + c')%结果如下ans =-(b + (b^2 - 4*a*c)^(1/2))/(2*a)
如果以b为变数
syms a b c x;solve('a*x^2 + b*x + c','b')%结果如下ans =-(a*x^2 + c)/x

解方程组

syms x;S = solve('x + y = 1','x - 11*y = 5');S = [S.x S.y]%结果如下S =[ 4/3, -1/3]

解简单的超越方程

对于一些简单的超越方程,solve可以自动调用数值计算系统给出一个解,但可能不是完整的解
例子:
syms xsolve(sin(x) == x^2 - 1)
以上方程没有解析解,故求解器自动调用数值计算系统试图寻找数值解。但要想在整个定义域内寻根将要花费大量时间和资源,故solve只找出一个解。
结果:
ans =-0.63673265080528201088799090383828
如果对这个该函式画图后会发现其实这个方程是有两个解的。
ezplot(sin(x), -2, 2)hold onezplot(x^2 - 1, -2, 2)hold off
为求出另一个根可以调用MuPAD的数值求解器,并
solve
指明求解区间,或者用fsolve等其他方法数值求解,
下面用evalin函式调用MuPAD求解另一个在0~2之间的根
evalin(symengine, 'numeric::solve(sin(x) = x^2 - 1, x = 0..2)')
结果:
ans =1.4096240040025962492355939705895
高级控制的例子
syms xsolve(x^5 == 3125, x)
这样就得到複数域上的5个解,结果:
ans =5(5*5^(1/2))/4 + (2^(1/2)*(5^(1/2) + 5)^(1/2)*5*i)/4 - 5/4(5*5^(1/2))/4 - (2^(1/2)*(5^(1/2) + 5)^(1/2)*5*i)/4 - 5/4(2^(1/2)*(5 - 5^(1/2))^(1/2)*5*i)/4 - (5*5^(1/2))/4 - 5/4- (2^(1/2)*(5 - 5^(1/2))^(1/2)*5*i)/4 - (5*5^(1/2))/4 - 5/4
如果只想要实数域上的解,那幺在Name和Value的地方加上:
solve(x^5 == 3125, x, 'Real', true)
结果:
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中的solve

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)
解常微分方程解常微分方程

Mathematica中Solve的用法

调用方法:Solve[expr,vars]
例:Solve[x^2 + a x + 1 == 0, x]

转载请注明出处海之美文 » solve

相关推荐

    声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:ailianmeng11@163.com