计算机代数系统第4章-方程求解

2026/1/27 11:47:00

第四章 方程求解

1 代数方程(组)求解

1.1 常用求解工具—solve

求解代数方程或代数方程组, 使用Maple中的solve函数. 求解关于x的方程eqn=0的命令格式为:

solve(eqn, x);

求解关于变量组vars的方程组eqns的命令为: solve(eqns, vars);

> eqn:=(x^2+x+2)*(x-1);

eqn := (x2???x???2)(x???1)

> solve(eqn,x);

11111,????I7,????I7

2222当然, solve也可以求解含有未知参数的方程:

> eqn:=2*x^2-5*a*x=1;

eqn := 2x2???5ax???1

> solve(eqn,x);

5151a???25a2???8,a???25a2???8 4444solve函数的第一个参数是有待求解的方程或方程的集合, 当然也可以是单个表达

式或者表达式的集合, 如下例:

> solve(a+ln(x-3)-ln(x),x);

ea3 a?1???e对于第二个参数, Maple的标准形式是未知变量或者变量集合, 当其被省略时, 函数indets自动获取未知变量. 但当方程中含有参数时, 则会出现一些意想不到的情况: > solve(a+ln(x-3)-ln(x));

- 100 -

{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;

x7???2x6???4x5???x3???x2???6x???4

> solve(%);

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)};

eqns := {x1???x1,x2???x2,x3???x3,x4???x4,x5???x5,x6???x6,x7???x7}

> nops({solve(eqns)});

2222222128

但是, 有时候, Maple甚至对一些“显而易见”的结果置之不理, 如: > solve(sin(x)=3*x/Pi,x);

RootOf(3_Z???sin(_Z)?)

此方程的解为??, 0, 但Maple却对这个超越方程无能为力, 即便使用allvalues6求解也只有下述结果: > allvalues(%);

RootOf(3_Z???sin(_Z)?,0.)

另外一个问题是, Maple在求解方程之前,会对所有的方程或表达式进行化简, 而不管表达式的类型, 由此而产生一些低级的错误: > (x-1)^2/(x^2-1);

(x???1)2

x2???1> solve(%);

1

- 101 -

但是, 大量实验表明, solve的确是一个实用的方程求解工具, 但是也不可盲目相信它给出的一切结果, 特别是对于非线性方程而言, 对于给出的结果需要加以验证.

下面通过几个例子说明在Maple中非线性方程组的求解问题.

?x2?y2?25例:求解方程组:?2

x?9?y?> eqns:={x^2+y^2=25,y=x^2-5};

eqns := {y???x2???5,x2???y2???25}

> vars:={x,y};

vars := {x,y}

> solve(eqns,vars);

{x???0,y???-5},{x???0,y???-5},{y???4,x???3},{y???4,x???-3}

也可用下面的语句一步求出:

> solve({x^2+y^2=25,y=x^2-5},{x,y});

{x???0,y???-5},{x???0,y???-5},{y???4,x???3},{y???4,x???-3}

这个问题非常简单, 但通常遇到的非线性问题却不是这么简单, 例如要求解方程组:x2?y2?1,x?y?x?y

> eqns:={x^2+y^2=1,sqrt(x+y)=x-y}; vars:={x,y};

eqns := {x2???y2???1,x???y???x???y}

vars := {x,y}

> sols:=solve(eqns,vars);

sols := {y???RootOf(2_Z2???4_Z???3,-1.000000000???.7071067812I),x????RootOf(2_Z2???4_Z???3,-1.000000000???.7071067812I)???2},{x???1,y???0}

可以看出, 方程解的形式是以集合的序列给出的, 序列中的每一个集合是方程的一

组解, 这样就很利于我们用subs把解代入原方程组进行检验: > subs(sols[2],eqns);

{1???1}

> sols2:=allvalues(sols[1]);

11sols2 := {x????1???I2,y????1???I2}

22> simplify(subs(sols2,eqns));

- 102 -

{I2???I2,1???1}

1.2 其他求解工具

1.2.1 数值求解

对于求代数方程的数值解问题, Maple提供了函数fsolve, fsolve的使用方法和solve很相似:

fsolve(eqns, vars, options);

其中, eqns表示一个方程、方程组或者一个程序, vars表示一个未知量或者未知量集合, options控制解的参数(诸如:complex: 复根; maxsols=n:只找到n阶最小根; intervals:在给定闭区间内求根, 等). > fsolve(x^5-x+1,x);

-1.167303978

> fsolve(x^5-x+1,x,complex);

-1.167303978,-.1812324445???1.083954101I,-.1812324445???1.083954101I,.7648844336???.3524715460I,.7648844336???.3524715460I

> fsolve(x^3-3*x+1,x,0..1);

.3472963553

对于多项式方程, fsolve在默认情况下以给出所有的实数解, 如果附加参数complex, 就可以给出所有的解. 但对于更一般的其他形式的方程, fsolve却往往只满足于得到一个解:

> eqn:=sin(x)=x/2;

1eqn := sin(x)???x

2> fsolve(eqn);

0.

> fsolve(eqn,x,0.1..infinity);

1.895494267

> fsolve(eqn,x,-infinity..-0.1);

-1.895494267

函数fsolve主要基于两个算法, 通常使用牛顿法, 如果牛顿法无效, 它就改而使用切线法. 为了使fsolve可以求得所有的实根, 我们通常需要确定这些根所在的区间. 对于单变量多项式, 函数realroot可以获得多项式的所有实根所在的区间. > 4+6*x+x^2-x^3-4*x^5-2*x^6+x^7;

4???6x???x2???x3???4x5???2x6???x7

> realroot(%);

- 103 -


计算机代数系统第4章-方程求解.doc 将本文的Word文档下载到电脑
搜索更多关于: 计算机代数系统第4章-方程求解 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219