QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 17350|回复: 7
打印 上一主题 下一主题

maple基础

[复制链接]
字体大小: 正常 放大

1

主题

5

听众

4

积分

升级  80%

该用户从未签到

自我介绍
爱学习
跳转到指定楼层
1#
发表于 2012-6-12 16:53 |只看该作者 |倒序浏览
|招呼Ta 关注Ta

4 e0 Y' ]$ r( W2 s' M第一章  Maple基础
1 S& U# d5 e0 N; _/ g1 K0 Y' c9 R3 U/ q' w! V3 r, }; x& G. x
1 初识计算机代数系统Maple* U# ]* m9 y$ F  w; P. W- w5 L
1.1 Maple简说
$ k- w7 H) N2 t0 V6 ?- m# \. j1980年9月, 加拿大Waterloo大学的符号计算机研究小组成立, 开始了符号计算在计算机上实现的研究项目, 数学软件Maple是这个项目的产品. 目前, 这仍是一个正在研究的项目. - Z+ A& ~5 `- S. k* ]- Z9 g8 `
Maple的第一个商业版本是1985年出版的. 随后几经更新, 到1992年, Windows系统下的Maple 2面世后, Maple被广泛地使用, 得到越来越多的用户. 特别是1994年, Maple 3出版后, 兴起了Maple热. 1996年初, Maple 4问世, 1998年初, Maple 5正式发行. 目前广泛流行的是Maple 7以及2002年5月面市的Maple 8.
! i% C0 n6 ~+ k8 q* h% fMaple是一个具有强大符号运算能力、数值计算能力、图形处理能力的交互式计算机代数系统(Computer Algebra System). 它可以借助键盘和显示器代替原来的笔和纸进行各种科学计算、数学推理、猜想的证明以及智能化文字处理. 3 w" x, V. u5 N# N3 k, ~
Maple这个超强数学工具不仅适合数学家、物理学家、工程师, 还适合化学家、生物学家和社会学家, 总之, 它适合于所有需要科学计算的人.
, O. H/ v. _( z- f1.2 Maple结构4 g# _& }  a0 S  B5 A! K- y( q- Y
Maple软件主要由三个部分组成: 用户界面(Iris)、代数运算器(Kernel)、外部函数库(External library). 用户界面和代数运算器是用C语言写成的, 只占整个软件的一小部分, 当系统启动时, 即被装入, 主要负责输入命令和算式的初步处理、显示结果、函数图象的显示等. 代数运算器负责输入的编译、基本的代数运算(如有理数运算、初等代数运算等)以及内存的管理. Maple的大部分数学函数和过程是用Maple自身的语言写成的, 存于外部函数库中. 当一个函数被调用时, 在多数情况下, Maple会自动将该函数的过程调入内存, 一些不常用的函数才需要用户自己调入, 如线性代数包、统计包等, 这使得Maple在资源的利用上具有很大的优势, 只有最有用的东西才留驻内存, 这保证了Maple可以在较小内存的计算机上正常运行. 用户可以查看Maple的非内存函数的源程序, 也可以将自己编的函数、过程加到Maple的程序库中, 或建立自己的函数库.
3 n9 |( ^: t: p* C$ L6 U% W1.3 Maple输入输出方式, s& |# i! V" _/ X
为了满足不同用户的需要, Maple可以更换输入输出格式: 从菜单“Options | Input Display和Out Display下可以选择所需的输入输出格式.
) E$ w5 r2 v) U, U! oMaple 7有2种输入方式: Maple语言(Maple Notation)和标准数学记法(Standard Math Notation). Maple语言是一种结构良好、方便实用的内建高级语言, 它的语法和Pascal或C有一定程度的相似, 但有很大差别. 它支持多种数据操作命令, 如函数、序列、集合、列表、数组、表, 还包含许多数据操作命令, 如类型检验、选择、组合等. 标准数学记法就是我们常用的数学语言.
" p5 Z+ s4 J, g5 U  N, V. ?$ ]启动Maple, 会出现新建文档中的“[>”提示符, 这是Maple中可执行块的标志, 在“>”后即可输入命令, 结束用“;”(显示输出结果)或者“:”(不显示输出结果). 但是, 值得注意的是, 并不是说Maple的每一行只能执行一句命令, 而是在一个完整的可执行块中健入回车之后, Maple会执行当前执行块中所有命令(可以是若干条命令或者是一段程序). 如果要输入的命令很长, 不能在一行输完, 可以换行输入, 此时换行命令用“shift+Enter”组合键, 而在最后一行加入结束标志“;”或“:”, 也可在非末行尾加符号“\”完成. 9 U3 g  \) O7 a( X3 S
Maple 7有4种输出方式: Maple语言、格式化文本(Character Notation)、固定格式记法(Typeset Notation)、标准数学记法(Standard Math Notation). 通常采用标准数学记法.
* j0 H9 U+ c/ G1 CMaple会认识一些输入的变量名称, 如希腊字母等. 为了使用方便, 现将希腊字母表罗列如下,输入时只需录入相应的英文,要输入大写希腊字母, 只需把英文首字母大写:   
) [4 i2 G. U0 {& ^ . j$ Q/ |) l, h0 h- T
& ~% U, j3 k. j  i

9 m& P8 ]5 J4 P" G
3 L8 G+ A7 m7 O0 o
4 F! F; S9 z9 y$ }& [5 [6 g / ~+ k  ]0 t8 A

7 f2 ^6 y! x' `8 w& L& y/ O 7 \9 D; d. I9 t- f, Y; b! j" x1 A
* `0 n, J. X5 ~

+ O# x, o% Q4 o3 c$ F& ]& ?6 |- L4 x
4 e5 ?* v* T; ?) i
4 _# ?# E, R9 V2 s5 u% D6 J4 `9 E: T& C3 B/ G5 T4 i
alpha        beta        gamma        delta        epsilon        zeta        eta        theta        iota        kappa        lambda        mu
* V) w# R: K0 X3 f0 e) E; N - K, g! Q& A1 W9 f7 K& z1 D, n
3 ]$ x- G% q% n4 I4 m  y  h
5 A3 D* @5 X( H3 Y0 B
8 k# `, V9 q2 S6 F7 m7 M4 A, u3 M
# I! a: w0 c6 L" S* f5 R

2 z2 A& S+ a3 m: V3 j$ u: V1 e 8 r- U6 S9 w& n6 U+ u9 r
& x$ g$ N; P& g. j7 g

! @3 ^9 C4 D$ ^4 G9 O" ~8 J$ u - i% R/ f  r% t6 n
. e- g4 g# z. \9 G+ C

. n' P; q, @8 |3 K8 G
$ ~2 M. }& g6 D! y4 Y* C1 t/ E$ fnu        xi        omicron        pi        rho        sigma        tau        upsilon        phi        chi        psi        omega
8 [3 k6 N& t( F2 N, h5 q有时候为了美观或特殊需要,可以采用Maple中的函数或程序设计方式控制其输出方式,如下例:
1 u  U* R8 O5 e" V7 D> for i to 10 do
; C( G, L7 t) s, N2 }7 f' Q, I& R6 kprintf("i=%+2d and i^(1/2)=%+6.3f", i, eval(sqrt(i)));2 S2 r- v$ b% K, v+ ]
od;
! {2 Z+ J, H4 G' r( Z( A, u" Pi=+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
: ]6 w, M- }6 w* @5 R+2d的含义是带符号的十进位整数,域宽为2. 显然,这种输出方式不是我们想要的,为了得到更美观的输出效果,在语句中加入换行控制符“\n”即可:
" s  Q. f+ e$ ^3 f> for i to 10 do
* y* m; w4 n$ N1 yprintf("i=%+2d and i^(1/2)=%+6.3f\n", i, eval(sqrt(i)));
( j8 u7 ?6 |6 I9 {4 I) Aod;5 b" \4 _6 P! k( ]5 I! V+ p
i=+1 and i^(1/2)=+1.000
% K# N- J9 K7 t: P. ]% Z* ^i=+2 and i^(1/2)=+1.414
: D1 \) t% w2 |1 Y: R  Y" g' D( ki=+3 and i^(1/2)=+1.732
: {' ^8 Z  C; a- f1 G2 |i=+4 and i^(1/2)=+2.000# ^* _& }9 Z, ]. A" I& w
i=+5 and i^(1/2)=+2.236
5 C7 I, Y7 u* X$ J* R4 Li=+6 and i^(1/2)=+2.449
; f9 n4 Q& Y& ^0 t/ ]+ i3 pi=+7 and i^(1/2)=+2.646
- y) l: ^, v/ z9 c9 oi=+8 and i^(1/2)=+2.828
" m4 B6 D+ c) E, |i=+9 and i^(1/2)=+3.000( b4 {2 |. j. p) V
i=+10 and i^(1/2)=+3.1621 D7 }/ u% ?' o- G! P& x
再看下例:将输入的两个数字用特殊形式打印:
0 B! r2 z: `+ f2 L# [  g> niceP:=proc(x,y)
, R5 [/ k6 F/ L4 B8 W: v' C* u6 Zprintf("value of x=%6.4f, value of y=%6.4f",x,y);& ~5 x: E8 ^1 v
end proc;
3 L* d% B5 D) c; X5 F$ M% S
/ Q- j: r/ o; H$ T4 P% `9 D> niceP(2.4,2002.204);' o" V5 k4 _2 ]8 Q
value of x=2.4000, value of y=2002.2040
( T; t6 Y" ~+ ^/ T. [1.4 Maple联机帮助' U2 W0 h# [8 q7 d: K
学会寻求联机帮助是掌握一个软件的钥匙. Maple有一个非常好的联机帮助系统, 它包含了90%以上命令的使用说明. 要了解Maple的功能可用菜单帮助“Help”, 它给出Maple内容的浏览表, 这是一种树结构的目录表, 跟有…的词条说明其后还有子目录, 点击这样的词条后子目录就会出现(也可以用Tab键和up, down选定). 可以从底栏中看到函数命令全称, 例如, 我们选graphics…, 出现该条的子目录, 从中选2D…, 再选plot就可得到作函数图象的命令plot的完整帮助信息. 一般帮助信息都有实例, 我们可以将实例中的命令部分拷贝到作业面进行计算、演示, 由此可了解该命令的作用. / a% b- o" y0 B, n
在使用过程中, 如果对一个命令把握不准, 可用键盘命令对某个命令进行查询. 例如, 在命令区输入命令“?plot”(或help(plot);), 然后回车将给出plot命令的帮助信息, 或者将鼠标放在选定的要查询的命令的任何位置再点击菜单中的“Help”即可. ' v) }) v5 p" H3 @1 L
2  Maple的基本运算
! a+ F' [" |+ Q: C* o2.1 数值计算问题% A0 S1 c* c2 _" Y  x" K2 U
算术是数学中最古老、最基础和最初等的一个分支, 它研究数的性质及其运算, 主要包括自然数、分数、小数的性质以及他们的加、减、乘、除四则运算. 在应用Maple做算术运算时, 只需将Maple当作一个“计算器”使用, 所不同的是命令结束时需加“;”或“:”. 7 M* P  s7 ]( v, F  m- Y6 m* D$ U
在Maple中, 主要的算术运算符有“+”(加)、“–”(减)、“*”(乘)、“/”(除)以及“^”(乘方或幂,或记为**), 算术运算符与数字或字母一起组成任意表达式, 但其中“+”、“*”是最基本的运算, 其余运算均可归诸于求和或乘积形式. 算述表达式运算的次序为: 从左到右, 圆括号最先, 幂运算优先, 其次是乘除,最后是加减. 值得注意的是, “^”的表达式只能有两个操作数, 换言之,  是错误的, 而“+”或“*”的任意表达式可以有两个或者两个以上的操作数. ( @  b4 r# y# Q# o) {) m
Maple有能力精确计算任意位的整数、有理数或者实数、复数的四则运算, 以及模算术、硬件浮点数和任意精度的浮点数甚至于矩阵的计算等等. 总之, Maple可以进行任意数值计算. 9 @$ @3 J3 t# B( {
但是, 任何软件或程序毕竟只是人们进行科学研究的一种必要的辅助, 即便它有很多优点, 但也有它的局限性, 为了客观地认识数学软件、认识Maple, 下面通过两个简单例子予以说明. 9 q8 X( H( q- _$ y5 K
第一个简单的数值计算实例想说明Maple数值计算的答案的正确性:   
. ~/ q: N: W* ?' G- x9 I> 3!!!;
) m* a, ?1 n( o, z4 A4 Z2601218943565795100204903227081043611191521875016945785727541837850835631156947382240678577958130457082619920575892247259536641565162052015873791984587740832529105244690388811884123764341191951045505346658616243271940197113909845536727278537099345629855586719369774070003700430783758997420676784016967207846280629229032107161669867260548988445514257193985499448939594496064045132362140265986193073249369770477606067680670176491669403034819961881455625195592566918830825514942947596537274845624628824234526597789737740896466553992435928786212515967483220976029505696699927284670563747137533019248313587076125412683415860129447566011455420749589952563543068288634631084965650682771552996256790845235702552186222358130016700834523443236821935793184701956510729781804354173890560727428048583995919729021726612291298420516067579036232337699453964191475175567557695392233803056825308599977441675784352815913461340394604901269542028838347101363733824484506660093348484440711931292537694657354337375724772230181534032647177531984537341478674327048457983786618703257405938924215709695994630557521063203263493209220738320923356309923267504401701760572026010829288042335606643089888710297380797578013056049576342838683057190662205291174822510536697756603029574043387983471518552602805333866357139101046336419769097397432285994219837046979109956303389604675889865795711176566670039156748153115943980043625399399731203066490601325311304719028898491856203766669164468791125249193754425845895000311561682974304641142538074897281723375955380661719801404677935614793635266265683339509760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
, H/ r) e! M- g1 u5 G上述运算结果在IBM PC机(1G, 128M)上计算只需要0.01秒, 得到如此复杂的结果(1747位), 一个自然的问题是: 答案正确吗?6 }& F, w3 d/ \
为了回答这个问题, 我们借助于数值分析方法, 由Stiring公式# ]- M% O6 t" \

, ~3 z/ ^% U/ U. P9 o可得:  , 前三位数字与Maple输出结果相同, 且两者结果均为1747位. 另外, 在720!的计算中, 5的因子的个数为:   
1 H" ^, b$ [% l8 t9 ^* B* h! O/ H ' A5 M8 k  V5 |3 ^
这些5与足够多的2相乘将得到178个0, 而Maple的输出结果中最后178位数为零. 由此, 可以相信Maple结果的正确性.
8 S. s" B/ @" D, `/ G; E8 ^# u/ Y另一个例子则想说明Maple计算的局限性:   
4 q3 _6 V) M! S, {2 W( z1 m' K  4 H5 k- I8 r# w
Maple在处理问题时, 为了避免失根, 从不求算术式的近似值, 分数则化简为既约分数. 因此, 在Maple中很容易得到:   5 C; X0 A! i5 _! F2 G1 v. i, u( T+ W

' J8 I/ p/ m" {2 W显然这是错误的. 这一点可以从代数的角度予以分析.
/ M2 }: c; P1 H不妨设 , 则 , 即 , 显然 有3个结果, -2是其实数结果. ) L; |  _% B% ?7 r6 o- y  n
另一方面, 设 , 则 , 即:3 ]/ u# I# l, R. I: _, \4 k( i
+ W$ j7 M* ?2 z
显然 有6个结果, -2、2是其实数结果.
4 o- v! z/ m/ F# ]这个简单的例子说明了Maple在数值计算方面绝对不是万能的, 其计算结果也不是完全正确的, 但是, 通过更多的实验可以发现: Maple只可能丢失部分结果, 而不会增加或很少给出完全错误的结果(如上例中Maple的浮点数结果皆为 ). 这一点提醒我们, 在利用Maple或其他任何数学软件或应用程序进行科学计算时, 必须运用相关数学基础知识校验结果的正确性. - [. W. F; j  U- b- o
尽管Maple存在缺陷(实际上, 任何一个数学软件或程序都存在缺陷), 但无数的事实说明Maple仍然不失为一个具有强大科学计算功能的计算机代数系统. 事实上, Maple同其他数学软件或程序一样只是科学计算的一个辅助工具, 数学基础才是数学科学中最重要的.
# ^1 `4 D: N- F4 |, i+ k- ~2.1.1 有理数运算
' N: _' p+ E/ f; X  `3 o* a作为一个符号代数系统, Maple可以绝对避免算术运算的舍入误差. 与计算器不同, Maple从来不自作主张把算术式近似成浮点数, 而只是把两个有公因数的整数的商作化简处理. 如果要求出两个整数运算的近似值时, 只需在任意一个整数后加“.”(或“.0”), 或者利用“evalf”命令把表达式转换成浮点形式, 默认浮点数位是10 (即: Digits:=10, 据此可任意改变浮点数位, 如Digits:=20). ) g" k4 U& h! H' l1 J' @$ {" Q
> 12!+(7*8^2)-12345/125;1 R1 L+ w' z# V3 o  n2 y; N

! s0 i8 q5 C  m# ^% {8 Z3 W" O* `9 H> 123456789/987654321;
# G  A" y' f7 f9 M' }( J! l# I
. u8 `- X' r' k. O  J! G' @; Y0 i> evalf(%);) K) M( N& X3 i

4 X* W: m8 E+ }8 l> 10!; 100*100+1000+10+1; (100+100)*100-9;
: z: X! p4 i% S' S) ]. X
  o" N, K+ S4 d, A6 T" W8 y , _8 k: R* |7 `7 w5 u9 Q7 m
1 W' z8 |$ _. p2 n
> big_number:=3^(3^3);, L" L4 u: B- |8 O4 J9 ?
$ @/ d  B( w( b' C" [6 e# o
> length(%);
8 E( _: M% ^+ }6 a  P. r- L/ g
) X# `! E' g% i7 S" T6 D上述实验中使用了一个变量“big_number”并用“:=”对其赋值, 与Pascal语言一样为一个变量赋值用的是“:=”. 而另一个函数“length”作用在整数上时是整数的十进制位数即数字的长度. “%”是一个非常有用的简写形式, 表示最后一次执行结果, 在本例中是上一行输出结果. 再看下面数值计算例子:   
3 z% z1 u/ c9 `+ r6 K" b( k6 @; b    1)整数的余(irem)/商(iquo)  D0 T' s3 q" Z: V
命令格式:   
- r0 x" R9 F$ N/ w" o2 Q! R4 birem(m,n);        #求m除以n的余数, i' M8 }5 [) M' Z4 R
irem(m,n,'q');    #求m除以n的余数, 并将商赋给q7 z1 w8 ~! o$ ]" P
iquo(m,n);        #求m除以n的商数! u0 U, Z6 b, m. [" \; X% ?. l
iquo(m,n,'r');    #求m除以n的商数, 并将余数赋给r0 k3 x7 w* k$ b5 t6 h
其中, m, n是整数或整数函数, 也可以是代数值, 此时, irem保留为未求值.
& P. m% z# R" R/ m> irem(2002,101,'q'); # 求2002除以101的余数, 将商赋给q
8 }# [, {! r. d- O
/ N3 ?1 n5 E* {4 `: \> q; #显示q  w3 _) f( x9 T/ X7 I; C
, ?& J' N+ x7 c! E" _
> iquo(2002,101,'r'); # 求2002除以101的商, 将余数赋给r
4 B4 x2 {2 N; s0 ] % J7 [6 c# x* E; H
> r; #显示r
1 ~' }- ^9 o6 n8 e2 R1 _
( u, R8 e- k& y/ r1 O5 {> irem(x,3);
% O' {  I: G6 y8 B/ H' n) P ) U7 a) v4 D/ y! V5 w$ {( Q
2)素数判别(isprime)0 N/ ]& q: ~. }" `
素数判别一直是初等数论的一个难点, 也是整数分解问题的基础. Maple提供的isprime命令可以判定一个整数n是否为素数. 命令格式: isprime(n);
; U( ]3 V8 t/ H* [. X    如果判定n可分解, 则返回false, 如果返回true, 则n“很可能”是素数. 0 ~3 C) V) K& {9 [- l& z1 E
> isprime(2^(2^4)+1);7 h. r+ ?5 c( `5 b) W* M
+ J( t4 g3 f% A, H2 Z6 o
> isprime(2^(2^5)+1);
8 j6 v! {, `( ~8 F# t8 H
- I4 I5 v6 }2 H上述两个例子是一个有趣的数论难题。形如 的数称为Fermat数, 其中的素数称为Fermat素数, 显然, F0=3、F1=5、F2=17、F3=257、F4=65537都是素数. Fermat曾经猜想所有的Fn都是素数, 但是Euler在1732年证明了F5=641•6700417不是素数. 目前, 这仍是一个未解决的问题, 人们不知道还有没有Fermat素数, 更不知道这样的素数是否有无穷多.
$ a4 R& \! n% p/ _3) 确定第i个素数(ithprime)$ t- ~/ s% N+ C/ N7 ^
若记第1个素数为2,判断第i个素数的命令格式: ithprime(i);   
/ F3 T( z/ e6 U! ?1 W6 J' R> ithprime(2002);
1 ?- @; s. C; X; l$ M " H6 b  }: s! v
> ithprime(10000);
; A1 g3 |, l/ r% c6 t) e   K! u2 z+ v9 h
4) 确定下一个较大(nextprime)/较小(prevprime)素数
8 Q$ }5 F7 A% A/ W* \' a当n为整数时,判断比n稍大或稍小的素数的命令格式为:   * h; Z% J! n! L6 K
nextprime(n);  
4 \' d1 f; j) N+ N  Eprevprime(n);
) T% N8 f, L: S% s! w> nextprime(2002);
: A+ K- c6 p+ i3 i" O, o* Y * P. k. {3 _1 C& I  M, }6 z! D! I
> prevprime(2002);
2 ^6 l. t* I' I3 y3 m
) }+ k2 `. J% K: l# D) a' n5) 一组数的最大值(max)/最小值(min)+ s$ R3 M6 @% D% f, O. m1 o
命令格式: max(x1,x2,…,xn);   #求x1,x2,…,xn中的最大值
+ i6 {+ ~( J( A: _: P             min(x1,x2,…,xn);   #求x1,x2,…,xn中的最小值
( V2 \2 X& A6 l/ S! L6 s. e& a> max(1/5,ln(3),9/17,-infinity);0 g8 r7 `& W6 I/ m
* D# u$ }9 l: t/ ]8 ^" q
> min(x+1,x+2,y);7 [; [! @: z: Q( H( X. v" W% z

3 L8 @2 o9 l3 G" f6)模运算(mod/modp/mods)
% H0 @  v2 J+ [( m% U6 p6 q" m命令格式:  e mod m;    # 表达式e对m的整数的模运算
0 G4 h- v8 j  y& X1 e' H8 gmodp(e,m);  # e对正数m的模运算; c5 Y$ {4 L" M% M6 c; h
mods(e,m);  # e对m负对称数(即 -m)的模运算9 [( P" H0 r! I& a" t
`mod`(e,m);  # 表达式e对m的整数的模运算, 与e mod m等价  x; v0 @; d0 |
值得注意的是, 要计算i^n mod m(其中i是一整数), 使用这种“明显的”语法是不必要的, 因为在计算模m之前, 指数要先在整数(可能导致一个非常大的整数)上计算. 更适合的是使用惰性运算符“&^”即: i &^n mod m, 此时, 指数运算将由mod运算符智能地处理. 另一方面, mod运算符的左面优先比其他运算符低, 而右面优先高于+和-, 但低于*和/. ! T* V. M0 U5 L+ q( `
> 2002 mod 101;
7 m' ]8 }% h7 }: I * j" W. {/ T0 \- p, z& I* D
> modp(2002,101);& R$ L) J3 L1 y( e6 |$ N
! @' I  z2 Q8 D/ j
> mods(49,100);$ G+ z+ r+ s1 G9 f- c
; W" Q" ^1 M3 u* j) ~: e9 U
> mods(51,100);
8 e  y, o5 M" z" {) P3 Y3 r
6 g: [% C6 q3 A4 R: V  |2 y> 2^101 mod 2002;  # 同 2 &^101 mod 2002;. V% a& P2 k7 H2 }7 L& X: ?

% T" h( f; P) F! l1 [3 f( f7)随机数生成器(rand)% ?5 Q/ Y& d/ _% b2 T4 b1 U
命令格式:     @3 x/ G; e+ d% x
rand( );    #随机返回一个12位数字的非负整数( L# R- ^2 p- A* s; R( E
rand(a..b);  #调用rand(a..b)返回一个程序, 它在调用时生成一个在范围[a, b]内的随机数
/ r3 @' [, u. F1 R9 k( K, G> rand();
" z5 C# G8 i( F
9 h% H  ^  {$ c* W2 `2 M> myproc:=rand(1..2002):+ D! r: i! \& _  U
> myproc();2 p# _& A" e7 i
/ T0 d( N3 V8 S, ]0 ]
> myproc();! U  _" P8 |: ~1 R6 w4 u7 ^* ~
0 U* h" D- O8 I+ c' Q  a
    注意, rand(n)是rand(0..n-1)的简写形式.; ]8 R* I0 Q0 j4 c6 Y7 L3 s
2.1.2 复数运算9 L" J7 x/ t7 D2 u
复数是Maple中的基本数据类型. 虚数单位i在Maple中用I表示. 在运算中, 数值类型转化成复数类型是自动的, 所有的算术运算符对复数类型均适用. 另外还可以用Re( )、Im( )、conjugate( )和argument( )等函数分别计算实数的实部、虚部、共轭复数和幅角主值等运算. 试作如下实验:   - f3 j0 F6 b8 q$ y
> complex_number:=(1+2*I)*(3+4*I);! R- E8 O. @5 W

6 O5 t! f9 a6 U6 t+ _; `% h> Re(%);Im(%%);conjugate(%%%);argument(complex_number);; N( ]+ ]5 \+ R- u

# n* r$ B0 i4 L" p: C+ W
" d2 `' M- O9 X# a ! b5 M9 I1 A$ A( k# g6 a) ]
6 d! l, B# j  q* V% t! f
值得注意的是上行命令中均以“;”结束, 因此不能将命令中的2个%或3个%(最多只能用3个%)改为1个%, 因为%表示上一次输出结果, 若上行命令改为“,”结束, 则均可用1个%.
! L; Y* @3 M& i' P. g0 Y6 L# F为了在符号表达式中进行复数运算, 可以用函数evalc( ), 函数evalc把表达式中所有的符号变量都当成实数, 也就是认为所有的复变量都写成 的形式, 其中a、b都是实变量. 另外还有一些实用命令, 分述如下:   : s. h4 L% c9 y
1) 绝对值函数0 x( l% A' _( H5 x( t8 r6 V
命令格式: abs(expr);  * o0 c, B1 r3 ~7 d  D' k( w5 U0 j
当expr为实数时,返回其绝对值,当expr为复数时,返回复数的模.7 T; q! c& M  F8 o) H: T( t$ X5 K
> abs(-2002);    #常数的绝对值( W6 s. s& P) s- x
4 `/ u) i( _  b" C7 M# g0 V
> abs(1+2*I);   #复数的模
2 V! X0 ?/ q3 u/ \, Z" Q/ L  f) c
* m8 o, c1 U5 h, D> abs(sqrt(3)*I*u^2*v);  #复数表达式的绝对值
6 Z' g% n! z, S) I4 C
8 R7 A( l8 |: S+ H  c$ E> abs(2*x-5);   #函数表达式的绝对值; C6 b: t, B7 r: X; F( h

" z9 y' e  K$ [, `, S2)复数的幅角函数. c" [3 U: N: c  D
命令格式:   argument(x);  #返回复数x的幅角的主值+ ?: Q% X. ~% _
> argument(6+11*I);
; z' P* ^1 \: ]/ z& f 4 |( I, K; ?( f+ N0 I4 H/ I6 p3 ~+ h
> argument(exp(4*Pi/3*I));
6 Y) w6 _$ P7 g' N
9 v( Z8 B3 E, i" M( x6 Q* z# t3)共轭复数
5 g" H- P# z+ o' G" v6 g' n  [2 b命令格式:   conjugate(x);  #返回x的共轭复数
1 W" |3 j5 P7 x> conjugate(6+8*I);
+ S& t/ y. `8 s/ ?: E- ? & z6 p+ Y8 V% I5 X" y* n
> conjugate(exp(4*Pi/3*I));: r* M# P' X( i
* B4 x+ h0 u- r1 @+ [7 |
2.1.3 数的进制转换
' i! c' N' R- M! h/ z8 x3 d数的进制是数值运算中的一个重要问题. 而在Maple中数的进制转换非常容易, 使用convert命令即可.
" ~& C5 Q! r/ I3 C2 H命令格式:   convert(expr, form, arg3, ...);   
: s6 `9 p3 @# F+ l其中, expr为任意表达式, form为一名称, arg3, ... 可选项.
$ ~% k8 {; P9 k; f% h5 r- e# h下面对其中常用数的转换予以概述. 而convert的其它功能将在后叙章节详述.
! ]  b/ b3 A) j    1)基数之间的转换
! G4 o) b  D& L3 w命令格式:   
. L1 v! J& E$ V- oconvert(n, base, beta);      #将基数为10的数n转换为基数为beta的数+ H- d; q& ~, @5 O" X: Y
    convert(n, base, alpha, beta);#将基数为alpha的数字n转换为基数为beta的数
* N: C; B3 w/ j5 V: |% _: @/ h9 l! p> convert(2003,base,7); #将10进制数2002转换为7进制数, 结果为: (5561)7, z5 w- g8 U( |
7 V4 ]; p8 d/ D; r
> convert([1,6,5,5],base,7,10); #将7进制数5561转换为10进制数
) Z; u4 q( r) w
. G. P4 K+ l4 a& J> convert(2002,base,60);       #将十进制数2002转换为60进制数, 得33(分钟)22(秒)6 |4 q- D, f# Z8 K3 O4 j7 V2 L& w

