第四章 方程求解
1 代数方程(组)求解
1.1 常用求解工具—solve
求解代数方程或代数方程组, 使用Maple中的solve函数. 求解关于x的方程eqn=0的命令格式为: solve(eqn, x);
求解关于变量组vars的方程组eqns的命令为: solve(eqns, vars);
> eqn:=(x^2+x+2)*(x-1);
- 100 -
eqn := (x???x???2)(x???1)
> solve(eqn,x); 11111,????I7,????I722222 当然, solve也可以求解含有未知参数的方程: > eqn:=2*x^2-5*a*x=1; eqn := 2x???5ax???1 > solve(eqn,x); 51512a???25a???8,a???25a2???8 44442solve函数的第一个参数是有待求解的方程或方程的集合, 当然也可以是单个表达式或者表达式的集合, 如下例: > solve(a+ln(x-3)-ln(x),x); ea3?1???ea - 101 -
对于第二个参数, Maple的标准形式是未知变量或者变量集合, 当其被省略时, 函数indets自动获取未知变量. 但当方程中含有参数时, 则会出现一些意想不到的情况:
> solve(a+ln(x-3)-ln(x));
{x???x,a????ln(x???3)???ln(x)}
很多情况下, 我们知道一类方程或方程组有解, 但却没有解决这类方程的一般解法, 或者说没有解析解. 比如, 一般的五次或五次以上的多项式, 其解不能写成解析表达式. Maple具备用所有一般算法尝试所遇到的问题, 在找不到解的时候, Maple会用RootOf给出形式解. > x^7-2*x^6-4*x^5-x^3+x^2+6*x+4;
76532x???2x???4x???x???x???6x???4
> solve(%);
- 102 -
1???5,1???5,RootOf(_Z5???_Z???1,index???1),RootOf(_Z5???_Z???1,index???2),RootOf(_Z5???_Z???1,index???3),RootOf(_Z5???_Z???1,index???4),RootOf(_Z5???_Z???1,index???5) > solve(cos(x)=x,x);
RootOf(_Z???cos(_Z))对于方程组解的个数可用nops命令获得, 如: > eqns:={seq(x[i]^2=x[i],i=1..7)};
22222
eqns := {x1???x1,x2???x2,x3???x3,x4???x4,x5???x5,x6???x6,x7???x7}
22> nops({solve(eqns)});
但是, 有时候, Maple甚至对一些“显而易见”的结果置之不理, 如: > solve(sin(x)=3*x/Pi,x);
RootOf(3_Z???sin(_Z)?) 128, 0, 但Maple却对这个超越方程无能为力, 即便使用此方程的解为??6allvalues求解也只有下述结果:
- 103 -
> allvalues(%);
另外一个问题是, Maple在求解方程之前,会对所有的方程或表达式进行化简, 而不管表达式的类型, 由此而产生一些低级的错误: > (x-1)^2/(x^2-1); RootOf(3_Z???sin(_Z)?,0.)(x???1)2x2???1 > solve(%);
但是, 大量实验表明, solve的确是一个实用的方程求解工具, 但是也不可盲目相信它给出的一切结果, 特别是对于非线性方程而言, 对于给出的结果需要加以验证.
下面通过几个例子说明在Maple中非线性方程组的求解问题.
1例:求解方程组:
?x2?y2?25?2?x?9?y
> eqns:={x^2+y^2=25,y=x^2-5};
- 104 -