: p8 A; p, c' K4 B* a2 w- c4 U1 初识计算机代数系统Maple0 {- Y5 e) x) }; r1 [
1.1 Maple简说 * n! A) D; P' J) D( t1980年9月, 加拿大Waterloo大学的符号计算机研究小组成立, 开始了符号计算在计算机上实现的研究项目, 数学软件Maple是这个项目的产品. 目前, 这仍是一个正在研究的项目. ( p" {# \4 C) G: PMaple的第一个商业版本是1985年出版的. 随后几经更新, 到1992年, Windows系统下的Maple 2面世后, Maple被广泛地使用, 得到越来越多的用户. 特别是1994年, Maple 3出版后, 兴起了Maple热. 1996年初, Maple 4问世, 1998年初, Maple 5正式发行. 目前广泛流行的是Maple 7以及2002年5月面市的Maple 8. 9 v- k ~; C z: e4 G9 D- O
Maple是一个具有强大符号运算能力、数值计算能力、图形处理能力的交互式计算机代数系统(Computer Algebra System). 它可以借助键盘和显示器代替原来的笔和纸进行各种科学计算、数学推理、猜想的证明以及智能化文字处理. 3 l) E7 z! z0 W: U
Maple这个超强数学工具不仅适合数学家、物理学家、工程师, 还适合化学家、生物学家和社会学家, 总之, 它适合于所有需要科学计算的人. - V2 \, R' m( v1.2 Maple结构$ E; X# ^" Q9 P
Maple软件主要由三个部分组成: 用户界面(Iris)、代数运算器(Kernel)、外部函数库(External library). 用户界面和代数运算器是用C语言写成的, 只占整个软件的一小部分, 当系统启动时, 即被装入, 主要负责输入命令和算式的初步处理、显示结果、函数图象的显示等. 代数运算器负责输入的编译、基本的代数运算(如有理数运算、初等代数运算等)以及内存的管理. Maple的大部分数学函数和过程是用Maple自身的语言写成的, 存于外部函数库中. 当一个函数被调用时, 在多数情况下, Maple会自动将该函数的过程调入内存, 一些不常用的函数才需要用户自己调入, 如线性代数包、统计包等, 这使得Maple在资源的利用上具有很大的优势, 只有最有用的东西才留驻内存, 这保证了Maple可以在较小内存的计算机上正常运行. 用户可以查看Maple的非内存函数的源程序, 也可以将自己编的函数、过程加到Maple的程序库中, 或建立自己的函数库. - ~. M( g$ g" R, g0 |2 @1.3 Maple输入输出方式 8 E3 m7 x" K$ S) E0 b; H为了满足不同用户的需要, Maple可以更换输入输出格式: 从菜单“Options | Input Display和Out Display下可以选择所需的输入输出格式. 0 ?2 d0 e* y( D' ?' T' J+ {+ UMaple 7有2种输入方式: Maple语言(Maple Notation)和标准数学记法(Standard Math Notation). Maple语言是一种结构良好、方便实用的内建高级语言, 它的语法和Pascal或C有一定程度的相似, 但有很大差别. 它支持多种数据操作命令, 如函数、序列、集合、列表、数组、表, 还包含许多数据操作命令, 如类型检验、选择、组合等. 标准数学记法就是我们常用的数学语言. - X& k0 {+ C) V
启动Maple, 会出现新建文档中的“[>”提示符, 这是Maple中可执行块的标志, 在“>”后即可输入命令, 结束用“;”(显示输出结果)或者“:”(不显示输出结果). 但是, 值得注意的是, 并不是说Maple的每一行只能执行一句命令, 而是在一个完整的可执行块中健入回车之后, Maple会执行当前执行块中所有命令(可以是若干条命令或者是一段程序). 如果要输入的命令很长, 不能在一行输完, 可以换行输入, 此时换行命令用“shift+Enter”组合键, 而在最后一行加入结束标志“;”或“:”, 也可在非末行尾加符号“\”完成. % U( B% A9 w0 g: ?% L8 h
Maple 7有4种输出方式: Maple语言、格式化文本(Character Notation)、固定格式记法(Typeset Notation)、标准数学记法(Standard Math Notation). 通常采用标准数学记法. 6 _3 s% m! z. r4 F& mMaple会认识一些输入的变量名称, 如希腊字母等. 为了使用方便, 现将希腊字母表罗列如下,输入时只需录入相应的英文,要输入大写希腊字母, 只需把英文首字母大写: 1 h+ O' ^+ ~# x6 f1 O% K# _; C
' ^& \: o/ z3 l9 v3 m & \/ v$ @4 o* K3 @8 g
1 w" W" Q4 B) _0 U0 f 9 u1 M- c0 S+ q" W% y: L) e& E) s
# z) a* U4 ~- [" E 7 Y; _4 o+ m( q) Z: B9 y$ j$ F% y/ i 3 w: B R/ J. ~. h' t1 v" d6 ]1 Z
6 x+ T4 ^3 y' ]) i B; W) r
7 D. V7 p6 D0 f; K6 U( O3 E5 ?
2 }: p# ]* S- T5 ]& k3 Z: O! q5 h
# p; ^& x# F; ]$ S+ k' K
) e, Y) |, z9 `
w8 u ^! e7 p; L2 U) R8 g$ W0 Yalpha beta gamma delta epsilon zeta eta theta iota kappa lambda mu 5 p/ q. ?1 d7 c3 a% E' I - g$ {2 x( V" ?! ~5 ]
) B0 e) B0 L. C& m* f + V1 I" \" d& K+ I4 e. q # ~+ r l* [- I& } 9 e/ }1 D5 R7 H4 W# G: t
\, s- h, O' U# O
) O+ K( @! w' k1 t. }
3 Z( o4 n' V D f) Q1 P! ]/ j2 A
9 P" {3 H1 o% e H* D1 H7 T 4 [. {8 b) \ C, L3 z9 `
1 c% G) h5 R* V. E 5 Y5 Y* e% T' G: {( t
4 m* E% \( {) T$ i# b- V
nu xi omicron pi rho sigma tau upsilon phi chi psi omega* H$ S2 u- ]& |* b
有时候为了美观或特殊需要,可以采用Maple中的函数或程序设计方式控制其输出方式,如下例:6 U+ G, ^+ J @3 i" ?/ D
> for i to 10 do : V* s: M3 G+ ?( v3 ?0 rprintf("i=%+2d and i^(1/2)=%+6.3f", i, eval(sqrt(i))); / T% E0 W, s% R0 W6 l6 Hod; 1 }* [. \( P: y6 U) q4 O# ji=+1 and i^(1/2)=+1.000i=+2 and i^(1/2)=+1.414i=+3 and i^(1/2)=+1.732i=+4 and i^(1/2)=+2.000i=+5 and i^(1/2)=+2.236i=+6 and i^(1/2)=+2.449i=+7 and i^(1/2)=+2.646i=+8 and i^(1/2)=+2.828i=+9 and i^(1/2)=+3.000i=+10 and i^(1/2)=+3.162# u! f0 T+ Q# c; D4 `9 R r8 B
+2d的含义是带符号的十进位整数,域宽为2. 显然,这种输出方式不是我们想要的,为了得到更美观的输出效果,在语句中加入换行控制符“\n”即可: ~ p/ F2 u) Z* W- X# R> for i to 10 do : P# q! B, T: q) T) Y0 |printf("i=%+2d and i^(1/2)=%+6.3f\n", i, eval(sqrt(i)));/ T1 R9 |: f" Q( n+ o1 L
od;* W( R2 N; K9 Z9 ~0 j; v
i=+1 and i^(1/2)=+1.000) {+ ]0 e4 r% g% x
i=+2 and i^(1/2)=+1.414 ) P* I5 r5 P1 |/ zi=+3 and i^(1/2)=+1.732& Z& ~, ?7 ]/ D) G/ S: Y
i=+4 and i^(1/2)=+2.000 1 Y' ?+ ^: C% S" g0 g$ L( Wi=+5 and i^(1/2)=+2.236 7 R0 F4 @9 Y; r s, ^9 Z8 F9 ~3 u2 [i=+6 and i^(1/2)=+2.449 ) v4 ~# w0 k) L9 O) r# p H# a) i6 Gi=+7 and i^(1/2)=+2.646 , V% d: E* O2 {9 y" y3 ii=+8 and i^(1/2)=+2.828( f8 ]& s: l6 W2 S$ m
i=+9 and i^(1/2)=+3.000 6 @% L1 s9 l0 O% W% `1 J m4 li=+10 and i^(1/2)=+3.162% b/ X0 ?% v; g! Y0 k, O
再看下例:将输入的两个数字用特殊形式打印: 9 F% q% W5 v6 O3 C2 y> niceP:=proc(x,y)6 |7 q% J% J6 C, \1 C
printf("value of x=%6.4f, value of y=%6.4f",x,y); 0 T: S% ]( T, ?6 |5 Yend proc; 3 a X: Y# b/ ^4 j( L 9 T# t6 D4 O* {- [. T: P# `: J J> niceP(2.4,2002.204); , @5 I$ o9 J9 W8 |, gvalue of x=2.4000, value of y=2002.2040 - _9 q# W( H5 q) o1.4 Maple联机帮助; ~+ k% m, O& p
学会寻求联机帮助是掌握一个软件的钥匙. Maple有一个非常好的联机帮助系统, 它包含了90%以上命令的使用说明. 要了解Maple的功能可用菜单帮助“Help”, 它给出Maple内容的浏览表, 这是一种树结构的目录表, 跟有…的词条说明其后还有子目录, 点击这样的词条后子目录就会出现(也可以用Tab键和up, down选定). 可以从底栏中看到函数命令全称, 例如, 我们选graphics…, 出现该条的子目录, 从中选2D…, 再选plot就可得到作函数图象的命令plot的完整帮助信息. 一般帮助信息都有实例, 我们可以将实例中的命令部分拷贝到作业面进行计算、演示, 由此可了解该命令的作用. - T* X1 B. d' c
在使用过程中, 如果对一个命令把握不准, 可用键盘命令对某个命令进行查询. 例如, 在命令区输入命令“?plot”(或help(plot);), 然后回车将给出plot命令的帮助信息, 或者将鼠标放在选定的要查询的命令的任何位置再点击菜单中的“Help”即可. [& K" l2 R: }4 N) D2 Maple的基本运算" Z; T, B+ g$ O$ w, S" e/ q) \- C
2.1 数值计算问题4 u# |6 G- N/ ^4 X2 B
算术是数学中最古老、最基础和最初等的一个分支, 它研究数的性质及其运算, 主要包括自然数、分数、小数的性质以及他们的加、减、乘、除四则运算. 在应用Maple做算术运算时, 只需将Maple当作一个“计算器”使用, 所不同的是命令结束时需加“;”或“:”. ( f) w/ W4 W0 X
在Maple中, 主要的算术运算符有“+”(加)、“–”(减)、“*”(乘)、“/”(除)以及“^”(乘方或幂,或记为**), 算术运算符与数字或字母一起组成任意表达式, 但其中“+”、“*”是最基本的运算, 其余运算均可归诸于求和或乘积形式. 算述表达式运算的次序为: 从左到右, 圆括号最先, 幂运算优先, 其次是乘除,最后是加减. 值得注意的是, “^”的表达式只能有两个操作数, 换言之, 是错误的, 而“+”或“*”的任意表达式可以有两个或者两个以上的操作数. # r+ j0 i" F3 }) t* E; v" x7 C
Maple有能力精确计算任意位的整数、有理数或者实数、复数的四则运算, 以及模算术、硬件浮点数和任意精度的浮点数甚至于矩阵的计算等等. 总之, Maple可以进行任意数值计算. - s y: i! _3 g! g但是, 任何软件或程序毕竟只是人们进行科学研究的一种必要的辅助, 即便它有很多优点, 但也有它的局限性, 为了客观地认识数学软件、认识Maple, 下面通过两个简单例子予以说明. 6 w; i% U! D7 S. W
第一个简单的数值计算实例想说明Maple数值计算的答案的正确性: |+ W* x2 `! f9 E6 ~> 3!!!;7 A& h9 j" F9 A
2601218943565795100204903227081043611191521875016945785727541837850835631156947382240678577958130457082619920575892247259536641565162052015873791984587740832529105244690388811884123764341191951045505346658616243271940197113909845536727278537099345629855586719369774070003700430783758997420676784016967207846280629229032107161669867260548988445514257193985499448939594496064045132362140265986193073249369770477606067680670176491669403034819961881455625195592566918830825514942947596537274845624628824234526597789737740896466553992435928786212515967483220976029505696699927284670563747137533019248313587076125412683415860129447566011455420749589952563543068288634631084965650682771552996256790845235702552186222358130016700834523443236821935793184701956510729781804354173890560727428048583995919729021726612291298420516067579036232337699453964191475175567557695392233803056825308599977441675784352815913461340394604901269542028838347101363733824484506660093348484440711931292537694657354337375724772230181534032647177531984537341478674327048457983786618703257405938924215709695994630557521063203263493209220738320923356309923267504401701760572026010829288042335606643089888710297380797578013056049576342838683057190662205291174822510536697756603029574043387983471518552602805333866357139101046336419769097397432285994219837046979109956303389604675889865795711176566670039156748153115943980043625399399731203066490601325311304719028898491856203766669164468791125249193754425845895000311561682974304641142538074897281723375955380661719801404677935614793635266265683339509760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000/ m3 B; J; v1 x4 |' v
上述运算结果在IBM PC机(1G, 128M)上计算只需要0.01秒, 得到如此复杂的结果(1747位), 一个自然的问题是: 答案正确吗?, H; K! L6 M, a* K# F% l
为了回答这个问题, 我们借助于数值分析方法, 由Stiring公式9 t [1 v5 d3 Q# |( L; d
7 F; P. C. Z2 f$ I5 p
可得: , 前三位数字与Maple输出结果相同, 且两者结果均为1747位. 另外, 在720!的计算中, 5的因子的个数为: ; n9 G2 O4 s8 D6 Z, }0 b7 V - D4 n# Y7 Z- K% ]这些5与足够多的2相乘将得到178个0, 而Maple的输出结果中最后178位数为零. 由此, 可以相信Maple结果的正确性. " A" T: z+ w$ w# Y( S
另一个例子则想说明Maple计算的局限性: s4 z4 F# R) Q5 D6 P$ Q7 u 6 Z& x2 s/ x {- r
Maple在处理问题时, 为了避免失根, 从不求算术式的近似值, 分数则化简为既约分数. 因此, 在Maple中很容易得到: 7 |& J7 Z' a& p( \' d8 [( N y) J3 S! j+ H' x" e* C* R3 G, J
显然这是错误的. 这一点可以从代数的角度予以分析. 4 x. P1 {, V: E4 @ N: j不妨设 , 则 , 即 , 显然 有3个结果, -2是其实数结果. ' Y `- v' u4 p+ u" f. L另一方面, 设 , 则 , 即: : L/ \' y. U- G( v 5 t& G; p& a/ ?, V" _- w) J
显然 有6个结果, -2、2是其实数结果. % ^& p, h; t$ q% R- J" a, l
这个简单的例子说明了Maple在数值计算方面绝对不是万能的, 其计算结果也不是完全正确的, 但是, 通过更多的实验可以发现: Maple只可能丢失部分结果, 而不会增加或很少给出完全错误的结果(如上例中Maple的浮点数结果皆为 ). 这一点提醒我们, 在利用Maple或其他任何数学软件或应用程序进行科学计算时, 必须运用相关数学基础知识校验结果的正确性. 1 d: ^. L' F/ C Q
尽管Maple存在缺陷(实际上, 任何一个数学软件或程序都存在缺陷), 但无数的事实说明Maple仍然不失为一个具有强大科学计算功能的计算机代数系统. 事实上, Maple同其他数学软件或程序一样只是科学计算的一个辅助工具, 数学基础才是数学科学中最重要的. 6 z& S( p+ ]* V
2.1.1 有理数运算$ I! z# |: P* ]0 `
作为一个符号代数系统, Maple可以绝对避免算术运算的舍入误差. 与计算器不同, Maple从来不自作主张把算术式近似成浮点数, 而只是把两个有公因数的整数的商作化简处理. 如果要求出两个整数运算的近似值时, 只需在任意一个整数后加“.”(或“.0”), 或者利用“evalf”命令把表达式转换成浮点形式, 默认浮点数位是10 (即: Digits:=10, 据此可任意改变浮点数位, 如Digits:=20). ; k5 \' M1 D& |( r' c" I5 q9 y
> 12!+(7*8^2)-12345/125; 6 R8 I F8 y! L+ q5 K- Q8 G: ?5 d ! h; `" `( U7 j6 W9 l: `
> 123456789/987654321; " w1 f& o4 A* `8 x! n: V 6 [6 n1 Q4 n1 M% ^" @
> evalf(%);# V: f8 x0 W4 q
5 r# U' u& g' a# ]: D; o
> 10!; 100*100+1000+10+1; (100+100)*100-9; - L- g5 `" L% r 4 e4 Y0 n$ ~3 Z$ t1 N% p( M
7 j! U8 U1 n0 A# n; E
) m. B A; X% |2 B) ^5 ?: w
> big_number:=3^(3^3); . r, E6 ~: |! Z1 p$ B 0 }7 I; T+ x. e> length(%);+ r, X m8 |. M
$ o2 k; q. X! `/ ^上述实验中使用了一个变量“big_number”并用“:=”对其赋值, 与Pascal语言一样为一个变量赋值用的是“:=”. 而另一个函数“length”作用在整数上时是整数的十进制位数即数字的长度. “%”是一个非常有用的简写形式, 表示最后一次执行结果, 在本例中是上一行输出结果. 再看下面数值计算例子: ' ]% C. ]/ O( T7 a9 L8 Y, A, _ 1)整数的余(irem)/商(iquo) : ?1 ^, d. c# O1 u& d5 b命令格式: ( L- b, s; }/ p/ Y8 T, \irem(m,n); #求m除以n的余数 " z- F6 M' D( @7 D% y# u& y+ f9 Hirem(m,n,'q'); #求m除以n的余数, 并将商赋给q ) H" ?: L1 i( {& f; W" [% D, M0 diquo(m,n); #求m除以n的商数% e2 r4 B7 v2 x E9 u
iquo(m,n,'r'); #求m除以n的商数, 并将余数赋给r7 X0 u% H& N w# f4 |) P
其中, m, n是整数或整数函数, 也可以是代数值, 此时, irem保留为未求值. 4 M$ L) [* ?; t! O" m- u j> irem(2002,101,'q'); # 求2002除以101的余数, 将商赋给q A" e. W" a( J& q( { ) L+ b6 f( R" }9 ^> q; #显示q 8 ?& f" V1 F; O" _ 4 X2 e3 Z5 x0 @* P> iquo(2002,101,'r'); # 求2002除以101的商, 将余数赋给r# W& m- B- l$ R" E
6 |3 J9 d0 m- ^4 c
> r; #显示r ; c+ a4 s3 S2 |& M% k; l2 J& E+ _ / l! G6 l0 ?9 V4 G+ Q/ e
> irem(x,3); 5 M2 k9 i2 V3 ?) r+ D/ w 3 n2 @4 L& L6 ^/ ?6 ^2)素数判别(isprime) 3 d/ i+ ?/ X9 b& _" r: k9 C$ S& ~素数判别一直是初等数论的一个难点, 也是整数分解问题的基础. Maple提供的isprime命令可以判定一个整数n是否为素数. 命令格式: isprime(n); 3 b) B. ?1 r N( d) A
如果判定n可分解, 则返回false, 如果返回true, 则n“很可能”是素数. ) b9 R$ s/ d" J+ M+ s& N- v> isprime(2^(2^4)+1); * R' N% L/ J+ b. B % I! }* k m' d, S8 V> isprime(2^(2^5)+1); 7 H& X! H9 |% L2 Z1 X8 z 6 |- t- H, F; R A+ _* u K7 |6 |上述两个例子是一个有趣的数论难题。形如 的数称为Fermat数, 其中的素数称为Fermat素数, 显然, F0=3、F1=5、F2=17、F3=257、F4=65537都是素数. Fermat曾经猜想所有的Fn都是素数, 但是Euler在1732年证明了F5=641•6700417不是素数. 目前, 这仍是一个未解决的问题, 人们不知道还有没有Fermat素数, 更不知道这样的素数是否有无穷多. % A; {$ R& F% K. H3) 确定第i个素数(ithprime) 7 s6 S7 N7 t' m若记第1个素数为2,判断第i个素数的命令格式: ithprime(i); O1 A& ?; K' p& N" m5 P5 p> ithprime(2002);4 e5 N' k5 D6 F* Y. s6 z
3 V6 ~% p2 O% |& v! [) W3 j; X U' y
> ithprime(10000); 5 F& j6 T9 `. o: A) l0 Z# H - ^; s% k2 [ G/ D6 v
4) 确定下一个较大(nextprime)/较小(prevprime)素数 # O5 J L- d; k7 @+ Z当n为整数时,判断比n稍大或稍小的素数的命令格式为: 4 }1 a+ v7 v0 Lnextprime(n); 2 T$ g$ C! X. o3 E* [; ]. ^prevprime(n); 2 G# ~% r5 e ^ u7 E6 w: s> nextprime(2002);* ^# \7 K; K0 W- c: S
/ R4 a& L* h' E% W% m. f
> prevprime(2002); : \- I& l$ [% v: v ) L5 n+ E" I V. ]5) 一组数的最大值(max)/最小值(min); M0 B9 n2 e B3 S4 C& X
命令格式: max(x1,x2,…,xn); #求x1,x2,…,xn中的最大值6 P \7 v( I0 Z. o: H% v: [
min(x1,x2,…,xn); #求x1,x2,…,xn中的最小值; W, y& l: z: ?3 J! D8 O4 c9 [( A+ F
> max(1/5,ln(3),9/17,-infinity); , b$ p2 N( J( N* [* [ " d- w9 |) [& L( v5 ]1 g, p" Y> min(x+1,x+2,y);! e3 C/ I& A0 n5 _
# ^5 q, w! j' j
6)模运算(mod/modp/mods) : ^# v3 A7 a+ x; r: H: |命令格式: e mod m; # 表达式e对m的整数的模运算( p' Z9 X) u. I+ j. ]6 [$ j
modp(e,m); # e对正数m的模运算" J; g; X) D% H0 ]
mods(e,m); # e对m负对称数(即 -m)的模运算 8 l1 i" {! b/ q$ U. R) A5 n; s! t s`mod`(e,m); # 表达式e对m的整数的模运算, 与e mod m等价8 F, d6 o3 W& L2 W& G$ g, N& B! O; g
值得注意的是, 要计算i^n mod m(其中i是一整数), 使用这种“明显的”语法是不必要的, 因为在计算模m之前, 指数要先在整数(可能导致一个非常大的整数)上计算. 更适合的是使用惰性运算符“&^”即: i &^n mod m, 此时, 指数运算将由mod运算符智能地处理. 另一方面, mod运算符的左面优先比其他运算符低, 而右面优先高于+和-, 但低于*和/. 2 g, T; t' F- L$ l, x* r0 I/ ?> 2002 mod 101; A1 Q+ c5 o* I( w' n# }" @. N2 G) ~
+ d& Q6 j1 L N) m4 G8 `9 s> modp(2002,101);3 o, d2 Y9 O1 Z1 X
+ r" t& g9 I6 V/ E> mods(49,100);' y- _2 u. x; s* d
$ T/ _ H5 a. _( z) H, w8 w' ~6 e> mods(51,100); `4 v) z" X- W9 h- @& i' H9 ]4 K $ D! x% a/ F& M3 x. u
> 2^101 mod 2002; # 同 2 &^101 mod 2002; 5 M1 Q' n2 \" u) t " O* T+ w+ m) B6 j$ p7)随机数生成器(rand)1 [9 F- \0 t4 a
命令格式: 2 R$ }. |" N6 X, k" @" hrand( ); #随机返回一个12位数字的非负整数! f; t& n4 i4 C/ M
rand(a..b); #调用rand(a..b)返回一个程序, 它在调用时生成一个在范围[a, b]内的随机数 " j) l0 m6 t% k* }* Z0 ]+ w> rand();6 S* R4 ^* n7 C- r
2 [, u2 e) a( I
> myproc:=rand(1..2002):/ O3 l; C% h) R
> myproc(); * _; U1 ` ?, e# ]% E" Z$ f * q) i' n7 k- [# {9 p> myproc();( M* O# q- x/ ]4 C6 K
; ^' }: l% u% \! F! s
注意, rand(n)是rand(0..n-1)的简写形式.: u; `: e3 A( ~# s# I- @0 X1 T/ l8 U
2.1.2 复数运算 A4 g0 P, j* b7 b G% N复数是Maple中的基本数据类型. 虚数单位i在Maple中用I表示. 在运算中, 数值类型转化成复数类型是自动的, 所有的算术运算符对复数类型均适用. 另外还可以用Re( )、Im( )、conjugate( )和argument( )等函数分别计算实数的实部、虚部、共轭复数和幅角主值等运算. 试作如下实验: 3 ]% @2 D2 \3 X% {% g% R
> complex_number:=(1+2*I)*(3+4*I); ; r, d4 S$ G; W; v + S5 U- ~* \! e [" S( K" g
> Re(%);Im(%%);conjugate(%%%);argument(complex_number); , M' y7 \$ |# t& D* c : r$ r% P+ x7 G- z' [8 m% j 9 H. f( U$ O5 |1 b0 n; J# c
- k0 V$ L' h3 ^# V* k P& K9 d! l" t( L/ ]: G' c& _5 s
值得注意的是上行命令中均以“;”结束, 因此不能将命令中的2个%或3个%(最多只能用3个%)改为1个%, 因为%表示上一次输出结果, 若上行命令改为“,”结束, 则均可用1个%. + E0 X& p, F: g$ x0 |/ ~: h
为了在符号表达式中进行复数运算, 可以用函数evalc( ), 函数evalc把表达式中所有的符号变量都当成实数, 也就是认为所有的复变量都写成 的形式, 其中a、b都是实变量. 另外还有一些实用命令, 分述如下: ' P3 j9 C0 i+ V0 l b- m: o, T
1) 绝对值函数$ s# [0 ^/ j: A# w# T8 @8 [
命令格式: abs(expr); 2 j. e6 B$ J/ q3 s
当expr为实数时,返回其绝对值,当expr为复数时,返回复数的模., i- g% R% S/ `" h( J3 o
> abs(-2002); #常数的绝对值 - Y4 v. s8 r" |9 D# c1 y- A + J. A; i" F8 l/ ^2 I& k> abs(1+2*I); #复数的模 . G4 p2 L; K$ n2 R+ v 5 [* n9 t- ^" C8 w' t
> abs(sqrt(3)*I*u^2*v); #复数表达式的绝对值 $ E1 \6 L; J n8 W' M ' M- g) w8 _6 h0 Z; O* w9 j9 P> abs(2*x-5); #函数表达式的绝对值 4 R3 a' Q0 a% { Y" ~, M$ {- ]0 B' N % P' \6 Z( I& t4 Z2 S* W" c
2)复数的幅角函数 - V4 ?) J. E% F, Q命令格式: argument(x); #返回复数x的幅角的主值0 d% T8 A+ j1 l8 y4 q: Q4 {# _
> argument(6+11*I); . e" O$ o* F2 b 7 P. e* e7 q1 b4 l$ E n> argument(exp(4*Pi/3*I));% i! F/ o% ~- J5 c' ]& o
; h% O: @( s: w* z8 {# ]1 V. j/ r3)共轭复数 / l) x' |! q9 b/ x' V+ v: i命令格式: conjugate(x); #返回x的共轭复数$ p7 b; [2 g$ I0 ]6 S7 }
> conjugate(6+8*I); + w* p2 ^3 w4 x. b S 6 _/ F; n s% d) t* a; @
> conjugate(exp(4*Pi/3*I));+ ]( f' G3 X& L) u0 z4 Y" y
2 d; M' F& o9 V4 g, I- \2 b8 E
2.1.3 数的进制转换. V) d$ Y. o6 j$ s
数的进制是数值运算中的一个重要问题. 而在Maple中数的进制转换非常容易, 使用convert命令即可. ) y; ]# ?* X7 M$ f! {3 N命令格式: convert(expr, form, arg3, ...); a% U- s1 {! I3 `3 g! u u
其中, expr为任意表达式, form为一名称, arg3, ... 可选项. 0 ~2 `% L {9 r/ W3 ]6 S" ]
下面对其中常用数的转换予以概述. 而convert的其它功能将在后叙章节详述. " e+ N. @5 K. o" M% `* p
1)基数之间的转换8 T5 n2 g- R! A( c( W% t W4 u2 Z# {
命令格式: 7 \# ] a( {8 L+ x8 T. X
convert(n, base, beta); #将基数为10的数n转换为基数为beta的数- D( x* Y5 _+ B2 A: X" p: w' e' L
convert(n, base, alpha, beta);#将基数为alpha的数字n转换为基数为beta的数 3 k7 a3 G4 E- X1 P3 Q7 U> convert(2003,base,7); #将10进制数2002转换为7进制数, 结果为: (5561)7* a7 U8 h l) G& F$ f
3 A5 K3 c6 B8 G
> convert([1,6,5,5],base,7,10); #将7进制数5561转换为10进制数 5 I6 H8 n) Z4 m7 F5 d+ \/ ` 6 D& t5 X; U2 w( Y
> convert(2002,base,60); #将十进制数2002转换为60进制数, 得33(分钟)22(秒)/ y, z. L! P0 V ^4 s
6 |+ G3 |# C$ x 2)转换为二进制形式# b4 ~* V+ k( ^
命令格式: convert(n, binary);: u" V7 ?" O3 l- `0 o- J
其功能是将十进制数n转换为2进制数. 值得注意的是, 数可以是正的, 也可以是负的, 或者是整数, 或者是浮点数, 是浮点数时情况较为复杂. : F$ `6 Q4 n0 t- j
> convert(2002,binary); - c$ p$ B1 d6 I z7 @) q 5 c3 q! H) ?6 r! P
> convert(-1999,binary); + \" X7 W% K( C7 {: ] + e3 H/ h0 }) T3 W> convert(1999.7,binary); 8 Q/ c: y# p2 V% k$ D2 J
6 t7 I* q1 B& W. J) p
3)转换为十进制形式 " L( ~/ Q2 S- t% ~; y* P# b, G8 f其它数值转换为十进制的命令格式为: ( W4 m' f) d0 i
convert(n, decimal, binary); #将一个2进制数n转换为10进制数 ' X! i4 R7 B! a3 Z0 i. C6 ^ convert(n, decimal, octal); #将一个8进制数n转换为10进制数2 a, {. V( h' g1 k' o- P! O# T
convert(string, decimal, hex); #将一个16进制字符串string转换为10进制数 N, n. q5 _3 m* ]> convert(11111010010, decimal, binary); $ y5 Y% G( g1 U2 ~
$ a$ C1 [( V7 {$ o
> convert(-1234, decimal, octal); 2 s8 h; R: J( ^6 f4 J0 q- z
8 k5 |4 _2 U+ v7 o! G! x5 k- T6 W
> convert("2A.C", decimal, hex); 3 K' Q: X" \% k / l. T0 C# y/ _4) 转换为16进制数" r; @9 Z0 d/ U
将自然数n转换为16进制数的命令格式为: convert(n, hex); . h# G7 f! w2 T" A# ?2 S> convert(2002,hex); convert(1999,hex); : E( c8 g3 T* t. j! s% N6 u; H & s/ @# R7 \. |6 f6 J8 Z M% W4 ]& z, Y+ n# u, P' [1 K
5)转换为浮点数 7 {! w/ Y4 \, o3 K命令格式: convert(expr, float); 9 |9 ~( n' R" h* n( k1 k3 @注意, convert/float命令将任意表达式转换为精度为全局变量Digits的浮点数, 且仅是对evalf的调用. 1 S% }! H1 m- E7 S2 ^* c: z! k
> convert(1999/2002,float);: b) e6 ]& p8 O. `
' p5 L1 O0 _8 L- G
> convert(Pi,float);2 {- e; }$ s! a' @6 i
* e$ b2 x5 E% i# E
2.2 初等数学 $ G6 V' Y6 u; C; Y/ R 初等数学是数学的基础之一, 也是数学中最有魅力的一部分内容. 通过下面的内容我们可以领略Maple对初等数学的驾驭能力, 也可以通过这些实验对Maple产生一些感性认识. $ M" r0 t2 R5 {2 l5 t- }2.2.1 常用函数 ( L7 M7 b9 E! m" o7 [4 h8 P, q作为一个数学工具, 基本的数学函数是必不可少的, Maple中的数学函数很多, 现例举一二如下: , D8 Z0 F) A1 ~2 k, b' ^指数函数: exp5 x- L( ~' l$ Z: i- @( F8 T
一般对数: log[a] : C6 q6 _# y0 @& o) e自然函数: ln . Z( x. L; V' k# W _8 S% T常用对数: log10& g6 K( d$ g# z# F
平方根: sqrt 4 ]) _7 N2 X/ V2 V: V, U' m绝对值: abs0 g# e9 a9 D# F/ o! V, n% s' p0 [+ M
三角函数: sin、cos、tan、sec、csc、cot 7 A) \4 `' _0 v, @) t6 M反三角函数: arcsin、arccos、arctan、arcsec、arccsc、arccot; d9 ^0 S% N, p+ z6 w* s" h
双曲函数: sinh、cosh、tanh、sech、csch、coth5 W, t/ L% w8 N& q G
反双曲函数: arcsinh、arccosh、arctanh、arcsech、arccsch、arccoth8 W2 G0 `3 E9 |
贝赛尔函数: BesselI、BesselJ、BesselK、BesselY 1 D E2 ~2 E% a) mGamma函数: GAMMA6 T" V* f; |9 ]/ e
误差函数: erf* p- i( m0 ?9 ]& R/ N' O
函数是数学研究与应用的基础之一, 现通过一些实验说明Maple中的函数的用法及功能. ) u5 ~, d( s. @* b+ ?! r3 u1) 确定乘积和不确定乘积$ k4 \- d- N' o3 z
命令格式: product(f,k); 6 l: i4 W. s9 g$ N8 H# r4 gproduct(f,k=m..n); 7 q' {: @- O0 t+ S4 s
product(f,k=alpha); ' }5 Z- s( ~, s9 ]3 j
product(f,k=expr);. b* J# d' u& f1 {' \$ e
其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf, expr—包含k的任意表达式. - s' o6 v" f% f* b8 ^3 J
> product(k^2,k=1..10); #计算 关于1..10的连乘 h' q1 Z' X! E: o7 a3 H & g0 t3 o; G- F8 k> product(k^2,k); #计算 的不确定乘积4 i: Q* J; X9 x# b
! R/ ?: v; G W. M> product(a[k],k=0..5); #计算ai(i=0..5)的连乘 4 S& e) j. y1 g ; X5 F: W8 @3 J, E+ w4 j> product(a[k],k=0..n); #计算ai(i=0..n)的连乘7 h. M- x/ w$ P
7 }& f8 J% p' `. w @! _8 |> Product(n+k,k=0..m)=product(n+k,k=0..m); #计算(n+k)的连乘, 并写出其惰性表达式# m" F' C& l& x$ q4 \/ M4 B
$ L1 P' @# J1 K" |' g> product(k,k=RootOf(x^3-2)); #计算 的三个根的乘积 ( {. A) M6 Z# v6 B. ?8 S 5 d$ p* [5 {2 `
product命令计算符号乘积, 常常用来计算一个公式的确实或不确实的乘积. 如果这个公式不能求值计算, Maple返回 函数. 典型的例子是: ' y$ O |& C. |+ t L: M2 J> product(x+k,k=0..n-1); & [1 j& I/ B( I ]) F/ t* O % w( Q( q2 N. [" V, W8 ]& K
如果求一个有限序列值的乘积而不是计算一个公式, 则用mul命令. 如: 0 c& u& T$ p! f( K: y; ^# I( j3 b
> mul(x+k,k=0..3);/ a, J7 j# V" a' \$ M
( T& t( x" n+ J2)指数函数 6 i+ |/ g" B0 ^9 s1 E& Y计算指数函数exp关于x的表达式的命令格式为: exp(x); , Y% B% y6 v! H& w& G: v4 {. V
> exp(1); % o7 }+ ?0 k" K3 M3 M. P * {% ]8 {" C; N8 v. k6 c2 l> evalf(%); j0 {; p0 }* I2 D' E " W. C. y5 L: i7 g> exp(1.29+2*I);) d+ l* q. j: X9 D* X+ }. e
5 M; u# r/ w. h3 a/ d
> evalc(exp(x+I*y));2 U+ F- z, q! r( `( m1 s4 ^7 E
& j a$ j9 J1 m+ K: w3)确定求和与不确定求和sum & V0 d$ ?; I2 a* x3 e" K$ s命令格式: sum(f,k); , M* M& {2 b2 v! `8 W" X3 Y) ~: W+ S
sum(f,k=m..n); 6 ?% b, I) k: T( ?2 y
sum(f,k=alpha); ' X0 N' D6 r/ ^2 l( Z \
sum(f,k=expr);0 v1 T" H9 G+ h: Y* n4 I: s6 b
其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf, expr—不含k的表达式. 0 o. Z4 W+ U j! c7 _# U
> Sum(k^2,k=1..n)=sum(k^2,k=1..n);8 J1 V* M/ \8 t4 p o* ]+ v
1 w+ W: ~2 C1 Y3 q! f# [5 I
> Sum(k^3,k=1..n)=sum(k^3,k=1..n); , ]% s7 J, v$ V2 b 2 h8 C8 A) E8 N: J. `5 L u6 x
> Sum(k^4,k=1..n)=sum(k^4,k=1..n); 7 y" `; y9 j) N0 F2 ] 3 L+ f# [4 b- ^% X
> Sum(1/k!,k=0..infinity)=sum(1/k!,k=0..infinity); . O! \# W* a. [ u0 U - Y9 b' R7 b6 ~% _2 ?+ |
> sum(a[k]*x[k],k=0..n); 9 S) C; q' R' G3 w2 l) g' G) Z E $ j# {5 C9 x5 t1 M> Sum(k/(k+1),k)=sum(k/(k+1),k); . P) K! K" I! L - q B9 D: C- e( t8 M; R# y> sum(k/(k+1),k=RootOf(x^2-3)); 3 X1 w% j8 K& b7 f( `# U5 L; x 2 X; |. Y3 I/ A( {: @sum函数可计算一个公式的确定和与不确定和, 如果Maple无法计算封闭形式, 则返回未求值的结果. 值得注意的是, 在sum命令中将f和k用单引号括起来, 可避免过早求值. 这一点在某些情况下是必需的. 4 B7 W# Q) x0 ^9 }. d
> Sum('k','k'=0..n)=sum('k','k'=0..n);' ]2 J+ Z$ C3 v- j9 h/ K
9 R5 n8 C3 l9 b' ^8 [7 c
如果计算一个有限序列的值, 而不是计算一个公式, 可用add命令. 如: ' u$ E% ~ G5 _> add(k,k=1..100); , }& {% j5 w+ i' B% W3 d0 T , C, W) u5 x+ h7 h: ]* l9 o7 h
尽管sum命令常常用于计算显式求和, 但在程序设计中计算一个显式和应该使用add命令. * v+ t7 {2 M; }+ p, ?2 \
另外, sum知道各种求和方法, 并会对各类发散的求和给出正确的结果, 如果要将求和限制为收敛求和, 就必须检查显式的收敛性. + e7 x# y. p3 ~; s! x _% N3)三角函数/双曲函数3 {0 V) n5 Q8 c, V8 ^
命令格式: sin(x); cos(x); tan(x); cot(x); sec(x); csc(x);# G: z' g0 R1 H' w
sinh(x); cosh(x); tanh(x); coth(x); sech(x); csch(x); # t) E- s q+ U. F+ H其中, x为任意表达式. 6 n7 Q/ z# O& e9 i. {值得注意的是三角函数/双曲函数的参数以弧度为单位. Maple提供了利用常见三角函数/双曲函数恒等式进行化简和展开的程序, 也有将其转化为其它函数的命令convert.2 o- Z) i* q& w* O1 P
> Sin(Pi)=sin(Pi); 9 ?8 ]; C- P5 i4 o6 O / C, n& K) X/ c> coth(1.9+2.1*I); - p$ J# _6 R+ Q! r % R! a) e: E" @$ ^1 I> expand(sin(x+y)); #展开表达式 ' \# P2 t0 F' [+ ?7 v3 S 0 }' [! L. A0 Q! v1 X> combine(%); #合并表达式$ S# I! }/ K2 ?) Q" E# i$ n9 X
/ ~; w+ X5 c7 v `> convert(sin(7*Pi/60),'radical');# f B2 V/ S" ?/ p$ ]3 o7 Y