9 f1 \! T0 W# x    2)转换为二进制形式
& u( e! p! G( {7 z2 V% U命令格式: convert(n, binary);
# d! [1 I) b$ Z# H其功能是将十进制数n转换为2进制数. 值得注意的是, 数可以是正的, 也可以是负的, 或者是整数, 或者是浮点数, 是浮点数时情况较为复杂.
+ t+ s$ J* x% B+ L> convert(2002,binary);   
, c9 z5 K2 o2 T, B  w
; K& J0 A5 p1 U> convert(-1999,binary);
" X& M8 F4 W3 x1 o8 A) C6 q7 n
, Z# p/ p) k, M0 [8 B2 v1 Z: G> convert(1999.7,binary); ! ?7 L4 ?( Y- i8 L
' x* ?1 v7 N( z4 T
3)转换为十进制形式# {) x4 m, d% B5 v
其它数值转换为十进制的命令格式为:   ; A1 q& j- j/ H8 b
convert(n, decimal, binary);   #将一个2进制数n转换为10进制数1 w0 m2 T, L1 ~0 u: K- M' q
    convert(n, decimal, octal);    #将一个8进制数n转换为10进制数$ B, Z+ k( O' r3 A/ Z. e" R
    convert(string, decimal, hex);  #将一个16进制字符串string转换为10进制数& |: a: E1 A& B. f2 R9 `5 W
> convert(11111010010, decimal, binary);    - S! T* f6 c/ E4 d. m# C

% v$ G! M- ?; ?) o> convert(-1234, decimal, octal);           4 Z: E$ d5 `( D) p' `4 O5 w
* `& ?/ `0 U) P6 I
> convert("2A.C", decimal, hex);          0 n' l6 n1 E5 b2 ?6 E
/ _+ D9 g7 y/ M, S
4) 转换为16进制数8 P7 Y5 E3 O9 ]
将自然数n转换为16进制数的命令格式为: convert(n, hex);   ! w! o7 P( _! J! H$ {
> convert(2002,hex);  convert(1999,hex);+ v! ]5 y3 d. a# x0 Q9 R7 C6 f
- V: j. `& w* g8 @( p: @& C

/ h$ u" V+ g: a2 E5)转换为浮点数2 j; C* }0 J5 w0 W' V7 A. V. N
命令格式: convert(expr, float);6 t/ x' X6 k: K( l8 i. C+ _
注意, convert/float命令将任意表达式转换为精度为全局变量Digits的浮点数, 且仅是对evalf的调用. - D7 R6 A- p! k9 H
> convert(1999/2002,float);
7 m4 S& z9 m5 q" z
0 Y2 w5 E6 p. ^5 ^2 h" E6 T) g> convert(Pi,float);# e( R! y0 Q  i6 u( E+ C( n8 o
+ F# j9 W6 W$ Y6 s
2.2 初等数学
3 ^, n6 a% j% ]    初等数学是数学的基础之一, 也是数学中最有魅力的一部分内容. 通过下面的内容我们可以领略Maple对初等数学的驾驭能力, 也可以通过这些实验对Maple产生一些感性认识.
3 ~& A5 q3 o9 A2.2.1 常用函数% \6 S6 P+ U6 K" o  @2 D8 E
作为一个数学工具, 基本的数学函数是必不可少的, Maple中的数学函数很多, 现例举一二如下:   + c9 v+ q) A3 z
指数函数: exp
; H) c9 ~5 p4 t5 ^+ _7 N一般对数: log[a]5 Q& L6 O* @( p2 ]* l/ z
自然函数: ln' p3 @& S! @9 O, [, m& J
常用对数: log10
. K  g8 `7 N" ]& s7 Z平方根: sqrt( M8 n% b7 W8 m/ p6 \* X1 @: z
绝对值: abs' j! H+ D1 x- V& X1 T2 V/ K. D
三角函数: sin、cos、tan、sec、csc、cot, \- Z% l/ o( @. l' V2 R8 N
反三角函数: arcsin、arccos、arctan、arcsec、arccsc、arccot
+ A2 @4 a2 _2 o! N0 ?( D) _双曲函数: sinh、cosh、tanh、sech、csch、coth3 g$ I6 k0 D. i$ C% I1 w
反双曲函数: arcsinh、arccosh、arctanh、arcsech、arccsch、arccoth
" X. D; M: y- J0 b: u! H7 S贝赛尔函数: BesselI、BesselJ、BesselK、BesselY( E2 Y* M3 |& `8 \
Gamma函数: GAMMA# g7 O/ f1 l4 X, q; ?4 T" I( _
误差函数: erf" K; n( u7 a% W4 r, Y/ b
函数是数学研究与应用的基础之一, 现通过一些实验说明Maple中的函数的用法及功能. : l* i& d% H) e  n
1) 确定乘积和不确定乘积
3 m/ |' N2 h! v* |7 s命令格式: product(f,k);  2 j, Z( ?! K9 \$ I1 w% K/ a% D
product(f,k=m..n);  $ ?9 Y# h6 T+ N3 z: }8 e, I
product(f,k=alpha); " n7 K3 I! F  v3 F
product(f,k=expr);
/ G5 A4 X9 ^. b: X2 \$ g其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—包含k的任意表达式.
( Y4 v& [+ @2 `: J> product(k^2,k=1..10);   #计算 关于1..10的连乘2 D0 D. {3 G2 d; s2 v% D8 n
' K7 @" }$ q' ~2 b2 ^, G- R+ g
> product(k^2,k);         #计算 的不确定乘积5 W; ]( O- T5 M, b2 U

5 `/ k$ p$ l% p9 V4 z6 @> product(a[k],k=0..5);    #计算ai(i=0..5)的连乘/ s4 x) x7 v3 a* u" e+ b

' @! z' e5 `5 E6 n9 L9 m3 K> product(a[k],k=0..n);    #计算ai(i=0..n)的连乘5 b5 B: S* v3 D

, a# X, B5 @# U, U6 L, f3 @( s> Product(n+k,k=0..m)=product(n+k,k=0..m);   #计算(n+k)的连乘, 并写出其惰性表达式
; g6 e. Q2 u" g+ [7 N 6 M, W3 g# [  o  s1 N" f% k
> product(k,k=RootOf(x^3-2));     #计算 的三个根的乘积5 w3 s) I; i" Q4 n1 c  f8 t9 h
3 R: E# i  v& F/ E. }
    product命令计算符号乘积, 常常用来计算一个公式的确实或不确实的乘积. 如果这个公式不能求值计算, Maple返回 函数. 典型的例子是:   * r. d4 [& T1 L0 w# w0 s6 v3 f5 }
> product(x+k,k=0..n-1);8 s8 T7 `8 p- u+ A+ ~7 P' {

+ j# Z5 p( S2 P* \如果求一个有限序列值的乘积而不是计算一个公式, 则用mul命令. 如:   
& V1 N( D. t) {( }> mul(x+k,k=0..3);
6 f6 L* k5 Q2 o
) R& E* z- C) [, v/ _1 L$ B2)指数函数) x, C+ y3 q" n; d3 y, M! i) n
计算指数函数exp关于x的表达式的命令格式为: exp(x); 1 l4 `0 _0 t5 y) I& K6 E% s/ A3 P" f1 S
> exp(1);
( b5 T5 J2 O# f! C7 V/ }' F 0 A5 }& j; Z/ x- _* g
> evalf(%);, ~. G& D$ a; A; l/ k% M' }3 a( A
4 [2 T& ?8 k) M( S! v8 x4 Y
> exp(1.29+2*I);
0 [8 I. o9 H$ l* @ . E5 L6 i8 n- r* m1 C  T6 U$ y
> evalc(exp(x+I*y));: C9 q2 n8 I0 I# y* n
) p' L# x7 ]) R0 I! n
3)确定求和与不确定求和sum
  g' T4 a) Q  z! F命令格式: sum(f,k);  
4 p0 L) J' y( F( `# L/ J9 m* Asum(f,k=m..n);  5 ?2 X8 o1 T6 }
sum(f,k=alpha); & r5 s/ P# R  e9 s9 Y8 q
sum(f,k=expr);
3 p$ u4 t$ m2 A- p$ j% n其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—不含k的表达式.
5 ~# ]4 R6 |! P1 e; @- z/ ?# d> Sum(k^2,k=1..n)=sum(k^2,k=1..n);+ f4 a( P  k4 e
9 u# u7 e: a  [* |: I, n, j! J
> Sum(k^3,k=1..n)=sum(k^3,k=1..n);
9 {9 P: h7 w% J
0 @$ {4 ]5 V( |/ z( G6 d9 ]0 u> Sum(k^4,k=1..n)=sum(k^4,k=1..n);
1 b  ]7 |# Q) |$ V' s5 Z
7 _$ z% y! n8 @$ Y$ A> Sum(1/k!,k=0..infinity)=sum(1/k!,k=0..infinity);
! p' u% L' k1 Y" e, Z0 y- Q" B8 F% x # C  j, N  @( d: `  |, g' W
> sum(a[k]*x[k],k=0..n);6 a6 x# [/ ?) V. |* U, b6 s& [

3 K5 F! ~3 }, u" |7 Z> Sum(k/(k+1),k)=sum(k/(k+1),k);
6 @# R4 I$ s( {# u. T3 ^
# _. k1 |: h! x! _/ T> sum(k/(k+1),k=RootOf(x^2-3));7 H5 ^; B* B: [" H8 B
4 f' a& Y- x$ {; o% ?! F: ?1 Z4 V
sum函数可计算一个公式的确定和与不确定和, 如果Maple无法计算封闭形式, 则返回未求值的结果. 值得注意的是, 在sum命令中将f和k用单引号括起来, 可避免过早求值. 这一点在某些情况下是必需的.
1 `# Q0 t! E6 F; L/ @  N4 n$ ?> Sum('k','k'=0..n)=sum('k','k'=0..n);
! v8 _* ~- K+ I, }/ h3 M % w- ]5 `7 S- e- V3 k3 C$ t2 h
如果计算一个有限序列的值, 而不是计算一个公式, 可用add命令. 如:   
( N1 H3 ]  z* y2 G> add(k,k=1..100);
9 T( T  ]4 Y; `" c4 H! ~9 w
8 J! X# H5 P( \# Q, F尽管sum命令常常用于计算显式求和, 但在程序设计中计算一个显式和应该使用add命令.
( K( V4 P) m6 d3 A7 s8 |1 g另外, sum知道各种求和方法, 并会对各类发散的求和给出正确的结果, 如果要将求和限制为收敛求和, 就必须检查显式的收敛性. 3 F  b8 y  G' v
3)三角函数/双曲函数& k0 [( Y* r2 w1 Y( f& x
命令格式:   sin(x);   cos(x);   tan(x);   cot(x);   sec(x);   csc(x);
% ?; F% {, ?$ Y9 Q0 ?$ I1 ]          sinh(x);  cosh(x);  tanh(x);  coth(x);  sech(x);  csch(x);) p! L  [: ~0 b1 Q; x) z4 O, R
其中, x为任意表达式. 0 Z( b0 [- j0 o: C, r5 }$ p
值得注意的是三角函数/双曲函数的参数以弧度为单位. Maple提供了利用常见三角函数/双曲函数恒等式进行化简和展开的程序, 也有将其转化为其它函数的命令convert.
) d, s& j& T  }> Sin(Pi)=sin(Pi);9 S0 K) C! h9 L  B2 n+ }

! g, e: m+ d! D( P- i! y> coth(1.9+2.1*I);
+ A' `8 G$ F. [, K - o- j% S. g  [/ M
> expand(sin(x+y));     #展开表达式
# G* R  C5 |% ^! m% T
4 o3 w' G/ g2 K; G6 E& i> combine(%);        #合并表达式
4 _" {* I1 u& ^  k* G 9 D5 j* V* ?7 D4 l
> convert(sin(7*Pi/60),'radical');0 Q8 N" U# S  P0 Q
7 c% y4 |8 W* m; U5 H& f. a$ Q4 ~
> evalf(%);
: C) _) o% Q- I, N; N; w% v
6 Z1 s$ z+ |! G* l6 R' _' q但有趣的是, combine只对sin, cos有效, 对tan, cot竟无能为力.$ I$ U+ Q+ A. U7 T5 ~' S3 s9 ~2 o
4)反三角函数/反双曲函数  u7 f7 J3 g+ y  V; {( h$ B4 Y
命令格式: arcsin(x);   arccos(x);   arctan(x);   arccot(x);   arcsec(x);   arccsc(x);1 N: w  X7 ?! N, m9 Z' _
     arcsinh(x);  arccosh(x);  arctanh(x);  arccoth(x);  arcsech(x);  arccsch(x);   . v! Z9 ^  a8 v& X* Q
arctan(y,x);
% F8 h1 R2 G! j/ S* h: Q其中, x, y为表达式. 反三角函数/反双曲函数的参数必须按弧度计算.
6 M* Q  O7 e$ ~+ H* `算子记法可用于对于反三角函数和反双曲函数. 例如, sin@@(-1)求值为arcsin.
$ B2 ]* V# U; l* N# z8 `' k> arcsinh(1);
9 V- ?& Z- e& X) P' q 2 j" K+ [/ N$ X& c5 I
> cos(arcsin(x));
/ U; @4 K( r1 [/ Q- f( u5 W
; n7 M4 |6 B! s8 g0 g# a> arcsin(1.9+2.1*I);7 ?* ?* Y& ^7 k3 @$ T
9 d% \+ a! h. c2 Y$ _* Q$ ]  h
5)对数函数
* J  J: O$ d, f) {命令格式: ln(x);           #自然对数
6 u9 G/ V! R3 A2 \0 h, |' W% jlog[a](x);        #一般对数$ C; ?2 F1 v; {
log10(x);        #常用对数& d2 @0 v& j7 k& M2 y- p
一般地, 在ln(x)中要求x>0. 但对于复数型表达式x, 有:   
8 \( I# C) K9 o1 @& f7 E  (其中,  )% z  x6 C% x0 \$ {$ d/ Q$ ?0 G
> ln(2002.0);
' J# E. B. U! g1 U8 l( C" t: m; X 3 `/ S, W8 Z# [' g
> ln(3+4*I);" d5 t) f) @% _

) f. ]# q2 k6 Q- \' O> evalc(%);    # 求出上式的实部、虚部- _- T3 t  S9 g; w# f2 X. S
0 i- F" o- T5 b! W9 M9 v& H
> log10(1000000);
3 N5 r+ o: ~- k# w/ ?2 q- O 3 t; W. L9 ?" F$ C0 M$ E1 a1 S( F
> simplify(%);   #化简上式
$ x5 g7 u0 M) b9 E
: {- l! ]; Q" g# j% ]1 ?0 D2.2.2 函数的定义
: w" J4 r+ Y- \1 R! P9 \Maple是一个计算机代数系统, 带未知或者已知字母变量的表达式是它的基本数据形式. 一个简单的问题是, 既然表达式中可以包含未知变量, 那么它是不是函数呢?试看下面一个例子:   " C: _/ S7 n( t! q- Q/ T% O* C
> f(x):=a*x^2+b*x+c;. f9 T9 J: Q! h( u' s
$ W3 g$ s5 N2 F9 O5 C
可以看出, Maple接受了这样的赋值语句, 但f(x)是不是一个函数呢?要回答这个问题,一个简单的方法是求函数值:   + W% O) T' N. f+ [8 `) \( k1 X
> f(x),f(0),f(1/a);
" o6 u/ d; }) b; H4 b+ r
) Q; F1 q& W7 \* J+ ?由上述结果可以看出, 用赋值方法定义的f(x)是一个表达式而不是一个函数, 因为f(x)不能把所定义的“自变量”或者“参数”转换成别的变量或表达式. 但从赋值“过程”可以看出, f(x)虽然也算是一个“函数”, 但却是一个没有具体定义的函数:   0 _/ Z0 K0 ?3 L/ k  w  v
> print(f);9 W- _2 O) Y+ P! z

