MAPLE 教程
第一章 Maple 基础———————————————————————————1
第二章 微积分运算——————————————————————————34
第三章 线性代数———————————————————————————67
第四章 方程求解———————————————————————————100
第五章 Maple 图形绘制————————————————————————122
第六章 Maple 程序设计————————————————————————137
第一章 Maple 基础
1 初识计算机代数系统 Maple
1.1 Maple 简说
1980 年 9 月, 加拿大 Waterloo 大学的符号计算机研究小组成立, 开始了符号计算在计算机
上实现的研究项目, 数学软件 Maple 是这个项目的产品. 目前, 这仍是一个正在研究的项目.
Maple 的第一个商业版本是 1985 年出版的. 随后几经更新, 到 1992 年, Windows 系统下的
Maple 2 面世后, Maple 被广泛地使用, 得到越来越多的用户. 特别是 1994 年, Maple 3 出版后, 兴
起了 Maple 热. 1996 年初, Maple 4 问世, 1998 年初, Maple 5 正式发行. 目前广泛流行的是 Maple 7
以及 2002 年 5 月面市的 Maple 8.
Maple 是一个具有强大符号运算能力、数值计算能力、图形处理能力的交互式计算机代数
系统(Computer Algebra System). 它可以借助键盘和显示器代替原来的笔和纸进行各种科学计
算、数学推理、猜想的证明以及智能化文字处理.
Maple 这个超强数学工具不仅适合数学家、物理学家、工程师, 还适合化学家、生物学家和
社会学家, 总之, 它适合于所有需要科学计算的人.
1.2 Maple 结构
Maple 软件主要由三个部分组成: 用户界面(Iris)、代数运算器(Kernel)、外部函数库
(External library). 用户界面和代数运算器是用 C 语言写成的, 只占整个软件的一小部分, 当系
统启动时, 即被装入, 主要负责输入命令和算式的初步处理、显示结果、函数图象的显示等. 代
数运算器负责输入的编译、基本的代数运算(如有理数运算、初等代数运算等)以及内存的管理.
Maple 的大部分数学函数和过程是用 Maple 自身的语言写成的, 存于外部函数库中. 当一个函数
被调用时, 在多数情况下, Maple 会自动将该函数的过程调入内存, 一些不常用的函数才需要用
户自己调入, 如线性代数包、统计包等, 这使得 Maple 在资源的利用上具有很大的优势, 只有最
有用的东西才留驻内存, 这保证了 Maple 可以在较小内存的计算机上正常运行. 用户可以查看
Maple 的非内存函数的源程序, 也可以将自己编的函数、过程加到 Maple 的程序库中, 或建立自
己的函数库.
1.3 Maple 输入输出方式
为了满足不同用户的需要, Maple可以更换输入输出格式: 从菜单“Options | Input Display和
Out Display下可以选择所需的输入输出格式.
Maple 7 有 2 种输入方式: Maple 语言(Maple Notation)和标准数学记法(Standard Math
- 1 -
Notation). Maple 语言是一种结构良好、方便实用的内建高级语言, 它的语法和 Pascal 或 C 有一
定程度的相似, 但有很大差别. 它支持多种数据操作命令, 如函数、序列、集合、列表、数组、
表, 还包含许多数据操作命令, 如类型检验、选择、组合等. 标准数学记法就是我们常用的数学
语言.
启动 Maple, 会出现新建文档中的“[>”提示符, 这是 Maple 中可执行块的标志, 在“>”后
即可输入命令, 结束用“;”(显示输出结果)或者“:”(不显示输出结果). 但是, 值得注意的是, 并
不是说 Maple 的每一行只能执行一句命令, 而是在一个完整的可执行块中健入回车之后, Maple
会执行当前执行块中所有命令(可以是若干条命令或者是一段程序). 如果要输入的命令很长, 不
能在一行输完, 可以换行输入, 此时换行命令用“shift+Enter”组合键, 而在最后一行加入结束
标志“;”或“:”, 也可在非末行尾加符号“\”完成.
Maple 7 有 4 种输出方式: Maple 语言、格式化文本(Character Notation)、固定格式记法(Typeset
Notation)、标准数学记法(Standard Math Notation). 通常采用标准数学记法.
Maple 会认识一些输入的变量名称, 如希腊字母等. 为了使用方便, 现将希腊字母表罗列如
下,输入时只需录入相应的英文,要输入大写希腊字母, 只需把英文首字母大写:
α β
γ
δ
ε
ζ η
θ
ι
κ
λ
μ
alpha beta
gamma
delta epsilon
ν ξ
ο
π
zeta
theta
ρ σ τ υ
eta
kappa
iota
lambda mu
φ χ ψ ω
nu
xi
pi
omicron
omega
有时候为了美观或特殊需要,可以采用 Maple 中的函数或程序设计方式控制其输出方式,
upsilon
sigma
rho
psi
phi
chi
tau
如下例:
> for i to 10 do
printf("i=%+2d and i^(1/2)=%+6.3f", i, eval(sqrt(i)));
od;
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
+2d 的含义是带符号的十进位整数,域宽为 2. 显然,这种输出方式不是我们想要的,为了
得到更美观的输出效果,在语句中加入换行控制符“\n”即可:
> for i to 10 do
printf("i=%+2d and i^(1/2)=%+6.3f\n", i, eval(sqrt(i)));
od;
i=+1 and i^(1/2)=+1.000
i=+2 and i^(1/2)=+1.414
i=+3 and i^(1/2)=+1.732
- 2 -
i=+4 and i^(1/2)=+2.000
i=+5 and i^(1/2)=+2.236
i=+6 and i^(1/2)=+2.449
i=+7 and i^(1/2)=+2.646
i=+8 and i^(1/2)=+2.828
i=+9 and i^(1/2)=+3.000
i=+10 and i^(1/2)=+3.162
再看下例:将输入的两个数字用特殊形式打印:
> niceP:=proc(x,y)
printf("value of x=%6.4f, value of y=%6.4f",x,y);
end proc;
niceP
proc (
:=
(
)
printf
,x y
> niceP(2.4,2002.204);
value of x=2.4000, value of y=2002.2040
1.4 Maple 联机帮助
"value of x=%6.4f, value of y=%6.4f"
,
x y
,
)
end proc
学会寻求联机帮助是掌握一个软件的钥匙. Maple有一个非常好的联机帮助系统, 它包含了
90%以上命令的使用说明. 要了解Maple的功能可用菜单帮助“Help”, 它给出Maple内容的浏览
表, 这是一种树结构的目录表, 跟有…的词条说明其后还有子目录, 点击这样的词条后子目录就
会出现( 也可以用Tab 键和up, down选定). 可以从底栏中看到函数命令全称, 例如, 我们选
graphics…, 出现该条的子目录, 从中选 2D…, 再选plot就可得到作函数图象的命令plot的完整帮
助信息. 一般的帮助信息都有实例, 我们可以将实例中的命令部分拷贝到作业面进行计算、演示,
由此可了解该命令的作用.
在使用过程中, 如果对一个命令把握不准, 可用键盘命令对某个命令进行查询. 例如, 在命
令区输入命令“?plot”(或help(plot);), 然后回车将给出plot命令的帮助信息, 或者将鼠标放在选
定的要查询的命令的任何位置再点击菜单中的“Help”即可.
2 Maple 的基本运算
2.1 数值计算问题
算术是数学中最古老、最基础和最初等的一个分支, 它研究数的性质及其运算, 主要包括自
然数、分数、小数的性质以及他们的加、减、乘、除四则运算. 在应用 Maple 做算术运算时, 只
需将 Maple 当作一个“计算器”使用, 所不同的是命令结束时需加“;”或“:”.
在 Maple 中, 主要的算术运算符有“+”(加)、“–”(减)、“*”(乘)、“/”(除)以及“^”(乘方
或幂,或记为**), 算术运算符与数字或字母一起组成任意表达式, 但其中“+”、“*”是最基本
的运算, 其余运算均可归诸于求和或乘积形式. 算术表达式运算的次序为: 从左到右, 圆括号最
先, 幂运算优先, 其次是乘除,最后是加减. 值得注意的是, “^”的表达式只能有两个操作数, 换
言之,
是错误的, 而“+”或“*”的任意表达式可以有两个或者两个以上的操作数.
cba
^^
Maple 有能力精确计算任意位的整数、有理数或者实数、复数的四则运算, 以及模算术、硬
- 3 -
件浮点数和任意精度的浮点数甚至于矩阵的计算等等. 总之, Maple 可以进行任意数值计算.
但是, 任何软件或程序毕竟只是人们进行科学研究的一种必要的辅助, 即便它有很多优点,
但也有它的局限性, 为了客观地认识数学软件、认识 Maple, 下面通过两个简单例子予以说明.
> 3!!!;
第一个简单的数值计算实例想说明 Maple 数值计算的答案的正确性:
2601218943565795100204903227081043611191521875016945785727541837850835631156947382240678577958130457082619920575892
2472595366415651620520158737919845877408325291052446903888118841237643411919510455053466586162432719401971139098455
3672727853709934562985558671936977407000370043078375899742067678401696720784628062922903210716166986726054898844551
4257193985499448939594496064045132362140265986193073249369770477606067680670176491669403034819961881455625195592566
9188308255149429475965372748456246288242345265977897377408964665539924359287862125159674832209760295056966999272846
7056374713753301924831358707612541268341586012944756601145542074958995256354306828863463108496565068277155299625679
0845235702552186222358130016700834523443236821935793184701956510729781804354173890560727428048583995919729021726612
2912984205160675790362323376994539641914751755675576953922338030568253085999774416757843528159134613403946049012695
4202883834710136373382448450666009334848444071193129253769465735433737572477223018153403264717753198453734147867432
7048457983786618703257405938924215709695994630557521063203263493209220738320923356309923267504401701760572026010829
2880423356066430898887102973807975780130560495763428386830571906622052911748225105366977566030295740433879834715185
5260280533386635713910104633641976909739743228599421983704697910995630338960467588986579571117656667003915674815311
5943980043625399399731203066490601325311304719028898491856203766669164468791125249193754425845895000311561682974304
6411425380748972817233759553806617198014046779356147936352662656833395097600000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000
上述运算结果在 IBM PC 机(1G, 128M)上计算只需要 0.01 秒, 得到如此复杂的结果(1747 位),
一个自然的问题是: 答案正确吗?
为了回答这个问题, 我们借助于数值分析方法, 由 Stiring 公式
n
!
≈ π
2
nn
⋅
n
⋅
exp(
−
n
)
可得:
.2!720
≈
60091
×
1746
10
, 前三位数字与 Maple 输出结果相同, 且两者结果均为 1747 位.
另外, 在 720!的计算中, 5 的因子的个数为:
720
5
⎡
⎢⎣
⎤
⎡+⎥⎦
⎢⎣
720
5
2
⎤
⎡+⎥⎦
⎢⎣
720
5
3
⎤
⎡+⎥⎦
⎢⎣
720
5
4
⎤
=⎥⎦
178
这些 5 与足够多的 2 相乘将得到 178 个 0, 而 Maple 的输出结果中最后 178 位数为零. 由此, 可
以相信 Maple 结果的正确性.
另一个例子则想说明 Maple 计算的局限性:
(
−
8
3/1
)
(
?
−
8
=
6/2
)
=
?
Maple 在处理问题时, 为了避免失根, 从不求算术式的近似值, 分数则化简为既约分数. 因
此, 在 Maple 中很容易得到:
(
−
8
3/1
)
(
8
−=
) 6/2
显然这是错误的. 这一点可以从代数的角度予以分析.
(
−
不妨设
)
3/18
-2 是其实数结果.
x=
, 则
=+x
3
8
0
, 即
(
x
+
)(2
x
2
−
2
x
+
)4
=
0
, 显然
(
) 3/18−
有 3 个结果,
- 4 -
另一方面, 设
(
−
)
6/28
x=
, 则
−+x
6
)8(
2
=
0
, 即:
3
(
x
+
)(8
x
3
−
)8
=
(
x
+
)(2
x
−
)(2
x
2
−
2
x
+
)(4
x
2
+
2
x
+
)4
=
0
显然(
6/28−
) 有 6 个结果, -2、2 是其实数结果.
这个简单的例子说明了Maple在数值计算方面绝对不是万能的, 其计算结果也不是完全正
确的, 但是, 通过更多的实验可以发现: Maple只可能丢失部分结果, 而不会增加或很少给出完
1.000000000 1.732050807I ). 这一点提醒
全错误的结果(如上例中Maple的浮点数结果皆为
我们, 在利用Maple或其他任何数学软件或应用程序进行科学计算时, 必须运用相关数学基础知
识校验结果的正确性.
+
尽管Maple存在缺陷(实际上, 任何一个数学软件或程序都存在缺陷), 但无数的事实说明
Maple仍然不失为一个具有强大科学计算功能的计算机代数系统. 事实上, Maple同其他数学软
件或程序一样只是科学计算的一个辅助工具, 数学基础才是数学科学中最重要的.
2.1.1 有理数运算
作为一个符号代数系统, Maple 可以绝对避免算术运算的舍入误差. 与计算器不同, Maple 从
来不自作主张把算术式近似成浮点数, 而只是把两个有公因数的整数的商作化简处理. 如果要
求出两个整数运算的近似值时, 只需在任意一个整数后加“.”(或“.0”), 或者利用“evalf”命
令把表达式转换成浮点形式, 默认浮点数位是 10 (即: Digits:=10, 据此可任意改变浮点数位, 如
Digits:=20).
> 12!+(7*8^2)-12345/125;
> 10!; 100*100+1000+10+1; (100+100)*100-9;
> big_number:=3^(3^3);
> length(%);
big_number
:=
7625597484987
13
上述实验中使用了一个变量“big_number”并用“:=”对其赋值, 与 Pascal 语言一样为一个
变量赋值用的是“:=”. 而另一个函数“length”作用在整数上时是整数的十进制位数即数字的
长度. “%”是一个非常有用的简写形式, 表示最后一次执行结果, 在本例中是上一行输出结果.
再看下面数值计算例子:
- 5 -
> 123456789/987654321;
> evalf(%);
13717421
109739369
.1249999989
11975048731
25
3628800
11011
19991
1)整数的余(irem)/商(iquo)
命令格式:
irem(m,n); #求 m 除以 n 的余数
irem(m,n,'q'); #求m除以n的余数, 并将商赋给q
iquo(m,n); #求 m 除以 n 的商数
iquo(m,n,'r'); #求m除以n的商数, 并将余数赋给r
其中, m, n 是整数或整数函数, 也可以是代数值, 此时, irem 保留为未求值.
> irem(2002,101,'q'); # 求 2002 除以 101 的余数, 将商赋给q
> iquo(2002,101,'r'); # 求 2002 除以 101 的商, 将余数赋给r
> q; #显示q
> r; #显示r
> irem(x,3);
83
19
19
83
irem ,x 3
)
(
2)素数判别(isprime)
素数判别一直是初等数论的一个难点, 也是整数分解问题的基础. Maple 提供的isprime 命令
可以判定一个整数 n 是否为素数. 命令格式: isprime(n);
如果判定 n 可分解, 则返回 false, 如果返回 true, 则 n“很可能”是素数.
> isprime(2^(2^4)+1);
> isprime(2^(2^5)+1);
true
false
上述两个例子是一个有趣的数论难题。形如
nF
=
n
22 +
1
的数称为Fermat数, 其中的素数称
为Fermat素数, 显然, F0=3、F1=5、F2=17、F3=257、F4=65537 都是素数. Fermat曾经猜想所有的
Fn都是素数, 但是Euler在 1732 年证明了F5=641•6700417 不是素数. 目前, 这仍是一个未解决的
问题, 人们不知道还有没有Fermat素数, 更不知道这样的素数是否有无穷多.
3) 确定第 i 个素数(ithprime)
若记第 1 个素数为 2,判断第 i 个素数的命令格式: ithprime(i);
> ithprime(2002);
> ithprime(10000);
17401
104729
4) 确定下一个较大(nextprime)/较小(prevprime)素数
当 n 为整数时,判断比 n 稍大或稍小的素数的命令格式为:
nextprime(n);
prevprime(n);
> nextprime(2002);
- 6 -
> prevprime(2002);
2003
1999
5) 一组数的最大值(max)/最小值(min)
命令格式: max(x1,x2,…,xn); #求x1,x2,…,xn中的最大值
min(x1,x2,…,xn); #求x1,x2,…,xn中的最小值
> max(1/5,ln(3),9/17,-infinity);
(
> min(x+1,x+2,y);
)
ln 3
min ,y
(
+ x
)
1
6)模运算(mod/modp/mods)
命令格式: e mod m; # 表达式 e 对 m 的整数的模运算
modp(e,m); # e对正数 m 的模运算
mods(e,m); # e对 m 负对称数(即 -m)的模运算
`mod`(e,m); # 表达式e对m的整数的模运算, 与e mod m等价
值得注意的是, 要计算 i^n mod m(其中 i 是一整数), 使用这种“明显的”语法是不必要的, 因
为在计算模 m 之前, 指数要先在整数(可能导致一个非常大的整数)上计算. 更适合的是使用惰性
运算符“&^”即: i &^n mod m, 此时, 指数运算将由 mod 运算符智能地处理. 另一方面, mod 运
算符的左面优先比其他运算符低, 而右面优先高于+和-, 但低于*和/.
> 2002 mod 101;
> modp(2002,101);
> mods(49,100);
83
83
> mods(51,100);
49
> 2^101 mod 2002; # 同 2 &^101 mod 2002;
-49
1124
7)随机数生成器(rand)
命令格式:
rand( ); #随机返回一个 12 位数字的非负整数
rand(a..b); #调用 rand(a..b)返回一个程序, 它在调用时生成一个在范围[a, b]内的随机数
> rand();
> myproc:=rand(1..2002):
> myproc();
> myproc();
427419669081
1916
- 7 -