计算机代数系统-方程求解.doc

  1. 1、本文档共22页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
计算机代数系统-方程求解

第四章 方程求解 1 代数方程(组)求解 1.1 常用求解工具—solve 求解代数方程或代数方程组, 使用Maple中的solve函数. 求解关于x的方程eqn=0的命令格式为: solve(eqn, x); 求解关于变量组vars的方程组eqns的命令为: solve(eqns, vars); eqn:=(x^2+x+2)*(x-1); solve(eqn,x); 当然, solve也可以求解含有未知参数的方程: eqn:=2*x^2-5*a*x=1; solve(eqn,x); solve函数的第一个参数是有待求解的方程或方程的集合, 当然也可以是单个表达式或者表达式的集合, 如下例: solve(a+ln(x-3)-ln(x),x); 对于第二个参数, Maple的标准形式是未知变量或者变量集合, 当其被省略时, 函数indets自动获取未知变量. 但当方程中含有参数时, 则会出现一些意想不到的情况: solve(a+ln(x-3)-ln(x)); 很多情况下, 我们知道一类方程或方程组有解, 但却没有解决这类方程的一般解法, 或者说没有解析解. 比如, 一般的五次或五次以上的多项式, 其解不能写成解析表达式. Maple具备用所有一般算法尝试所遇到的问题, 在找不到解的时候, Maple会用RootOf给出形式解. x^7-2*x^6-4*x^5-x^3+x^2+6*x+4; solve(%); solve(cos(x)=x,x); 对于方程组解的个数可用nops命令获得, 如: eqns:={seq(x[i]^2=x[i],i=1..7)}; nops({solve(eqns)}); 但是, 有时候, Maple甚至对一些“显而易见”的结果置之不理, 如: solve(sin(x)=3*x/Pi,x); 此方程的解为, 但Maple却对这个超越方程无能为力, 即便使用allvalues求解也只有下述结果: allvalues(%); 另外一个问题是, Maple在求解方程之前,会对所有的方程或表达式进行化简, 而不管表达式的类型, 由此而产生一些低级的错误: (x-1)^2/(x^2-1); solve(%); 但是, 大量实验表明, solve的确是一个实用的方程求解工具, 但是也不可盲目相信它给出的一切结果, 特别是对于非线性方程而言, 对于给出的结果需要加以验证. 下面通过几个例子说明在Maple中非线性方程组的求解问题. 例:求解方程组: eqns:={x^2+y^2=25,y=x^2-5}; vars:={x,y}; solve(eqns,vars); 也可用下面的语句一步求出: solve({x^2+y^2=25,y=x^2-5},{x,y}); 这个问题非常简单, 但通常遇到的非线性问题却不是这么简单, 例如要求解方程组: eqns:={x^2+y^2=1,sqrt(x+y)=x-y}; vars:={x,y}; sols:=solve(eqns,vars); 可以看出, 方程解的形式是以集合的序列给出的, 序列中的每一个集合是方程的一组解, 这样就很利于我们用subs把解代入原方程组进行检验: subs(sols[2],eqns); sols2:=allvalues(sols[1]); simplify(subs(sols2,eqns)); 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); fsolve(x^5-x+1,x,complex); fsolve(x^3-3*x+1,x,0..1); 对于多项式方程, fsolve在默认情况下以给出所有的实数解, 如果附加参数complex, 就可以给出所有的解. 但对于更一般的其他形式的方程, fsolve却往往只满足于得到一个解: eqn:=sin(x)=x/2; fsolve(eqn); fsolve(eqn,x,0.1..infinity); fsolve(eqn,x,-infinity..-0.1); 函数fsolve主要基于两个算法, 通常使用牛顿法, 如果牛顿法无效, 它就改而使用切线法. 为了使fsolve可以求得所有

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档