: A% z+ A5 |% }& }, t0 D" u事实上, 我们所做的赋值运算, 只不过是在函数f的记忆表(remember table)中加入了f(x)在x上的值, 当我们把自变量换作0或1/a时, f(x)的记忆表中没有对应的表项, 所以输出结果就是抽象的表达式. 3 V6 d3 j$ ]! a! a* w$ |
在Maple中, 要真正完成一个函数的定义, 需要用算子(也称箭头操作符):   
$ j' j; i/ V- Y+ {7 h; q7 [> f:=x->a*x^2+b*x+c;
9 ^* l; x8 V% U9 \4 \) c . ]3 }& f( L) g1 e
> f(x),f(0),f(1/a);9 X, x& o! D. w! X

* N1 z! c5 Y2 V" ?, h& m: F4 i4 D多变量的函数也可以用同样的方法予以定义, 只不过要把所有的自变量定成一个序列, 并用一个括号“()”将它们括起来(这个括号是必须的, 因为括号运算优先于分隔符“,”). " o7 O9 o: Q, P8 e/ b% ~
> f:=(x,y)->x^2+y^2;
; H6 t4 |4 `2 p% w 6 b3 S, Q+ z9 O6 O* B: I" O
> f(1,2);
* ]  f% i7 v6 j# L6 d! v
4 j& G7 e) z: b! @> f:=(x,y)->a*x*y*exp(x^2+y^2);
3 I0 p* X6 q5 X* b% n! m' E ; d- c; x, u3 ]' X. O9 F8 l* H8 c8 J
综上所述, 箭头操作符定义函数的方式一般为:   , q( {5 U  A6 A2 m+ C
一元函数: 参数->函数表达式
9 F) b  i, f, p& l多多函数: (参数序列)->函数表达式
  Z! A7 k& R5 r& ]7 F! j无参数函数也许不好理解, 但可以用来定义常函数:   , V5 }' f5 k' S% j) e& W5 O
> E:=()->exp(1);9 {8 h. K3 t& d+ U+ K

' e& N5 d; `5 i4 k) J4 X> E();! s! T8 h& e+ M: Y& i
' g! `6 o- W2 a* g% j3 D: b# g
> E(x);
/ V( K- D8 r6 g ! Z7 ]+ S4 l8 G" {
另一个定义函数的命令是unapply,其作用是从一个表达式建立一个算子或函数.
8 f/ y* o& p) A定义一个表达式为expr的关于x的函数f的命令格式为:  f:=unapply(expr, x);         
9 i- W- @. X" d* c& {定义一个表达式为expr的关于x,y,…的多元函数f的命令格式为:  f:=unapply(expr, x, y, …);     
: i  J0 B4 `% ]3 t4 [4 E( `> f:=unapply(x^4+x^3+x^2+x+1,x);' t+ g) }, `+ x
3 B. f5 i; n, ?- S' E
> f(4);7 O' ?9 b/ ?! M9 Y* U

  W- k2 ?4 n+ u' v0 y6 \, E> f:=unapply(x*y/(x^2+y^2),x,y);
