-1-第一章Maple基础1初识计算机代数系统Maple1.1Maple简说1980年9月,加拿大Waterloo大学的符号计算机研究小组成立,开始了符号计算在计算机上实现的研究项目,数学软件Maple是这个项目的产品.目前,这仍是一个正在研究的项目.Maple的第一个商业版本是1985年出版的.随后几经更新,到1992年,Windows系统下的Maple2面世后,Maple被广泛地使用,得到越来越多的用户.特别是1994年,Maple3出版后,兴起了Maple热.1996年初,Maple4问世,1998年初,Maple5正式发行.目前广泛流行的是Maple7以及2002年5月面市的Maple8.Maple是一个具有强大符号运算能力、数值计算能力、图形处理能力的交互式计算机代数系统(ComputerAlgebraSystem).它可以借助键盘和显示器代替原来的笔和纸进行各种科学计算、数学推理、猜想的证明以及智能化文字处理.Maple这个超强数学工具不仅适合数学家、物理学家、工程师,还适合化学家、生物学家和社会学家,总之,它适合于所有需要科学计算的人.1.2Maple结构Maple软件主要由三个部分组成:用户界面(Iris)、代数运算器(Kernel)、外部函数库(Externallibrary).用户界面和代数运算器是用C语言写成的,只占整个软件的一小部分,当系统启动时,即被装入,主要负责输入命令和算式的初步处理、显示结果、函数图象的显示等.代数运算器负责输入的编译、基本的代数运算(如有理数运算、初等代数运算等)以及内存的管理.Maple的大部分数学函数和过程是用Maple自身的语言写成的,存于外部函数库中.当一个函数被调用时,在多数情况下,Maple会自动将该函数的过程调入内存,一些不常用的函数才需要用户自己调入,如线性代数包、统计包等,这使得Maple在资源的利用上具有很大的优势,只有最有用的东西才留驻内存,这保证了Maple可以在较小内存的计算机上正常运行.用户可以查看Maple的非内存函数的源程序,也可以将自己编的函数、过程加到Maple的程序库中,或建立自己的函数库.1.3Maple输入输出方式为了满足不同用户的需要,Maple可以更换输入输出格式:从菜单“Options|InputDisplay和OutDisplay下可以选择所需的输入输出格式.Maple7有2种输入方式:Maple语言(MapleNotation)和标准数学记法(StandardMathNotation).Maple语言是一种结构良好、方便实用的内建高级语言,它的语法和Pascal或C有一定程度的相似,但有很大差别.它支持多种数据操作命令,如函数、序列、集合、列表、数组、表,还包含许多数据操作命令,如类型检验、选择、组合等.标准数学记法就是我们常用的数学语言.启动Maple,会出现新建文档中的“[”提示符,这是Maple中可执行块的标志,在“”后即可输入命令,结束用“;”(显示输出结果)或者“:”(不显示输出结果).但是,值得注意的是,并不是说Maple的每一行只能执行一句命令,而是在一个完整的可执行块中健入回车之后,Maple会执行当前执行块中所有命令(可以是若干条命令或者是一段程序).如果要输入的命令很长,不能在一行输完,可以换行输入,此时换行命令用“shift+Enter”组合键,而在最后一行加入结束标志“;”或“:”,也可在非末行尾加符号“\”完成.Maple7有4种输出方式:Maple语言、格式化文本(CharacterNotation)、固定格式记法(TypesetNotation)、标准数学记法(StandardMathNotation).通常采用标准数学记法.Maple会认识一些输入的变量名称,如希腊字母等.为了使用方便,现将希腊字母表罗列如下,输入时只需录入相应的英文,要输入大写希腊字母,只需把英文首字母大写:alphabetagammadeltaepsilonzetaetathetaiotakappalambdamunuxiomicronpirhosigmatauupsilonphichipsiomega有时候为了美观或特殊需要,可以采用Maple中的函数或程序设计方式控制其输出方式,如下例:forito10doprintf(i=%+2dandi^(1/2)=%+6.3f,i,eval(sqrt(i)));od;+2d的含义是带符号的十进位整数,域宽为2.显然,这种输出方式不是我们想要的,为了得到更美观的输出效果,在语句中加入换行控制符“\n”即可:forito10doprintf(i=%+2dandi^(1/2)=%+6.3f\n,i,eval(sqrt(i)));od;再看下例:将输入的两个数字用特殊形式打印:niceP:=proc(x,y)printf(valueofx=%6.4f,valueofy=%6.4f,x,y);-2-endproc;niceP(2.4,2002.204);1.4Maple联机帮助学会寻求联机帮助是掌握一个软件的钥匙.Maple有一个非常好的联机帮助系统,它包含了90%以上命令的使用说明.要了解Maple的功能可用菜单帮助“Help”,它给出Maple内容的浏览表,这是一种树结构的目录表,跟有…的词条说明其后还有子目录,点击这样的词条后子目录就会出现(也可以用Tab键和up,down选定).可以从底栏中看到函数命令全称,例如,我们选graphics…,出现该条的子目录,从中选2D…,再选plot就可得到作函数图象的命令plot的完整帮助信息.一般帮助信息都有实例,我们可以将实例中的命令部分拷贝到作业面进行计算、演示,由此可了解该命令的作用.在使用过程中,如果对一个命令把握不准,可用键盘命令对某个命令进行查询.例如,在命令区输入命令“?plot”(或help(plot);),然后回车将给出plot命令的帮助信息,或者将鼠标放在选定的要查询的命令的任何位置再点击菜单中的“Help”即可.2Maple的基本运算2.1数值计算问题算术是数学中最古老、最基础和最初等的一个分支,它研究数的性质及其运算,主要包括自然数、分数、小数的性质以及他们的加、减、乘、除四则运算.在应用Maple做算术运算时,只需将Maple当作一个“计算器”使用,所不同的是命令结束时需加“;”或“:”.在Maple中,主要的算术运算符有“+”(加)、“–”(减)、“*”(乘)、“/”(除)以及“^”(乘方或幂,或记为**),算术运算符与数字或字母一起组成任意表达式,但其中“+”、“*”是最基本的运算,其余运算均可归诸于求和或乘积形式.算述表达式运算的次序为:从左到右,圆括号最先,幂运算优先,其次是乘除,最后是加减.值得注意的是,“^”的表达式只能有两个操作数,换言之,cba^^是错误的,而“+”或“*”的任意表达式可以有两个或者两个以上的操作数.Maple有能力精确计算任意位的整数、有理数或者实数、复数的四则运算,以及模算术、硬件浮点数和任意精度的浮点数甚至于矩阵的计算等等.总之,Maple可以进行任意数值计算.但是,任何软件或程序毕竟只是人们进行科学研究的一种必要的辅助,即便它有很多优点,但也有它的局限性,为了客观地认识数学软件、认识Maple,下面通过两个简单例子予以说明.第一个简单的数值计算实例想说明Maple数值计算的答案的正确性:3!!!;上述运算结果在IBMPC机(1G,128M)上计算只需要0.01秒,得到如此复杂的结果(1747位),一个自然的问题是:答案正确吗?为了回答这个问题,我们借助于数值分析方法,由Stiring公式)exp(2!nnnnn可得:17461060091.2!720,前三位数字与Maple输出结果相同,且两者结果均为1747位.另外,在720!的计算中,5的因子的个数为:1785720572057205720432这些5与足够多的2相乘将得到178个0,而Maple的输出结果中最后178位数为零.由此,可以相信Maple结果的正确性.另一个例子则想说明Maple计算的局限性:?8?86/23/1Maple在处理问题时,为了避免失根,从不求算术式的近似值,分数则化简为既约分数.因此,在Maple中很容易得到:6/23/188显然这是错误的.这一点可以从代数的角度予以分析.不妨设x3/18,则083x,即0)42)(2(2xxx,显然3/18有3个结果,-2是其实数结果.另一方面,设x6/28,则0)8(26x,即:0)42)(42)(2)(2()8)(8(2233xxxxxxxx显然6/28有6个结果,-2、2是其实数结果.这个简单的例子说明了Maple在数值计算方面绝对不是万能的,其计算结果也不是完全正确的,但是,通过更多的实验可以发现:Maple只可能丢失部分结果,而不会增加或很少给出完全错误的结果(如上例中Maple的浮点数结果皆为1.0000000001.732050807I).这一点提醒我们,在利用Maple或其他任何数学软件或应用程序进行科学计算时,必须运用相关数学基础知识校验结果的正确性.尽管Maple存在缺陷(实际上,任何一个数学软件或程序都存在缺陷),但无数的事实说明Maple仍然不失为一个具有强大科学计算功能的计算机代数系统.事实上,Maple同其他数学软件或程序一样只是科学计算的一个辅助工具,数学基础才是数学科学中最重要的.-3-2.1.1有理数运算作为一个符号代数系统,Maple可以绝对避免算术运算的舍入误差.与计算器不同,Maple从来不自作主张把算术式近似成浮点数,而只是把两个有公因数的整数的商作化简处理.如果要求出两个整数运算的近似值时,只需在任意一个整数后加“.”(或“.0”),或者利用“evalf”命令把表达式转换成浮点形式,默认浮点数位是10(即:Digits:=10,据此可任意改变浮点数位,如Digits:=20).12!+(7*8^2)-12345/125;123456789/987654321;evalf(%);10!;100*100+1000+10+1;(100+100)*100-9;big_number:=3^(3^3);length(%);上述实验中使用了一个变量“big_number”并用“:=”对其赋值,与Pascal语言一样为一个变量赋值用的是“:=”.而另一个函数“length”作用在整数上时是整数的十进制位数即数字的长度.“%”是一个非常有用的简写形式,表示最后一次执行结果,在本例中是上一行输出结果.再看下面数值计算例子:1)整数的余(irem)/商(iquo)命令格式:irem(m,n);#求m除以n的余数irem(m,n,'q');#求m除以n的余数,并将商赋给qiquo(m,n);#求m除以n的商数iquo(m,n,'r');#求m除以n的商数,并将余数赋给r其中,m,n是整数或整数函数,也可以是代数值,此时,irem保留为未求值.irem(2002,101,'q');#求2002除以101的余数,将商赋给qq;#显示qiquo(2002,101,'r');#求2002除以101的商,将余数赋给rr;#显示rirem(x,3);2)素数判别(isprime)素数判别一直是初等数论的一个难点,也是整数分解问题的基础.Maple提供的isprime命令可以判定一个整数n是否为素数.命令格式:isprime(n);如果判定n可分解,则返回false,如果返回true,则n“很可能”是素数.isprime(2^(2^4)+1);isprime(2^(2^5)+1);上述两个例子是一个有趣的数论难题。形如122nnF的数称为Fermat数,其中的素数称为Fermat素数