* e1 k2 f" i' {# V" n1 x* w第一章 Maple基础' s a* Q. o" A d+ n" g
% B3 q' O1 {" R, j& g, i# w5 N
1 初识计算机代数系统Maple 6 y5 h7 R$ J) [. X4 i1.1 Maple简说( f5 }, j0 F& ]4 S2 I
1980年9月, 加拿大Waterloo大学的符号计算机研究小组成立, 开始了符号计算在计算机上实现的研究项目, 数学软件Maple是这个项目的产品. 目前, 这仍是一个正在研究的项目. 3 [2 N+ B" o. @8 XMaple的第一个商业版本是1985年出版的. 随后几经更新, 到1992年, Windows系统下的Maple 2面世后, Maple被广泛地使用, 得到越来越多的用户. 特别是1994年, Maple 3出版后, 兴起了Maple热. 1996年初, Maple 4问世, 1998年初, Maple 5正式发行. 目前广泛流行的是Maple 7以及2002年5月面市的Maple 8. 2 W( P" v* u* n! j7 Z% O; kMaple是一个具有强大符号运算能力、数值计算能力、图形处理能力的交互式计算机代数系统(Computer Algebra System). 它可以借助键盘和显示器代替原来的笔和纸进行各种科学计算、数学推理、猜想的证明以及智能化文字处理. + i' m4 t* u$ g0 @+ e4 k
Maple这个超强数学工具不仅适合数学家、物理学家、工程师, 还适合化学家、生物学家和社会学家, 总之, 它适合于所有需要科学计算的人. ) W- ?; l; H' u( h6 ^% ~ G
1.2 Maple结构 ( Y1 R. a" q$ x+ DMaple软件主要由三个部分组成: 用户界面(Iris)、代数运算器(Kernel)、外部函数库(External library). 用户界面和代数运算器是用C语言写成的, 只占整个软件的一小部分, 当系统启动时, 即被装入, 主要负责输入命令和算式的初步处理、显示结果、函数图象的显示等. 代数运算器负责输入的编译、基本的代数运算(如有理数运算、初等代数运算等)以及内存的管理. Maple的大部分数学函数和过程是用Maple自身的语言写成的, 存于外部函数库中. 当一个函数被调用时, 在多数情况下, Maple会自动将该函数的过程调入内存, 一些不常用的函数才需要用户自己调入, 如线性代数包、统计包等, 这使得Maple在资源的利用上具有很大的优势, 只有最有用的东西才留驻内存, 这保证了Maple可以在较小内存的计算机上正常运行. 用户可以查看Maple的非内存函数的源程序, 也可以将自己编的函数、过程加到Maple的程序库中, 或建立自己的函数库. 8 ^- w' r5 G7 s0 ]0 ^7 ~ g
1.3 Maple输入输出方式 $ C+ W0 E/ Q, X+ k0 o为了满足不同用户的需要, Maple可以更换输入输出格式: 从菜单“Options | Input Display和Out Display下可以选择所需的输入输出格式. 7 [0 _1 C) L [# C P4 t
Maple 7有2种输入方式: Maple语言(Maple Notation)和标准数学记法(Standard Math Notation). Maple语言是一种结构良好、方便实用的内建高级语言, 它的语法和Pascal或C有一定程度的相似, 但有很大差别. 它支持多种数据操作命令, 如函数、序列、集合、列表、数组、表, 还包含许多数据操作命令, 如类型检验、选择、组合等. 标准数学记法就是我们常用的数学语言. T w7 K/ D! g q" J
启动Maple, 会出现新建文档中的“[>”提示符, 这是Maple中可执行块的标志, 在“>”后即可输入命令, 结束用“;”(显示输出结果)或者“:”(不显示输出结果). 但是, 值得注意的是, 并不是说Maple的每一行只能执行一句命令, 而是在一个完整的可执行块中健入回车之后, Maple会执行当前执行块中所有命令(可以是若干条命令或者是一段程序). 如果要输入的命令很长, 不能在一行输完, 可以换行输入, 此时换行命令用“shift+Enter”组合键, 而在最后一行加入结束标志“;”或“:”, 也可在非末行尾加符号“\”完成. 7 l8 Q/ N F0 `" Q( lMaple 7有4种输出方式: Maple语言、格式化文本(Character Notation)、固定格式记法(Typeset Notation)、标准数学记法(Standard Math Notation). 通常采用标准数学记法. ' J7 {% b H. e8 h# U8 [
Maple会认识一些输入的变量名称, 如希腊字母等. 为了使用方便, 现将希腊字母表罗列如下,输入时只需录入相应的英文,要输入大写希腊字母, 只需把英文首字母大写: - j8 \+ l% K- u$ p8 j4 m/ A
$ M7 K8 W2 ?1 G# W5 i% @, g
9 s/ b; }8 |* a/ U+ U( I . K' ]9 j) M7 p6 a, x
4 n7 P+ C4 O% S
! _1 r' M9 c' Y2 R% q0 R9 o4 j G
+ p7 J R0 b- \4 ~6 a 6 e7 j8 G" s6 ~- [+ w: @+ ~ 4 ?3 m, J& W) d; K; y7 h8 N$ a 0 Z& f: }$ y% M1 r3 ^ 0 `2 Z [7 c$ m5 F5 c# q 6 H! E* N) |, j# l/ [: n 6 s- X2 X9 ?' I5 j4 {( t# i
y3 O' W; ?" T5 @4 A
alpha beta gamma delta epsilon zeta eta theta iota kappa lambda mu1 ^3 E O' Z3 {$ f. s4 s. w! }
- ~( p3 k9 K2 x" d! g
- Z: k* z- n4 ?
, @( W& h( w: t- ]
% \2 L! d* \9 S1 k) Y# y: }$ Z! @ # T# @8 t, g0 m9 e& `
0 v, Q; _! O8 e) D! n6 Q) C* R
& c) n8 g# m8 b N& R- L
5 y; U3 x( u# n4 |
- R! |) ]" B6 u. m7 |6 E, b9 v
; W; t+ ]6 p, Y( {3 H" x7 @
( F" ]3 e7 b5 H4 g. j C! l
2 J5 x2 C* Z& G8 [4 A- R$ ]1 {6 X' P
nu xi omicron pi rho sigma tau upsilon phi chi psi omega* b4 Y4 c6 l B6 W6 }
有时候为了美观或特殊需要,可以采用Maple中的函数或程序设计方式控制其输出方式,如下例:$ S* o! F, O0 w: ]" ?' y2 X
> for i to 10 do ) K: X% M. g+ I; Wprintf("i=%+2d and i^(1/2)=%+6.3f", i, eval(sqrt(i)));2 g8 p: u1 d% V8 x
od; & @$ h* t4 f$ `i=+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 / I2 k' A" W7 N$ V/ Z" N+2d的含义是带符号的十进位整数,域宽为2. 显然,这种输出方式不是我们想要的,为了得到更美观的输出效果,在语句中加入换行控制符“\n”即可: . T+ K' Y' g8 U7 l> for i to 10 do 1 j/ D, @% G* @( Y0 Z4 i4 \
printf("i=%+2d and i^(1/2)=%+6.3f\n", i, eval(sqrt(i))); ) j( ~) N9 D% \$ _+ u) [od; 9 i1 e4 _+ ]7 n. z _: pi=+1 and i^(1/2)=+1.000 " o7 t: E+ u' }5 B T& Y% C6 L8 h) Zi=+2 and i^(1/2)=+1.414" F4 a$ t# e2 {1 H) m" n1 O, d
i=+3 and i^(1/2)=+1.732( _1 N/ a m) S. D+ }. |2 H
i=+4 and i^(1/2)=+2.000$ @% ^5 F$ y# `1 Q x
i=+5 and i^(1/2)=+2.236 $ Y. E% \, z" z) {, U4 N1 b: Li=+6 and i^(1/2)=+2.449 5 C- w: B. U3 b7 Yi=+7 and i^(1/2)=+2.646 % _) [8 t4 b9 Ji=+8 and i^(1/2)=+2.828% n9 n# a5 D$ t6 ?: I$ Q
i=+9 and i^(1/2)=+3.000# Q* M6 A! Z$ o2 U0 ]
i=+10 and i^(1/2)=+3.162 ' [* @1 P3 K: A: e) W f: [: b T再看下例:将输入的两个数字用特殊形式打印: ( S6 j4 I% Y8 y) N, v( o( p5 K> niceP:=proc(x,y) 9 R9 p2 b9 |2 e6 ~$ |) [- O7 z: xprintf("value of x=%6.4f, value of y=%6.4f",x,y); # s( p9 {3 t( y$ v2 x" @% T" O2 Tend proc;; }; p1 ~( q; W' J% b
5 S1 N; u* Q) n> restart: - y, [2 D' O O$ Rmap2(f,a1,x1+x2+x3+x4,a2,a3,a4);7 Q/ T3 q4 E u6 c/ v0 H0 B
! z* _7 b& P' n" c
> map2(max,k,[a,b,c,d]); ( |! I% v# C' C& |3 e% M1 a