! B9 F- D4 I( U- x( p1 T- H2 R
' f/ p. @. R+ C$ a, {5 ~" p> f(1,1);
4 I5 N& f; E" K
5 B+ b1 {- l3 M" u1 t  D7 G借助函数piecewise可以生成简单分段函数:
) F, M: h3 M* X2 {- U> abs(x)=piecewise(x>0,x,x=0,0,x<0,-x);
1 N  a4 N  h/ Z  D" V0 y
6 m" B) k3 y: _/ |, D, |" i# z: L9 M, T清除函数的定义用命令unassign. $ S7 ~  t  x+ z# a' Z
> unassign(f);& c# f5 t, z) w
> f(1,1);2 J8 R1 l4 D, W( p
2 p: S5 J0 i- w& ^# p
除此之外, 还可以通过程序设计方式定义函数(参见第6章). " z) f9 S7 ?' {
定义了一个函数后, 就可以使用op或nops指令查看有关函数中操作数的信息. nops(expr)返回操作数的个数, 函数op的主要功能是获取表达式的操作数,其命令格式为:( y) X/ Y' a# D1 h' [" g! v
op(expr);          / q# W* k% `; R! U2 L& y% g4 h$ e3 M
op(i, expr);         
9 h5 ]: q$ Z. s& Q; ^, {! ?" e3 xop(i .. j, expr);      ) F, ^: o$ ^# w
nops(expr);4 `: G$ F0 c( e( H  X1 c  D# V
如果函数op中的参数i是正整数,则op取出expr里第i个操作数, 如果i是负整数, 则其结果为op(nops(expr)+i+1, expr); 而i=0的情形较为复杂, 当expr为函数时, op(0, expr)返回函数名, 当expr为级数时, 返回级数的展开点(x-x0), 其它数据类型, op(0, expr)返回expr的类型. / }3 a: Q# y# v4 O
命令op(i .. j, expr); 执行的结果是expr的第i到第j个操作数, i..j中含负整数时的情形同上.& J) K) [6 X! f' O5 v
命令op(expr); 等价于op(1..nops(expr), expr);
& Y* U" Y7 \1 s$ K特别地, 当op函数中i为列表[a1, a2, ..., an], 则op([a1, a2, ..., an], expr); 等价于op(an, op(..., op(a2, op(a1, e))...));
8 d3 |) z4 ^# A  V9 u0 j) W而当expr为一般表达式时,nops(expr)命令返回的是表达式的项数, 当expr是级数时返回级数每一项的系数和指数的总和.
: ~9 e. R2 E: l7 i% n> expr:=6+cos(x)+sin(x)*cos(x)^2;' q7 T  T+ M! Z  o
5 j7 U/ Z0 L/ t3 R* h. f. u  U8 c$ j
> op(expr);. q0 S+ |8 \7 o  ]
# \7 `0 \; z7 L& q( u
> nops(expr);1 g- J$ r$ C: x. @/ _

$ S( Y4 u! |7 D+ D3 H> p:=x^2*y+3*x^3*z+2;
, Q( h8 @2 s3 X1 j
, w$ q# @( C3 H7 }0 M" N% N> op(1,p);$ M. }2 M/ T5 k! B: Q, m: ^
. [# l/ Y1 g/ Q9 K) Y8 y/ [
> op(1..nops(p),p);* j+ {3 y4 v3 k  ^
' a1 N3 S; E6 B: N
> op(op(2,p));
: z1 d2 q- ]7 p( w
6 F3 b* l- b3 w4 O> u:=[1,4,9];
/ j3 H' B; B6 B
( }0 X( \9 K! p/ e> op(0,u);
8 l! O3 J6 ^& n8 Q; X8 |7 y4 R( n& m " {. V+ X- n5 W% S: i. x7 ~
> s:=series(sin(x),x=1,3);
# j8 S' ]& i+ w+ J
! i2 ]0 A+ i' J> op(0,s);' h* M1 n4 J2 H# v5 i, M, h3 g
       
" w( [  |4 N8 J, Q. e8 j> nops(s);
; M8 j3 C, q$ v2 d% O
* d! G7 d% s& W1 X9 `' G  s下面一个有趣的例子说明了Maple在处理算术运算时的“个性”:
4 Q9 w2 k1 ~6 I7 A, W> op(x*y*z);5 T& h& n7 u' F+ B4 @! ^
: v! `5 N; g; y9 u. \
> op(x*y*z+1);
% O9 S: @; b% M( N0 D  y2 p8 C
0 G* {- d! a; O; h. W. Y/ {2.2.3 Maple中的常量与变量名
% V( Q% F' d. f1 \4 f, I0 k为了解决数学问题, 一些常用的数学常数是必要的. Maple系统中已经存储了一些数学常数在表达式序列constants中:   
: m2 M8 f* b" H> constants;
/ _% o# Y# r) k; L
+ h- V1 L$ b0 G: B为了方便使用, 现将上述常数的具体含义列示如下:   7 E+ ~8 z! i$ e4 ~
常    数        名 称        近似值" l8 |  w( @1 \
圆周率
, n8 Q& a* _* @7 yPi        3.1415926535
. d/ f1 {& @8 Q: tCatalan常数
0 T2 _0 b' s+ s0 r/ dCatalan        0.9159655942
3 Q/ N. V) T& |7 N7 Q# WEuler-Mascheroni常数 % Z! A6 s1 e) J4 t0 \/ C5 @. B/ Q* T
gamma        0.5772156649
/ A. w0 H" Y9 {( |8 h% ?, R& y , x$ a, s5 Z7 R2 Q: Q
infinity          m( z! }' l1 Z0 k

: ]" j* j0 |1 ^( D8 s2 i% u需要注意的是, 自然对数的底数e未作为一个常数出现, 但这个常数是存在的, 可以通过exp(1)来获取.
  C7 ?9 z5 U4 V2 F: Y在Maple中, 最简单的变量名是字符串, 变量名是由字母、数码或下划线组成的序列, 其中第一个字符必须是字母或是下划线. 名字的长度限制是499个字符. 在定义变量名时常用连接符“.”将两个字符串连接成一个名. 主要有三种形式: “名.自然数”、“名.字符串”、“名.表达式”. 5 C3 C( a& L4 O# ^; z) c) k
值得注意的是, 在Maple中是区分字母大小写的. 在使用变量、常量和函数时应记住这一点. 数学常量 用Pi表示, 而pi则仅为符号 无任何意义. 如g, G, new_term, New_Team, x13a, x13A都是不同的变量名. 2 X$ O3 [6 w! R- q
在Maple中有一些保留字不可以被用作变量名:   
; T! x' w- ^- Z6 A( lby      do      done     elif     else     end        fi        for      
# W4 L2 W% |1 T5 g3 Z- Y% d& zfrom    if       in       local     od     option    options     proc         9 H# n) ^$ K6 f; y4 |
quit    read     save     stop     then     to        while      D
4 v: R/ r7 `) h* O/ j& IMaple中的内部函数如sin, cos, exp, sqrt, ……等也不可以作变量名. ' L3 T) {5 [" [" I& ^. h6 e
另外一个值得注意的是在Maple中三种类型引号的不同作用:   
- `1 V! p; x* M- z) V/ h* w`  `:   界定一个包含特殊字符的符号, 是为了输入特殊字符串用的;   
% E& b$ P; }6 t# j: c& \'  ':   界定一个暂时不求值的表达式;   
8 j% F2 m% \9 {! j4 T/ h/ ~"  ":   界定一个字符串, 它不能被赋值. ; Q6 {4 C, P3 R" d
2.2.4 函数类型转换           ( z. s2 b- o* W, R, t
函数类型转换是数学应用中一个重要问题, 譬如, 将三角函数转换成指数函数, 双曲函数转换成指数函数, 等等. 在Maple中, 实现函数类型转换的命令是convert. 命令格式:  
+ E1 Y" w2 J; a$ T9 r& G% E( G6 P0 @    convert(expr, form);        #把数学式expr转换成form的形式
, k5 g8 l0 p- K% h- d$ H( v4 Aconvert(expr, form, x);      #指定变量x, 此时form只适于exp、sin、cos
0 X2 @, P! R8 T2 C* V1 bconvert指令所提供的三角函数、指数与函数的转换共有exp等7种:   
+ S% ?) I7 ?" y) m* _" Y* \  f(1) exp: 将三角函数转换成指数
2 N3 ^2 M. |( p' `2 K(2) expln: 把数学式转换成指数与对数- r/ P9 Z7 m3 g1 c- t
(3) expsincos: 分别把三角函数与双曲函数转换成sin、cos与指数的形式
3 v+ t6 X% q) j, B; {4 k% u(4) ln: 将反三角函数转换成对数
& O, B. L, B" B  }- h9 l(5) sincos: 将三角函数转换成sin与cos的形式, 而把双曲函数转换成sinh与cosh的形式
* j6 V3 N/ z2 ?6 I(6) tan: 将三角函数转换成tan的形式
5 c8 ~3 h1 E6 J: W/ X1 g' E' G(7) trig: 将指数函数转换成三角函数与对数函数3 Q2 W$ @' z6 J6 Q2 z) v
> convert(sinh(x),exp);   #将sinh(x)转换成exp类型
2 e2 b' e7 E: j  x7 v" Z2 D+ K
; Y, s# @: q! N0 f> convert(cos(x)*sinh(y),exp);
6 x$ i6 y7 x( r2 E; t" u
5 `! d7 W$ ^* _) e! ^- I> convert(cos(x)*sinh(y),exp,y);: B# j8 ?' v1 b8 B2 N1 J9 `; s3 }" Y
' w8 y! }3 {$ R$ G
> convert(exp(x)*exp(x^(-2)),trig);
3 V) p6 X  \7 o5 J3 {% n) E: ]
" R. A& L: q/ s' k8 }6 _> convert(arcsinh(x)*cos(x),expln);
$ s' F* C0 J$ A
1 h5 L; W; t2 a2 \, y/ |" E# J3 F> convert(cot(x)+sinh(x),expsincos);
+ S, `5 u! a: t4 K. H9 r0 f + B2 ?, u* G, o: x, y
> convert(arctanh(x),ln);3 j" S3 b- f( g) q' a  d
- r& Q" n, H2 G  K- k. v2 f
convert在有理式的转换中也起着重要的作用. 在有关多项式运算的过程中, 利用秦九韶算法可以减少多项式求值的计算量. 在Maple中, 可以用函数convert将多项式转换为这种形式, 而cost则可以获取求值所需的计算量. 注意: cost命令是一个库函数, 第一次调用时需要使用with(codegen)加载. 例举如下:   5 a) t) ^5 g3 L# U* E
> with(codegen):
; U6 O; n) t, G7 z& {> p:=4*x^4+3*x^3+2*x^2-x;
% l/ g! e2 n1 h5 ?, c 3 z4 J' ]. S9 l& H3 \/ C' {$ p) \
> cost(p);: i6 |% @2 F2 L% Q

  i& U7 Z( F! @5 A* N> convert(p,'horner');  #将展开的表达式转换成嵌套形式" J, Z+ M; m: j; k6 Q

# f2 J: f% X" W9 l! c> cost(%);
( @; S( `& x: P
4 O1 N* ~( d9 J1 l! [8 U: U) I6 Y2 F同样, 把分式化成连分式(continued fraction)形式也可以降低求值所需的计算量. 1 a9 ^6 N6 o- ^* O. `: Z3 P! f
> (1+x+x^2+x^3)/p;$ I. y+ S# V0 ^( r9 W/ ?
/ f, K, u+ O9 Z, |5 Y
> cost(%);
  E' f" u5 G5 ]; |3 X! \ 7 g, x6 Z  _+ u! T+ C0 R
> convert(%%,'confrac',x);
( c6 a# u( Q& f) W3 M/ u9 k1 e   L% O  g2 `% ]
> cost(%);
$ \' E' d5 N0 M/ r
& @8 `, M7 h, Z9 `  _# S9 m在某些场合下(比如求微分、积分时), 把分式化成部分分式(partial fraction)也就是几个最简分式的和式的形式也可以简化运算, 但简化程度不及连分数形式. 9 S3 u! A$ h* C+ j( O* Z
> convert(%%, 'parfrac',x);! {. F. n6 w* K

6 V. E1 ~* b9 I2 k+ S5 L7 e# f> cost(%);4 I/ c$ A2 d) k$ C4 E  h

4 x8 G# c/ H2 c# z而把分数转换成连分数的方法为:
* x9 g6 D! w% C! o  E* `> with(numtheory):+ n- w( P4 N. v4 T5 O6 M, T
> cfrac(339/284);
. ~! t6 D7 H% B3 L/ U$ o9 ^ 3 K2 Z2 `6 k; @$ y7 D
2.2.5 函数的映射—map指令' n: S% r" \8 T7 w
在符号运算的世界里, 映射指令map可以说是相当重要的一个指令, 它可以把函数或指令映射到这些结构里的元素, 而不破坏整个结构的完整性. 命令格式为:
$ w+ k- e5 t) z: Smap(f, expr);      #将函数f映射到expr的每个操作数
% D* p$ N( ?7 @  f, b0 I8 I  Kmap(f, expr, a);    #将函数f映射到expr的每个操作数, 并取出a为f的第2个自变量
* l' x' h" B  A( v+ L! [map(f, expr, a1, a2,…, an); #将函数f映射到expr的每个操作数, 并取a1~an为f的第2~n+1个自变量
. W) M( B1 @. h% B1 V6 kmap2(f, a1, expr, a2, …, an);    #以a1为第1个自变量, expr的操作数为第2个自变量, a2为: j# _" ^- l9 W. F0 B/ b2 n
第3个自变量…, an为第n+1个自变量来映射函数f
, R5 b( h! U# @> map(f,x1+x2+x3+x4,a1,a2,a3,a4);
! E! N2 D& v% m4 H) y0 z* C7 W
7 V, {2 K. I; }3 n> f:=x->sqrt(x)+x^2;
: [+ Z  U. x4 X9 l$ i
& z3 Z& k) I- X7 Y* o> map(f,[a,b,c]);
" r  ^% w! y, p* d, p/ r- ?
3 o: e$ P1 z+ x7 \+ N5 t- S- c( h4 O> map(h, [a,b,c],x,y); - A% x4 F" K+ f7 j* S
7 y! r8 _% V5 {; j# [' F
> map(convert,[arcsinh(x/2),arccosh(x/2)],ln);
' s4 m; N2 e( P, O& C : ^  h- F/ u# W: M
> map(x->convert(x,exp),[sin(x),cos(x)]);
) y1 Q" ^, O" h0 ]. ]
$ R) q5 c, c- D2 B% k上式的映射关系可通过下式理解:
) R9 m4 U' j+ w+ e( n- c( }> [convert(sin(x),exp),convert(cos(x),exp)];
& A' @5 f, J6 U. g + q% D9 g# {& F% K. A
> restart:
/ c* h# k9 [0 n5 o2 i8 y4 d; |map2(f,a1,x1+x2+x3+x4,a2,a3,a4);
* Q2 j3 d5 c# ]% m0 n
% y1 `) C% ^" H# _  ~% M: b> map2(max,k,[a,b,c,d]);
) p1 L8 y! `; d# a3 m : P1 f  x- a$ x3 @1 A& n
再看下面示例:   
1 D" t/ r) r9 O  E  k6 p1 @3 `> L:=[seq(i,i=1..10)];" |% i4 U. R  v" @) T

' S7 d" Q1 N. j& ?9 o% o% v1 ?> nops(L);
6 ~3 q5 S. m$ @; H: [ 4 _5 c' W0 w  i) y& A
> sqr:=(x)->x^2;5 p1 ^: {, c& x$ m7 g
4 h* H4 q) F6 N; }
> map(sqr,L);% C$ [' e$ a+ D& N; M6 q

! _* m3 M5 W. P5 R> map((x)->x+1,L);; I$ k/ Q1 K- }  o. ^
5 ]+ M' u3 b. a5 N) I8 E  ^
> map(f,L);
& O( u) K8 l% X" s  T6 o$ I
; |3 ^3 a8 @' X, W- `9 L> map(f,{a,b,c});. K! ^3 q  h+ }, z/ s- r8 {

& L) ^$ E7 L# [6 _$ X5 r0 j> map(sqr,x+y*z);
) v( Q8 j/ m7 H/ G  u# \6 u% u
8 z. [- l8 M. S( b# i> M:=linalg[matrix](3,3,(i,j)->i+j);
' X' Q4 u& U% P7 ]& |7 J
3 Q" Q- g8 R+ d5 A. b% v5 d> map((x)->1/x,M);' ~$ {" D+ h- a
! B8 o! {, q  f; i" ]$ G
3 求 值: x9 j! z  G9 M2 z0 [! H  |
3.1 赋值
1 T! o5 U* g; Z) @在Maple中, 不需要申明变量的类型, 甚至在使用变量前不需要将它赋值, 这是Maple与其它高级程序设计语言不同的一点, 也正是Maple符号演算的魅力所在, 这个特性是由Maple与众不同的赋值方法决定的. 为了理解其赋值机制, 先看下面的例子.
- S" @9 f8 S0 J4 D( p, m1 k> p:=9*x^3-37*x^2+47*x-19;$ W6 t* r6 e4 ~5 P8 Q
; P5 H9 @' k$ _9 F/ |+ w$ N
> roots(p);
9 V5 p( N* G1 `. I' }& y
* P- E, k* O7 f9 E& J> subs(x=19/9,p);/ E) c, p1 _) b+ J, V$ o+ F+ p

3 t7 u0 D& r  U: r7 h8 j$ G在这个例子中, 第一条语句是一个赋值语句, 它的作用是把变量p和多项式9x3-37x2+47x-19相关联, 在此之后, 每当Maple遇到变量p时就取与之唯一关联的“值”, 比如随后的语句roots(p)就被理解为roots(9x3-37x2+47x-19)了, 而变量x还没被赋值, 只有符号“x”, 通过subs语句得到将p所关联的多项式中的所有x都替换成19/9后的结果, 这正是我们在数学中常用的方法—变量替换, 但此时无论x还是p的值仍未改变, 通过“> x; p;”这样的简单语句即可验证.
: H: A3 ~- T) L" F) a" p2 _3.2 变量代换) v+ L7 ?0 _+ A
在表达式化简中, 变量代换是一个得力工具. 我们可以利用函数subs根据自己的意愿进行变量代换, 最简单的调用这个函数的形式是这样的:   % h' d* q3 S4 u. f& Q6 ^/ C$ j
subs ( var = repacedment, expression);
6 W, j% |0 g" s. r( N- T* V调用的结果是将表达式expression中所有变量var出现的地方替换成 replacement.
) ]3 K# P9 ?' G- O3 z4 D2 {. Q8 G' G> f:=x^2+exp(x^3)-8;; B, X$ m( W- A( L
' b( g+ T' D1 ]9 n
> subs(x=1,f);( o% Y& ]! j- _  E+ N

9 q% F2 i2 S  s) a. |> subs(x=0,cos(x)*(sin(x)+x^2+5));
, T; e3 ~2 [: {  T% o" B
/ F4 E( m0 @- {  ]4 v5 o6 o    由此可见, 变量替换只得到替换后的结果, 而不改变表达式的内容, 而且Maple只对替换的结果进行化简而不求值计算, 如果需要计算, 必须调用求值函数evalf. 如:   
- @2 f* x. q5 c6 u> evalf(%);* }6 @: G; D3 o9 s

: M/ Y: |. N( J- X% ~* \( t- h7 v$ a1 d& ~变量替换函数subs也可以进行多重的变量替换, 以两重代换为例:   
& G$ ^+ y4 O) A$ Z# _subs (var1 = repacedment1, var2 = repacedment2, expression), w" k$ l: @' T# o+ i0 b% r
调用的结果和按从左到右的顺序连续两次调用是一样的, 也就是先将expression中的var1替换成replacement1, 再将其结果中的var2替换成replacement2, 把这种替换称作顺序替换;    与此相对, 还可以进行同步替换, 即同时将expression中的var1替换成replacement1, 而var2替换成replacement2. 同步替换的调用形式为:   
! ?; r- b1 z5 y! ]+ F0 jsubs ( {var1 = repacedment1, var2 = repacedment2 }, expression), `, t- U6 C4 c1 Z' E
下面通过例子说明这几种形式的替换. 9 Z" R- J* K% O( Q7 e" h+ ?
> subs(x=y,y=z,x^2*y);              (顺序替换)
1 q7 c" h! n" p, ^, W; x
* P: k; v+ ^# @" {> subs({x=y,y=z},x^2*y);            (同步替换)5 m0 U1 V* n, |

( T; e# C4 S8 F* y8 U- _> subs((a=b,b=c,c=a),a+2*b+3*c);   (顺序替换)
# Y* G4 M& Q/ O0 ~+ _ : o6 S0 C" u4 e/ Z% k; u
> subs({a=b,b=c,c=a},a+2*b+3*c);    (轮  换)" \5 L0 T3 D4 `1 M% V+ d
. o% I0 |+ [( r% u" n# E$ h7 q
> subs({p=q,q=p},f(p,q));             (互  换)
0 @  Z' _' v: `% p% I; N2 W% A& D 6 o$ i' ]6 A9 p* h
3.3 假设机制
1 l+ R& R7 x/ h$ a- H7 eMaple是一种计算机代数语言, 显然, 很多人会尝试用Maple(或其他计算机代数语言)解决分析问题. 但由于分析问题与处理问题的考虑方法不同, 使得问题的解决存在某些困难. 例如考虑方程 的解. 如果k是实数, 结果显然是x=1, 但如果k是 的复根, 为了保证解x=1的正确性, 必需添加附带条件: 也就是当 时x=1. 这是一个对结果进行正确分析的例子. 然而从代数的角度考虑这个问题时就会把k当作不定元, 此时k没有值, 从方程两端去除k的多项式是合法的, 只要这个多项式不是零多项式即可(这一点是可以保证的, 因为其所有系数不全为0). 在此情况下x=1就不需要任何附加条件. 计算机代数系统经常采用这种分析的观点. 4 K9 d7 F# @* G# N4 n$ o7 f
在Maple中, 采用分析观点解决这类带有一定附加条件的实用工具是函数assume, 其命令格式为: assume(x, prop);
) \* L2 V) N& o5 `2 }* s函数assume界定了变量与变量之间的关系式属性. assume最普遍的用法是assume(a>0), 该语句假设符号a为一个正实常数; 若假定某一符号c为常数,使用命令assume(c,constant); 另一方面, assume可以带多对参数或多个关系式. 当给定多个参数时, 所有假定均同时生效. 例如, 要定义a<b<c, 可以用assume(a<b, b<c); 同样地, 要定义0<x<1, 可以用assume(0<x,x<1). 当assume对x作出假定时, 以前所有对x的假定都将被删除. 这就允许在Maple中先写“assume(x>0);”后再写“assume(x<0);”也不会产生矛盾. & `( M) e. y7 Y1 c: [% K# O
> Int(exp(-s*t),t=0..infinity);
/ n7 F0 R4 A; A& p" v& k/ `' z 9 q  K3 P& @' f3 n. ]4 h
> value(%);& ~2 Q3 ]2 W& Y/ S
Definite integration: Can't determine if the integral is convergent.! r9 B0 Y3 p9 X" u
Need to know the sign of --> s+ N8 J3 r6 F! j
Will now try indefinite integration and then take limits.
* i" N9 ?$ S& m7 k+ ? 3 U  \: T2 ^. m) k; T
> assume(s>0);7 @$ v3 o0 }3 w( g
> Int(exp(-s*t),t=0..infinity);; t( _( |1 Q0 B

, K- G" i" i1 ]6 a- T- J> value(%);" T( L9 Q0 |  U! y

; b9 U6 ^4 P4 v4 i9 O' K5 s1 f1 l3.4 求值规则
1 D$ g* X- ^* @( z0 a1 u8 Y在多数情况下, Maple的求值规则设计为做用户期望的事情, 但要做到这一点很困难,因为不同的人在相同的情形下会有不同的期望. 在大多数情况下, 全局变量被完全求值, 局部变量被一层求值. 而由符号' '界定一个暂时不求值的表达式, 单步求值仅去掉引号, 不作计算, 这也是允许取消指定名字或清除变量的原因. 如下例:   
# p: X% |! [& t( T/ @> x:=y;& D% w* e% c5 w* C  }
+ _7 @; D3 r. E9 t: J1 i
> y:=z;
( k6 ~: }) a" q& m3 M0 E; o; X 1 y8 Y2 H  Z5 @% J5 f
> z:=3;; D+ p0 {* x+ |; |5 P. Y

8 D1 a1 l3 x! y! c& J9 d: K6 M> x;
# m* X# m8 N  A' P
- E! Y# j  E. g4 e: ^& k* m> y;
- ~- y! z7 b8 D- x3 t8 H9 U2 Q: _
2 h, }8 n* W6 n! g> x:='x';+ \: @& I  D; s3 N
/ M/ y/ ]5 w. P  \; N
> x;- o) W. E+ \3 m! Z
* i+ O) ?: E7 y% `* K' N. s5 t
> y;
0 ?% v& r* a5 O4 E9 ]" i: ~. i - u" K4 ^  b8 Z8 a/ j# p+ W! S7 J
对于不同的问题, Maple设计了不同的求值命令. 现分述如下:   7 N9 ]" i( {: j9 ^% M
1) 对表达式求值$ e; ?* w& r2 O
命令格式: eval(e, x=a);  #求表达式e在x=a处的值
8 k5 c& d  Q& o( g) c; R             eval(e, eqns); #对方程或方程组eqns求值
/ w  v+ ~/ K0 ?& ]! ]# j             eval(e);      #表达式e求值到上面两层
& H5 N$ I+ E5 h: V; c) ~& \             eval(x,n);    #给出求值名称的第n层求值
$ W/ b7 W6 _# ?6 f> p:=x^5+x^4+x^3+x^2+x+73;
/ @  \5 B' g4 a0 T 9 K- F0 j8 i$ `% U! a* b. |$ c( x
> eval(p,x=7);9 T( n: b0 r& \

! U+ e. ^3 J' w5 k$ e4 E: I> P:=exp(y)+x*y+exp(x);; p: W' W" U7 g7 y( S/ P, n0 k* s$ G( v
& m$ c% ~) D" [6 w# H/ L
> eval(P,[x=2,y=3]);% y: t1 p( W# g
4 T+ ?9 O. A  }3 l& F* {9 F: S2 J
    当表达式在异常点处求值时, eval会给一个错误消息. 如下:   
5 ?4 t1 I! u. s+ g# _> eval(sin(x)/x,x=0);
: Q6 z8 o7 l% ]; m1 nError, numeric exception: division by zero' Z# C% p1 H- K- _
    下面再看使用eval进行全层求值或者对名称几层求值的示例:   
5 l' z7 g) ~/ A' q. H> a:=b: b:=c: c:=x+1:' b9 |  _6 K7 @5 [
> a;              #默认的全层递归求值  ^" q% t" G5 c

) [* w1 a* a  d  L$ ?> eval(a);        #强制全层递归求值
! g; V) T  t/ g& u& S: H7 [5 W3 h 2 G" F# y0 q- z' X
> eval(a,1);       #对a一层求值
1 I7 \  V* b% r  R, S8 _ ' h* }; l1 p* c( [. z
> eval(a,2);       #对a二层求值
3 _* g7 A) U, ~$ c# R: f/ D % a0 j2 K* J1 W# g4 {, k$ t
> eval(a,3);       #对a三层求值6 d+ }/ A* w* o  u( ?, ]  t; b, f
2 T+ d3 c% x. N( f% e7 ~! l
> eval(a,4);       #对a四层求值
% Q- \+ H3 y- p; e. `! I 1 ~" d  d5 m" y( Z- n9 T+ R
    2) 在代数数(或者函数)域求值2 g1 {+ a( j8 V6 [. j
命令格式: evala(expr);       # 对表达式或者未求值函数求值+ B; e  q& D- r5 @- y( D) x9 a' I+ K
             evala(expr,opts);   #求值时可加选项(opts)
" n5 c4 j% o6 a$ N: a$ j所谓代数数(Algebraic number)就是整系数单变量多项式的根, 其范围比有理数大, 真包含于实数域, 也就是说任意实数都是整系数多项式的根(如 就不是任何整系数多项式的根). 另一方面, 代数数也不是都可以表示成为根式的, 如多项式 的根就不能表示成为根式的形式. 7 y" C: ^0 e, d+ g0 t; o# k5 X
代数数的计算, 算法复杂, 而且相当费时. 在Maple中, 代数数用函数RootOf()来表示. 如 作为一个代数数, 可以表示为:   
7 E7 e6 G% p: }, _9 D' H> alpha:=RootOf(x^2-3,x);# C: q1 P1 o7 k0 s' L% n  d
9 b: ^4 i- Z" f7 Q3 z) T9 r0 Y
> simplify(alpha^2);
1 E* f, Y6 g) P7 D' p* o; ]# s* g 6 q# i! `8 l0 E
在Maple内部, 代数数 不再表示为根式, 而在化简时, 仅仅利用到 这样的事实. 这里, Maple用到一个内部变量_Z. 再看下面一个例子,其中alias是缩写的定义函数,而参数lenstra指lenstra椭圆曲线方法:: m: n0 }" `' M8 D8 r
> alias(alpha=RootOf(x^2-2)):
0 ~* M: l8 ?; j> evala(factor(x^2-2,alpha),lenstra);: O: k2 ?/ t+ g1 W6 x, c* T
1 x: u9 j1 `# f2 L
> evala(quo(x^2-x+3,x-alpha,x,'r'));
6 b; F+ \0 d! ?   u) l4 ^( \, p- N+ w
> r;
2 L2 w/ o4 J3 m/ t+ N- t
4 `' ^# R. b  Q# Z3 v* ~7 f> simplify(%);
1 ?0 Z* q& x( V& E" `, \( @( I% O, o4 D
$ Q$ A, A$ X" z0 @$ \3) 在复数域上符号求值* o9 M* I# f4 P/ B. d3 u
操纵复数型表达式并将其分离给出expr的实部和虚部的函数为evalc, 命令格式为:
* h) x8 `8 K4 l: u7 F* D9 yevalc(expr);   9 D/ N% K1 d2 r
evalc假定所有变量表示数值, 且实数变量的函数是实数类型. 其输出规范形式为: expr1+I*expr2.
' ?4 G; s/ A( a/ s. V4 C> evalc(sin(6+8*I));
- v9 N- l) I  C' d3 F
- c% a# D! e( W1 I' x5 s2 F) |> evalc(f(exp(alpha+x*I)));
5 E& i/ U1 |6 m: {& ~
/ `$ G* t' b( m  F: r> evalc(abs(x+y*I)=cos(u(x)+I*v(y)));
& T! R9 S+ I5 ]2 G . _; g6 A: l. w2 U
4) 使用浮点算法求值
+ P/ }& n* }, ]  S浮点算法是数值计算的一种基本方法,在任何情况下均可以对表达式expr使用evalf命令计算精度为n的浮点数(n=Digits), 如果n缺省, 则取系统默认值, 命令格式为: evalf(expr, n);     
% b5 o1 F. G$ r5 ^. R6 O  Y5 h> evalf(Pi,50);   
8 g1 y6 q7 }5 s0 w6 z5 M+ L
/ |/ R6 c$ u: f! w' C> evalf(sin(3+4*I));   
5 U+ \2 S+ e1 R , H% I/ u& w3 m
> evalf(int(sin(x)/x,x=0..1),20);0 ?( h3 h, m: x1 _) A- n

9 L3 h' p3 v, ?( W. `5) 对惰性函数求值
" `: E- s! z7 D' `- r5 ^把只用表达式表示而暂不求值的函数称为惰性函数, 除了第一个字母大写外, Maple中的惰性函数和活性函数的名字是相同的. 惰性函数调用的典型用法是预防对问题的符号求值, 这样可以节省对输入进行符号处理的时间, 而value函数强制对其求值. 对任意代数表达式f求值的命令格式为: value(f);   
! U  G8 a! ~7 B; p" g> F:=Int(exp(x),x);6 X7 ?5 @: O6 |2 m) G# l

7 K! ?, s2 M& }; v3 i' Z' k> value(%);
/ x# j2 g9 ~& ^; |( J 3 h7 }! n7 e; b: {: m
> f:=Limit(sin(x)/x,x=0);/ U( g6 l) T3 o+ s) V# U; |6 i
9 u% {4 T* C9 Y& N/ y
> value(%);: K5 i: @4 F% G# o* q) ^' R" D
2 N2 ?. S7 o0 \. t4 j( F
另外, 将惰性函数的大写字母改为小写字母亦即可求值. 如下例:   6 t. A% G: ^" q
> Limit(sin(x)/x,x=0)=limit(sin(x)/x,x=0);# y% u% g* Z% q$ s2 V/ \: g* _
$ I$ [( e  G4 D1 x( v* Z' d7 g9 t
4 数据结构! w% |  O$ \7 l
Maple中有许多内建的与FORTRAN、C或Pascal不同的数据结构. 主要的数据结构有序列(sequence)、列表(list)、集合(set)、代数数( algebraic number)、未求值或惰性函数调用、表(table)、级数(series)、串(string)、索引名(index)、关系(relation)、过程体(process)以及整数(integer)、分数(fraction)、浮点数(float)、复数(complex number)等数据结构, 而矩阵(matrix)在Maple中表示为阵列, 是一种特殊的表. % L  l1 h- o- ^/ l2 v- P. M+ v
4.1 数据类型查询& g- H3 @2 r; T- a" d+ n) f
在Maple中, 用whattype指令来查询某个变量的数据类型或特定类型, 命令格式为: " N9 H' a7 @* N
whattype(expr)        # 查询expr的数据类型. D" P( f: _4 J8 K' w
type(expr, t)           # 查询expr是否为t类型, 若是则返回true, 否则返回false
8 d3 R( U& W# r> whattype(12);
. \# |; o  f, ?) d! H) D ( q" Y7 K& Z' H' r5 z
> whattype(Pi);4 l9 J$ @$ p. \# G$ h
/ J0 B1 {" {5 p) I: w; U
> type(1.1,fraction);
( [9 h( j6 B2 X9 L3 U9 q: ~
" k( x8 P* |% V, R> whattype(1.1);
9 Z' r3 {! {& S6 F
/ G4 K% A2 x3 Q/ e, |4 a+ I4.2 序列, 列表和集合9 N! H1 `$ D0 @
4.2.1 序列2 m; w/ P$ q5 f9 S9 r# _
所谓序列(Sequence), 就是一组用逗号隔开的表达式列. 如:   : p  m% y* z) i5 f# T7 P% m
> s:=1,4,9,16,25;
2 A, c+ H/ w% f" `0 B+ o : ]4 V" l& o- c% @" f) w
> t:=sin,com,tan,cot;
+ ]0 ?* L" h4 {4 f* |7 w
4 {" _/ b: M7 r. \% _一个序列也可以由若干个序列复合而成, 如:   ) R6 z! R+ [" l5 c! \
> s:=1,(4,9,16),25;
' v- A/ N- u2 u. ^5 z 2 I8 Z( T. ]8 O0 A1 L+ L; u
> s,s;( z# F* x. N2 z' Q: O
* [8 n! @( C6 G, h% l0 w3 X' |
而符号NULL表示一个空序列. 序列有很多用途, 如构成列表、集合等. 事实上, 有些函数命令也是由序列构成. 例如:   
8 s3 d) Z6 b% p/ Y> max(s);
/ M7 K0 V; _! N( |& b6 u* R' p0 [
+ f' x6 _7 \3 T' [7 l1 z# O> min(s,0,s);
# _5 [+ u& _6 M! A7 O" t' C 0 A( r- Z# s! y) o- [$ O, ~
值得注意的是, op和nops函数命令不适用于序列, 如op(s)或nops(s)都是错误的, 如果要使用op(s)或nops(s)前应先把序列s置于列表中.
9 v" U0 ~% Y$ A> s:=1, 2, abc, x^2+1, `hi world`, Pi, x -> x^2, 1/2, 1;
+ Q6 J+ S" D: ~+ b
, n8 f( X/ F4 s0 I+ l' V* K! v7 ]> op(s);! a; o3 Z$ y) {' v( G: }4 u: q) A
Error, wrong number (or type) of parameters in function op
, _# Z/ v$ b4 _5 f. ~) O> nops(s);
3 l% k* }2 ?' f6 r4 U  ?Error, wrong number (or type) of parameters in function nops
6 P! I9 L  x  {4 b3 R; S+ ]> op([s]);
; f. z& w  |( W6 |
: u% ~. F! ?# r; N# k) u> nops([stuff]);
/ s, C  I" M, `
* Q6 z# K0 l: U+ ~+ f; Y1 N8 L函数seq是最有用的生成序列的命令, 通常用于写出具有一定规律的序列的通项, 命令格式为:   3 D# G- }; B" Z4 I" ^, b
seq(f(i), i=m..n);  # 生成序列f(m), f(m+1), …, f(n) (m,n为任意有理数)
) n+ j5 c& U5 l  t9 D7 `$ tseq(f(i), i=expr);  # 生成一个f映射expr操作数的序列
) w# s( U; C) R# G7 pseq(f(op(i,expr)), i=1..nops(expr));  # 生成nops(expr)个元素组成的序列
% o7 g6 L; ]* i2 A: e& T> seq(i^2,i=1..10);
$ l& Y/ g3 B) l/ o
( I2 X8 w( _. ^> seq(ithprime(i),i=1..20);
* r& g$ Q7 a0 t0 j# R
" q- R0 _* ?: F2 R' g9 H& m> seq(i^3,i=x+y+z);
( u: V/ J8 M5 _9 m) h + z3 U, l1 y/ V& M/ C
> seq(D(f),f=[sin,cos,tan,cot]);9 J9 A! z) [2 N
: ]) Y$ }) k  |- G) v2 j3 q, Z
> seq(f(op(i,x1+x2+x3+x4)),i=1..nops(x1+x2+x3+x4));
- c+ a) |, Z/ T% B7 ` / t2 x3 @. {0 y+ V" d7 G
获得一个序列中的特定元素选用操作符[  ], 如:   ' o/ S/ R" C& G6 y0 ]( L& f
> seq(ithprime(i),i=1..20);
! ?# ~: p9 F. t# |0 S% M8 F - K- u: F, G3 L
> %[6],%[17];9 Y; C0 l' n" K2 Z! M

- o1 A- w; s$ c( D) l& x4 K4.2.2 列表8 W- }* p  O- @* v
列表(list), 就是把对象(元素)放在一起的一种数据结构, 一般地, 用方括号[  ]表示列表. 如下例:   
+ e3 \' B8 T0 _0 }! F> l:=[x,1,1-z,x];) N( }5 e: d# r. t9 T! u
3 C4 X7 T( l. U: N# \- M% ~% p
> whattype(%);7 }2 ]1 s; r/ T+ @. w

; O0 X5 g  L% I% \9 H空列表定义为[ ]. 8 L& |$ J9 T7 l2 y. B$ x) W
但下述两个列表是不一样的, 因为对于列表而言, 次序是重要的:   0 W! B- q+ @% h. D
> L:=[1,2,3,4];
5 v1 K. Q# }  W
9 a3 o" G; Z3 Y6 E- ^( g> M:=[2,3,4,1];
3 t8 n0 R. K: m
) L! d5 q9 O) I" i1 t! _# H# f4.2.3 集合/ g! q7 u* I: A) c; F
集合(set)也是把对象(元素)放在一起的数据结构, 与列表不同的是集合中不可以有相同的元素(如果有, Maple也会自动将其当作同一个元素), 另外, 集合中的元素不管次序. 一般地, 用花括号表示集合. & |: Z2 y6 ^3 \9 T" u/ W0 F
> s:={x,1,1-z,x};
" y* a, r3 }3 m# u' a3 Q0 i6 q
7 S+ x/ W# i7 a3 p( O1 s> whattype(%);
8 G/ z+ ?8 z4 P; s5 l( B * C# ~0 \" J5 M/ Z9 D$ t
空集定义为{ }.
* k+ m, D2 i6 W3 L: L: @1 f; J函数nop返回列表或集合的元素数, 而op则可返回其第I个元素. ( v# ]* ~0 j1 ]; q
> op(1,s);& Z5 d8 N0 ~3 [' i7 j
/ J% k9 t0 D% G* w1 p
> s[1];
, d: B- T* J2 P# _. D
# U, }" i* ^: x  B5 S6 A> op(1..3,s);  i2 M. d" n% ?
0 p0 T0 k* W6 }, q5 B* l! P1 b
> s[1..3];2 O( Z# C0 v8 B  T1 W
& N* Y% n4 I! i
函数member可以判定元素是否属于一个列表或集合, 如果属于, 返回true, 否则返回false. 1 d  i% A4 B* A8 a  t' \
> member(1+x,s);  N- |$ y& r, _4 O! j7 S
+ h+ W/ ~3 j+ K6 \
可以通过下述方法在列表中增减元素:   . M9 A+ U. x: B& M  z8 T5 _4 t  Y
> t:=[op(s),x];7 |& X! D+ l, ]

* Z6 U+ J8 ~  w> u:=[s[1..5],s[7..nops(s)]];. F8 s8 r4 f! Z, Y1 o$ C, t, o
  D  O, T4 _; q8 N8 C' b2 R
Maple中集合的基本运算有交(intersect)、并(union)、差(minus):   ( c0 h$ ]% A" K6 k/ t
> A:={seq(i^3,i=1..10)};B:={seq(i^2,i=1..10)};5 W+ `/ I+ d$ S. E9 G+ I' I1 K

( }4 K9 L! A5 u5 J5 R 0 F2 R4 [8 S$ M5 L+ j
> A intersect B;
7 s" n6 a( R  }7 M
: D3 r& t+ K  F0 [> A union B;
0 w3 B  I; @( w5 L- d+ \  V' n
4 ?; t. M8 l4 @# b> A minus B;& H2 n, Z, ?5 g

  A7 o0 `7 \. F4.3 数组和表* j" J* k5 d/ n9 n" J' J/ D2 C/ h) a
在Maple中, 数组(array)由命令array产生, 其下标变量(index)可以自由指定. 下标由1开始的一维数组称为向量(vector), 二维以上的数组称为矩阵(matrix). 数组的元素按顺序排列, 任意存取一数组的元素要比列表或序列快的多. 区分一个数据结构是数组还是列表要用“type”命令.
( I4 v$ G! x, H7 u% |6 n    表(table)在建立时使用圆括号, 变量能对一个表赋值, 但一个在存取在算子中的未赋值变量会被自动地假定是表, 表的索引可以成为任意Maple表达式. 表中元素的次序不是固定的.
0 q. b( o# l( _" a2 Y> A:=array(1..4);5 T+ n  N! p* n7 b' f; b
0 ^: D& f- ]( o" J
> for i from 1 to 4 do A[i]:=i: od:
2 N, r" O$ j( u" c% n4 T> eval(A);
  p0 y5 U, h9 j
+ B$ f& x# ~5 Y+ E; _9 k> type(A,array);- C" c/ z9 r7 Q8 o4 a. U: G

4 ?$ c' M- ]8 u) T> type(A,list);
& i0 O; ~) _; f7 n' m
! ]& |, b( H# m3 p( Q. i> T:=table();
% x$ h, ?5 ]' G# a( B; A
- p, \1 |  O& d- K; n$ L> T[1]:= 1;) C0 m7 g. M3 J- F( s

  }& b" G3 R3 X! a- b> T[5]:= 5;
, b$ c) m. _; E: b9 N
1 ]3 u) a2 l0 x1 E> T[3]:= 3;
5 y, \  c4 O& f  r" ?
1 r# F( L, T! ^' m0 f& u" i> T[sam]:=sally;
9 ^" S& t# N" E; c& S& H
: b9 @# K3 ^% G1 _> T[Pi]:=exp(1);# q3 N( ]" I9 _8 @8 u  b

7 S* O; Y7 V% s> x:='x';
# c7 v7 p* W( Z. h$ D $ c- n( @9 V2 w8 j; b
> T[(1+x+x^3)*sin(x)] := 0;6 E4 G( y8 t: E: l

- L: h+ D/ J9 ^7 ~> eval(T);- k) `0 w0 A& F

" x3 G4 |0 R" C- g> T[3]:='T[3]';
3 ]6 s: E$ \. r0 A9 s
# r: t/ o# y% M* w# S: _> eval(T);
# L7 s( z/ ]) S & x* Q% C2 G( y" o
4.4 其他数据结构0 h% f( D: v0 P! M# _0 o
串在Maple中是很重要的, 他们主要用于取名字和显示信息. 一个Maple的串可以作为变量名, 它们中的大多数是简单的、不需要加引号的串, 但是如果变量名中包含/. 例如“diff/T”则必须把变量名用引号括起来. % o; e; o- l" m$ u  l) z- U
索引名是像Database[1,2,drawer]或A[3]这样的对象, 在使用索引前不需要直接建立表, 如果不得不做, Maple会自动建立表. 索引名通常被用于矩阵和向量. 为了保证Maple建立表的正确次序, 建议在赋值前直接建立.
/ |$ p+ U8 R( T( H  `! J8 P> x:=T[3];
' p( V: T7 l$ D/ }
5 g# R9 K/ r" i& I2 Y4 _> eval(T);- }2 x1 S6 W7 B7 n7 I4 B
* p- I3 J. h$ J9 m6 N
> T[5]:=y;% t7 j! D" n4 G, T8 Q4 ~

( ^; D5 e: |" l0 J> eval(T);/ `8 a/ N. u6 t+ f" V% d3 I

8 d# b5 O5 h1 S% m1 z由此可见, Maple并不直接建立T的表, 直到给T[5]赋了值.     
: D, i3 n2 k" V1 n4 r数值数据结构(整数、分数、有理数、浮点数、硬件浮点数和复数等)在它们的使用中是大量透明的. 浮点数是有传染性的, 这意味着如果数值结构中有一个是浮点数, 则整个结构自动转换为浮点数.
. h$ b, c/ I/ H2 a; t) P+ e- p4.5 数据类型转换和合并% k2 O! R* [( v# `1 e
convert是一个功能强大的类型转换函数, 它可以实现列表和数组的类型转换:   $ `' E* u' q- P
> L:=[1,2,3,4];
1 k% u6 i  K9 g7 `$ x! V" i! U : i7 G5 S. R' ^! N7 B  z, n% o! M
> type(L,list);* y; _9 J, n$ C3 q" E3 E% s

" E' z/ \" X6 ^1 a> A:=convert(L,array);$ w- B, }& V+ n9 K& n" u
0 B" U( v" p6 [. `5 c1 b, ?# d/ C: G
> type(A,list);
, ~& {, `( f1 r5 m& T, F$ ?
3 L3 m( m  b' J( E7 Z> type(A,array);2 T+ {, A4 y: j7 _; f; @

! y1 q. B( B  W) q) i另一个有用的函数zip则可把两个列表或向量合并:   7 a9 ~1 ^- @% p8 S
>L:=[seq(i,i=1..10)];
  `' i* Y1 w$ S, C
$ V( |8 H2 q2 [+ t7 m. l$ S, j. ~> Sqr:=(x)->x^2;+ C$ B" p# t$ l; r: b( Z7 I1 ]
# W  k6 q, l/ Y/ ?# r
> M:=map(sqr,L);% m7 \0 r- X3 O5 U: x% ]' }

+ V, _3 q6 E  C( }6 x# m1 a1 M> LM:=zip((x,y)->[x,y],L,M);
$ k, K, s9 V) l/ i% K. Y ) z' d0 t+ b- K
> map(op,LM);
) S+ x0 w- \1 m6 S/ R & v' d) P) ~0 N9 R: {
5 Maple高级输入与输出操作
. u2 h' M1 G7 q& q& K) A& t9 V. AMaple提供了良好的接口来编辑与计算数学式. 许多时候, 我们可能需要把Maple的运算结果输出到一个文件中, 或者在一个文本编辑器里先编好一个较大的Maple程序, 再将它加载到Maple的环境里.
, _+ U& I0 P% K0 {5.1 写入文件
% O- P: ^' v* f1 S  {6 ]$ V( K5.1.1 将数值数据写入到一个文件% j9 L/ c1 W, e4 p8 c/ m
如果Maple的计算结果是一长串的数值串行或数组, 而想把它写到一个文件时, 用writedata命令. 7 L2 O4 z2 O* e2 `! F, o  `, R  u
若Maple的计算结果data为集合、矩阵、列表、向量等形式时, 将其写入名为filename的文件时命令格式为: writedata("filename", data);8 h9 C& b2 Q# ?. p
> with(linalg):  d/ I4 \" m) k. R6 Q1 Q
> M:=matrix(3,3,[1,2,3,4,5,6,7,8,9]);3 C0 }8 D* ]8 M7 H

8 Z$ _: a! d0 q4 t> writedata("e:\\filename.txt",M);  x, @# `5 t% e8 e
而将结果附加在一个已存在的文件后时,使用命令: writedata[APPEND]("filename", data);
; [# Q) ?' D2 A3 N3 G> W:=matrix(2,2,[1,2,3,4]);& g+ N; I5 y0 I4 Q" L6 B$ H
5 L0 i9 i3 G6 M2 U  U. Q8 e
> writedata[APPEND]("e:\\filename.txt",W);
9 S2 D- d; p2 }! f* J/ y% l6 o需要注意的是, 这里的APPEND是必需的, 否则W结果将会覆盖M结果.
) E2 ?$ h/ Z: D2 U/ F0 \9 A另外, 若想将结果显示在屏幕上时, 用命令: writedata('terminal', data);
7 P" ?# s4 o8 W# {. k2 t> writedata[APPEND]("e:\\filename.txt",W);   I# J' \. F8 }6 T/ Y0 z7 O+ `% p
> writedata('terminal',M);5 K; y  |: u2 h* f
1                   2                   3           
/ J- v0 v2 g2 N$ a9 [4                   5                   6           
% {3 A! |/ H% h. N* \7                   8                   9   
, `- ~6 l" \9 `0 u  d' B5.1.2 将Maple语句写入一个文件
7 {0 [9 B5 z! K" r+ r$ Z3 {; d& ~如果所要写入文件的是表达式、函数的定义或者是一个完整的程序, 则使用命令save, 写入一个或多个语句的命令格式分别如下:/ a) x5 T. ]+ e) j/ Z! }7 i
save name, "filename";
9 A6 F  O: s- \1 U1 J/ X9 r- Bsave name1, name2, …, "filename";
( L6 V. ?: ~6 ~  g! {若filename的扩展名为.m, 则Maple会以内定的格式储存, 若扩展名为.txt, 则以纯文本文件储存. 以内定的格式储存的文件作纯文本编辑器无法读取, 但在大多数情况下, 它会比纯文本文件的加载速度更快, 且文件容量小.  h! @6 g/ C; }, C, X" P" i
> myfunc:=(k,n)->sum(x^k/k!,x=1..n);
' l  ~2 G9 K! s% K" E& G' ^3 D% b
% _. I6 l- c+ Q> myresult:=myfunc(6,8);
$ {2 o# |4 v% R: C# [, c
3 C8 t; H$ O. |> save myfunc,myresult,"e:\\test.m";7 B, \1 v$ e4 e3 [' B
调用已存m文件用命令read. 试看下述实验:
7 ?' d3 g9 X. ~& N. P> restart:
+ J% v3 y  \; S7 Q> myfunc(6,8);. y8 s8 i3 f- Q+ w% Z4 ^" A

6 C! L7 R( K3 [  Q% t3 j- r6 r> read "e:\\test.m";
8 t+ S" e  y$ z$ u> myfunc(6,8);
* E  n  P9 E% l& \0 _, d. D & x. ^) X& {- ~
> myresult;' j& M# x0 H* d' z
0 V2 r% q6 k. R6 X
    而存为txt文件时则将整个语句存为一个文件:  I9 ]: }+ s$ u( j
> save myfunc,myresult,"e:\\test.txt";
" ^, r5 A: f3 A5 g$ [* I" |" M$ F  D> restart: read"e:\\test.txt";& H& M/ D2 E6 l4 y2 V& }9 h

% m- C  W/ X7 V( e, t  ] + P5 {4 Z) L9 m/ s; `0 h
5.2 读取文件5 ~5 L9 A$ s2 a# z% }
在Maple里最常用的两个读取文件的命令, 一个是读取数值数据, 另一个是是读取Maple的指令.7 u7 n! D3 d" R7 ]9 v9 D4 n- I$ f
5.2.1 读取数值数据, W2 a  G9 c4 @2 b5 ^+ w  ]* L2 |. `
如果想把大量的数据导入Maple里进行进一步的运算或者要运用大量的实验数据在Maple环境绘图时, 可以用readdata( )命令完成./ K# f+ B$ f' W3 {# g% a
从filename文件里读取n行数据时使用命令: readdata("filename",n);
; q0 p2 r: z) l2 N& q* r! V0 C# q8 O以指定的格式读取数据时使用命令: readdata("filename",[tyep1,type2,…]);+ \$ {0 X5 p6 L) X  V9 Q* \
> readdata("e:\\filename.txt",3);
& J" C& G& L! O7 n. N
0 {6 \0 `, _8 f    读取filename的前三列, 第一列为整数形式, 第二、三列为浮点数形式:5 t1 S8 o* u3 t' j
> readdata("e:\\filename.txt",[integer,float,float]);
3 a- y0 L- G6 j; H. T) c1 z   D3 d5 y  s2 N& @# C
下面再看一个运用大量的实验数据在Maple环境绘图的实验:5 h3 F" {; K' D( d# A
> mypts:=[seq([x/1000,cos(x^2/100000)],x=1..1000)]:  u4 [( u( F' v% J+ _. |
> writedata("e:\\data.txt",evalf(mypts));& e  S" k8 G$ H- r9 n6 e( W6 |
> dots:=readdata("e:\\data.txt",100):
% p+ H2 c3 \$ D" F> nops(dots);
" N- @- U+ L' h) `3 y% F : P7 s" \7 y+ A4 |6 M
> dots[1..4];
7 {- H+ @1 b/ a- \; W' q" \- m
! q! K; C# D" w% \+ ]> plot(dots,style=line);
4 ]7 a7 h4 D+ E, p- `' j ( z7 q6 s, _, L7 s, b
5.2.2 读取Maple的指令5 s% ^" v9 Y: g
在编写程序时, 在普通软件中先编好程序再将其读入Maple环境中常常比直接在Maple中编写更为方便. 如果要将程序代码或Maple指令加载用read命令:2 ]0 @! P; ^1 f- u1 F4 A
read "filename";
6 ]  O( y& d  k' {+ N5 w/ |: t) B如下例:5 d  H6 q  J* m& h. p
> reatart:; R8 D  P* \* ]8 ~& F% V
> myfunc:=(a::list)->add(i,i=a);7 L2 |7 Y8 C/ |  r
! I9 F4 o, `% s" Y
> avg:=(a::list)->myfunc(a)/nops(a);. t( ?% u% V- I( F2 ~
2 Q/ F8 h; b" H7 k/ }4 c% M, t
> save myfunc,avg,"e:\\function.m";
( G) @( l* B/ f8 |  u> restart:
$ b- h9 y* r! u9 _' M> read "e:\\function.m";) E1 J) q- g1 [5 g
> myfunc([1,2,3,4,5,6,7,8,9]);
) G1 E% w. V& P, F7 \" w" u + g6 \$ D) M) \5 w
> avg([1,2,3,4,5,6,7,8,9]);7 k! t$ Y9 N1 x; `& f, t$ A
& d$ n2 F) |, N) M  B5 S3 v
5.3 与其它程序语言的连接
" \, ^4 f' P+ J9 c$ N' U& D5.3.1 转换成FORTRAN或C语言
  Y" x- [# j" H8 M$ a, |调用codegen程序包中的fortran命令可以把Maple的结果转换成FORTRAN语言:, N$ Q* D- b  e, z1 G+ [
> with(codegen,fortran):
" Q+ o  u9 V  A2 e4 H: F3 c* if:= 1-2*x+3*x^2-2*x^3+x^4;
% v0 f/ {/ W+ t/ L% P2 _ 7 f. w; s& A' j3 @
> fortran(%);
+ V7 e/ e  e% h$ H5 w2 R/ M  n      t0 = 1-2*x+3*x**2-2*x**3+x**4
3 T) ]5 a' E0 r7 o > fortran(f,optimized);1 h# @% h5 f- p6 n) e- K
      t2 = x**2& Q8 O0 b' F6 q$ |' x
      t6 = t2**2- H% A+ m8 s3 C- }; S' J
      t7 = 1-2*x+3*t2-2*t2*x+t63 A/ Q9 t" f- \: P
> fortran(convert(f,horner,x));
0 U4 J5 A. }3 e/ h+ m      t0 = 1+(-2+(3+(-2+x)*x)*x)*x, o( [3 h/ @) U& M1 g* _
而codegen程序包中的C命令可以把Maple结果转换成C语言格式:
3 r: K1 Q8 v7 l& O* D3 S  ~> with(codegen,C):
- L- D* }7 \9 J* U% x8 Zf:=1-x/2+3*x^2-x^3+x^4;
$ |1 M. n, N4 w/ B* J: h: v9 g& \1 F) F* `
8 E4 A7 l3 P( G/ z* I7 q# o> C(f);0 z1 u# [. {) x% x2 ?7 w8 h
      t0 = 1.0-x/2.0+3.0*x*x-x*x*x+x*x*x*x;" M8 U( X: ~: |/ m4 i" B" K
> C(f,optimized);
5 C1 }' o( q8 s0 x      t2 = x*x;
5 |, d8 e5 c7 N( S! N2 {      t5 = t2*t2;
! @: R) j9 ^$ G% X) f      t6 = 1.0-x/2.0+3.0*t2-t2*x+t5;# t( O3 E' Z# U8 a7 l+ T
optimized命令表示要对转换的表达式进行优化, 如果不加此可选参数, 则直接对表达式进行一一对应的转换.
$ `9 D5 X# C7 M/ T7 }! z4 u5.3.2 生成LATEX
  f( ^  F! W( I; j! b  ?Maple可以把它的表达式转换成LATEX, 使用latex命令即可:2 W1 G  [- |  ~! q$ t8 J; C
> latex(x^2+y^2=z^2);8 T4 E5 k* g- b( W9 @
{x}^{2}+{y}^{2}={z}^{2}
, L& x( F" I9 ?( Q5 B8 K. H    还可以将转换结果存为一个文件(LatexFile):
9 d. }  v! m% ]5 f' H, ~> latex(x^2 + y^2 = z^2, LatexFile);* A6 g+ r9 m, ?% O
    再如下例:
9 n$ Q, S1 K1 }+ X! |+ {> latex(Int(1/(x^2+1),x)=int(1/(x^2+1),x));' f/ u- X5 ?1 n! t' D. i9 J
\int \! \left( {x}^{2}+1 \right) ^{-1}{dx}=\arctan\left( x \right)3 Q! W9 K2 s. m+ {- }
( m& f" \" s5 U
zan
已有 1 人评分体力 收起 理由
darker50 + 2 用word发不是很好吗?呵呵!

总评分: 体力 + 2   查看全部评分

转播转播0 分享淘帖0 分享分享0 收藏收藏1 支持支持0 反对反对0 微信微信
darker50        

107

主题

45

听众

1万

积分

  • TA的每日心情
    开心
    2015-4-9 15:42
  • 签到天数: 47 天

    [LV.5]常住居民I

    自我介绍
    开朗,爱各种娱乐的不老男生就是我了,喜欢数学建模,喜欢那种帮助别人的感觉。

    社区QQ达人 助人为乐奖 新人进步奖

    回复

    使用道具 举报

    33

    主题

    10

    听众

    1691

    积分

    升级  69.1%

  • TA的每日心情
    开心
    2014-7-8 08:29
  • 签到天数: 201 天

    [LV.7]常住居民III

    发帖功臣 新人进步奖

    群组PLC和单片机

    群组2012第三期美赛培训

    群组MCM优秀论文解析专题

    群组沈阳理工应用技术学院

    群组学术交流B

    回复

    使用道具 举报

    33

    主题

    10

    听众

    1691

    积分

    升级  69.1%

  • TA的每日心情
    开心
    2014-7-8 08:29
  • 签到天数: 201 天

    [LV.7]常住居民III

    发帖功臣 新人进步奖

    群组PLC和单片机

    群组2012第三期美赛培训

    群组MCM优秀论文解析专题

    群组沈阳理工应用技术学院

    群组学术交流B

    回复

    使用道具 举报

    46

    主题

    3

    听众

    1967

    积分

    升级  96.7%

  • TA的每日心情

    2014-4-15 00:06
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    社区QQ达人 新人进步奖

    群组数学建模

    群组数学趣味、游戏、IQ等

    群组LINGO

    听说女人如衣服,兄弟如手足。回想起来,我竟然七手八脚的裸奔了20年!# d/ q8 ~; G' s0 F  K: R

    8 I2 }, d9 ^2 y, l9 }' L
    ( p: o1 b0 ?8 j" C* s+ D0 S+ X5 H
    回复

    使用道具 举报

    0

    主题

    2

    听众

    19

    积分

    升级  14.74%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    0

    主题

    4

    听众

    181

    积分

    升级  40.5%

  • TA的每日心情
    开心
    2012-10-11 12:35
  • 签到天数: 51 天

    [LV.5]常住居民I

    群组学术交流A

    群组学术交流B

    回复

    使用道具 举报

    0

    主题

    13

    听众

    27

    积分

    升级  23.16%

  • TA的每日心情
    奋斗
    2015-9-29 17:01
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    社区QQ达人

    群组国赛讨论

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-4-16 08:25 , Processed in 0.579676 second(s), 101 queries .

    回顶部