QQ登录

只需要一步,快速开始

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

maple基础

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

1

主题

5

听众

4

积分

升级  80%

该用户从未签到

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

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

3 k/ H% @7 H0 K+ i; g$ u6 S ( I/ t+ `7 ^/ A4 a7 r! J

8 m9 b% q+ s4 c/ Y* `6 O & r: e1 _4 l5 C- e5 ~7 Z$ h& G

9 p; z  w' x9 v3 I) J3 ]: \. \ ) e5 g' A# _. t# B6 d0 b3 N7 s! y

; b( `( r* G/ y  t% F0 M 5 C3 h$ u: Q. x; z' @# H5 p* `2 a

9 {: m1 B% U0 P1 Z0 b" n8 T# }7 |7 z: b3 B4 Z& f5 j2 j; i% ?
alpha        beta        gamma        delta        epsilon        zeta        eta        theta        iota        kappa        lambda        mu
/ k; j+ x8 ~( ]# O  @7 K$ j
9 S6 Z8 T" k& N7 O8 S
, N; n9 J, W5 m- q0 E+ q, |
* w* W+ H& F# K# [ 0 C) l# j3 N+ ^

  t9 F) i8 C0 }, i
+ @# k. z: j$ |
7 x8 m! S% t" }9 T. Y
$ A% r4 S1 S0 G' B! U  ?
  w, O/ S* }, D8 I8 }4 |
5 I# ~! n; y1 U' i- F5 ~/ g0 c6 E/ U% z # y0 N1 W/ n4 \/ G4 m! a3 L$ u8 h
$ c, x) A, y) E* V
' H+ c7 y, I0 ~
nu        xi        omicron        pi        rho        sigma        tau        upsilon        phi        chi        psi        omega9 H/ |* X  Q# X2 C% V' V6 G$ n0 x; P
有时候为了美观或特殊需要,可以采用Maple中的函数或程序设计方式控制其输出方式,如下例:0 u4 U$ b6 x6 B. A2 h) H
> for i to 10 do 1 B" f* a6 j, h7 X* p* b& \
printf("i=%+2d and i^(1/2)=%+6.3f", i, eval(sqrt(i)));
4 S) V% t' S  I9 j# }od;
+ r/ K2 [: k! [. Zi=+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; O7 n7 ?4 @- w" `( |( W# f
+2d的含义是带符号的十进位整数,域宽为2. 显然,这种输出方式不是我们想要的,为了得到更美观的输出效果,在语句中加入换行控制符“\n”即可:
, O" w/ O5 A. e3 q" f4 B> for i to 10 do
8 z* o/ O# ~" c$ H. Z2 G; C2 qprintf("i=%+2d and i^(1/2)=%+6.3f\n", i, eval(sqrt(i)));6 T# x% C0 @! V& l# u
od;- E9 Z: _4 b( }' i4 F8 s% b6 e9 d
i=+1 and i^(1/2)=+1.000. w; _# J6 c+ k9 F' ^1 r4 M
i=+2 and i^(1/2)=+1.414+ p) Z) a- `' S: K' N
i=+3 and i^(1/2)=+1.732
' b) |$ v2 t! V3 G) ii=+4 and i^(1/2)=+2.000/ f1 ^7 x+ `3 [
i=+5 and i^(1/2)=+2.236
6 e1 t# k% u7 m; ui=+6 and i^(1/2)=+2.449
: ?6 X& ^, \- q% H9 d6 P+ ?: ~i=+7 and i^(1/2)=+2.646
5 N2 b+ q/ l3 V5 ]/ |1 Y+ ^i=+8 and i^(1/2)=+2.828
! N2 i# {5 \2 M1 ]2 O; wi=+9 and i^(1/2)=+3.0007 N1 o) s" B  P/ ^* i& |6 h
i=+10 and i^(1/2)=+3.1628 U8 y- P; Y/ D% `9 i3 K- H
再看下例:将输入的两个数字用特殊形式打印:1 Z$ a* j5 S0 H: C
> niceP:=proc(x,y)3 f4 T3 h( l2 U4 C
printf("value of x=%6.4f, value of y=%6.4f",x,y);
+ B$ I# t6 A! k; mend proc;) Y3 v0 g" N/ `- A8 }
3 V' t# U* O  r7 h) _. v
> niceP(2.4,2002.204);
  x3 r# T/ t& a* [& ~value of x=2.4000, value of y=2002.2040; [- Z4 L- w1 f0 [+ A( \
1.4 Maple联机帮助
3 n5 X# l% {3 e: c学会寻求联机帮助是掌握一个软件的钥匙. Maple有一个非常好的联机帮助系统, 它包含了90%以上命令的使用说明. 要了解Maple的功能可用菜单帮助“Help”, 它给出Maple内容的浏览表, 这是一种树结构的目录表, 跟有…的词条说明其后还有子目录, 点击这样的词条后子目录就会出现(也可以用Tab键和up, down选定). 可以从底栏中看到函数命令全称, 例如, 我们选graphics…, 出现该条的子目录, 从中选2D…, 再选plot就可得到作函数图象的命令plot的完整帮助信息. 一般帮助信息都有实例, 我们可以将实例中的命令部分拷贝到作业面进行计算、演示, 由此可了解该命令的作用. 2 u  h9 e, i/ ~7 U0 ?
在使用过程中, 如果对一个命令把握不准, 可用键盘命令对某个命令进行查询. 例如, 在命令区输入命令“?plot”(或help(plot);), 然后回车将给出plot命令的帮助信息, 或者将鼠标放在选定的要查询的命令的任何位置再点击菜单中的“Help”即可.
$ j9 D' y/ a- A3 E5 ]4 L2  Maple的基本运算
: p. u2 \* J+ s! ]5 u: M2.1 数值计算问题/ E) J- p, }7 k
算术是数学中最古老、最基础和最初等的一个分支, 它研究数的性质及其运算, 主要包括自然数、分数、小数的性质以及他们的加、减、乘、除四则运算. 在应用Maple做算术运算时, 只需将Maple当作一个“计算器”使用, 所不同的是命令结束时需加“;”或“:”. + {7 q! Z+ x' f8 k( O
在Maple中, 主要的算术运算符有“+”(加)、“–”(减)、“*”(乘)、“/”(除)以及“^”(乘方或幂,或记为**), 算术运算符与数字或字母一起组成任意表达式, 但其中“+”、“*”是最基本的运算, 其余运算均可归诸于求和或乘积形式. 算述表达式运算的次序为: 从左到右, 圆括号最先, 幂运算优先, 其次是乘除,最后是加减. 值得注意的是, “^”的表达式只能有两个操作数, 换言之,  是错误的, 而“+”或“*”的任意表达式可以有两个或者两个以上的操作数.
& c8 d% r& c, HMaple有能力精确计算任意位的整数、有理数或者实数、复数的四则运算, 以及模算术、硬件浮点数和任意精度的浮点数甚至于矩阵的计算等等. 总之, Maple可以进行任意数值计算.
! g8 w5 a3 \0 L  d/ ^- I: O6 ?6 n但是, 任何软件或程序毕竟只是人们进行科学研究的一种必要的辅助, 即便它有很多优点, 但也有它的局限性, 为了客观地认识数学软件、认识Maple, 下面通过两个简单例子予以说明. 0 Q, G; T0 y5 ~& {- w) ?
第一个简单的数值计算实例想说明Maple数值计算的答案的正确性:   
$ G& X8 {! Z' O$ {$ v- o> 3!!!;7 I0 M9 l# B5 v$ g) i0 H' p
2601218943565795100204903227081043611191521875016945785727541837850835631156947382240678577958130457082619920575892247259536641565162052015873791984587740832529105244690388811884123764341191951045505346658616243271940197113909845536727278537099345629855586719369774070003700430783758997420676784016967207846280629229032107161669867260548988445514257193985499448939594496064045132362140265986193073249369770477606067680670176491669403034819961881455625195592566918830825514942947596537274845624628824234526597789737740896466553992435928786212515967483220976029505696699927284670563747137533019248313587076125412683415860129447566011455420749589952563543068288634631084965650682771552996256790845235702552186222358130016700834523443236821935793184701956510729781804354173890560727428048583995919729021726612291298420516067579036232337699453964191475175567557695392233803056825308599977441675784352815913461340394604901269542028838347101363733824484506660093348484440711931292537694657354337375724772230181534032647177531984537341478674327048457983786618703257405938924215709695994630557521063203263493209220738320923356309923267504401701760572026010829288042335606643089888710297380797578013056049576342838683057190662205291174822510536697756603029574043387983471518552602805333866357139101046336419769097397432285994219837046979109956303389604675889865795711176566670039156748153115943980043625399399731203066490601325311304719028898491856203766669164468791125249193754425845895000311561682974304641142538074897281723375955380661719801404677935614793635266265683339509760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
% s# A# i9 g* n) T2 c' q上述运算结果在IBM PC机(1G, 128M)上计算只需要0.01秒, 得到如此复杂的结果(1747位), 一个自然的问题是: 答案正确吗?
3 }3 W7 u, b4 g' z- u+ |: E6 E8 H为了回答这个问题, 我们借助于数值分析方法, 由Stiring公式
4 r- j* d. x* O' H3 I0 v7 I ' C0 G7 S% I, Z) k
可得:  , 前三位数字与Maple输出结果相同, 且两者结果均为1747位. 另外, 在720!的计算中, 5的因子的个数为:   + w' O- M9 ?: ?

* Y# k/ z& T5 \& p这些5与足够多的2相乘将得到178个0, 而Maple的输出结果中最后178位数为零. 由此, 可以相信Maple结果的正确性. . `: F" q4 J9 U. t1 H0 g8 _
另一个例子则想说明Maple计算的局限性:   
$ y" ], V5 g/ o0 `( V& m  
8 G& X1 s& v$ |' P/ V0 sMaple在处理问题时, 为了避免失根, 从不求算术式的近似值, 分数则化简为既约分数. 因此, 在Maple中很容易得到:   ' m' t$ `+ v1 H& L, g6 Z. ]8 x

$ w1 Y& ]8 J7 X& g9 H显然这是错误的. 这一点可以从代数的角度予以分析.
. Y3 O8 b$ ~; S% V4 g& s不妨设 , 则 , 即 , 显然 有3个结果, -2是其实数结果. 9 @' \% r- B9 v4 J' S
另一方面, 设 , 则 , 即:5 _6 t. Y) u- _' N7 c1 s# q- n

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

" Y- n1 c, S% r0 ^* s5 T( W> 123456789/987654321;4 p2 }+ d0 \- V, o

2 v0 e! _4 O, L6 ~> evalf(%);; `0 h$ s2 L. Q  O
6 ~# A! x; S0 {
> 10!; 100*100+1000+10+1; (100+100)*100-9;9 g% T2 t! b0 l2 H  l1 l
' h( l1 w, L  O* q5 C; N
8 Q% O$ E. s0 S3 w- q, _8 }/ a

( a/ `& m# K. p- o- a> big_number:=3^(3^3);
! C/ o1 s& j- B7 E- Y 6 x  N5 Q  H# Z" ~7 e/ [6 _4 {
> length(%);) ~6 [8 Z* f/ d. ~; J" n+ ~

7 S" ]; f5 ?- ]1 X$ p; _+ u2 k上述实验中使用了一个变量“big_number”并用“:=”对其赋值, 与Pascal语言一样为一个变量赋值用的是“:=”. 而另一个函数“length”作用在整数上时是整数的十进制位数即数字的长度. “%”是一个非常有用的简写形式, 表示最后一次执行结果, 在本例中是上一行输出结果. 再看下面数值计算例子:   - G% y5 ?* U- ^& Z  T
    1)整数的余(irem)/商(iquo)
9 h- X7 a  w6 A$ E9 I9 J命令格式:   
+ {7 w( I( U, t6 m4 N: F+ Birem(m,n);        #求m除以n的余数1 K$ @9 P- b* |) C* i  H( V+ y
irem(m,n,'q');    #求m除以n的余数, 并将商赋给q" K- o% N8 ^- n* K* v3 s4 ]" D
iquo(m,n);        #求m除以n的商数/ a% V7 R% T: E: z$ S) F+ p& D
iquo(m,n,'r');    #求m除以n的商数, 并将余数赋给r  Y5 T5 f  O1 k  E. h9 x: S7 ?
其中, m, n是整数或整数函数, 也可以是代数值, 此时, irem保留为未求值. 8 I9 F8 V4 K" r. E9 x; l
> irem(2002,101,'q'); # 求2002除以101的余数, 将商赋给q
1 z* c; n/ I' s, F" r8 {: i% ~' ]8 c ) l/ O" h$ T8 U
> q; #显示q) N$ B) `; S+ u2 R% x; j0 ^* A8 F! {
$ P* i' a/ P! `1 b8 j
> iquo(2002,101,'r'); # 求2002除以101的商, 将余数赋给r
: X4 H5 {" R9 M% V. c( w2 w( `( N 7 Q( [, u7 Q$ D* Z1 w* J- b
> r; #显示r
1 C7 a1 L" n7 w. v* Q
9 Q; p: {4 x$ y" _> irem(x,3);
: Z; e1 f! D" W$ q  b, B$ U2 K ' V; Y/ }, n2 V4 e6 d5 }& G" p  u: @# _
2)素数判别(isprime)
6 k) H& ~+ C! P1 P3 O$ ?% T素数判别一直是初等数论的一个难点, 也是整数分解问题的基础. Maple提供的isprime命令可以判定一个整数n是否为素数. 命令格式: isprime(n);
3 E" l, R* {7 I6 R! t! E% s) r) Q    如果判定n可分解, 则返回false, 如果返回true, 则n“很可能”是素数. 5 ?5 z% Z7 a3 C
> isprime(2^(2^4)+1);
' f; i% X' ~$ W5 N5 f) M ! K; g4 \  c9 l' y1 C* h
> isprime(2^(2^5)+1);
% Z+ N( H# \: A' B4 A7 T: O
$ g/ e/ \: X" j1 G( z4 g( J+ F上述两个例子是一个有趣的数论难题。形如 的数称为Fermat数, 其中的素数称为Fermat素数, 显然, F0=3、F1=5、F2=17、F3=257、F4=65537都是素数. Fermat曾经猜想所有的Fn都是素数, 但是Euler在1732年证明了F5=641•6700417不是素数. 目前, 这仍是一个未解决的问题, 人们不知道还有没有Fermat素数, 更不知道这样的素数是否有无穷多. - h# ]8 j: n, e& T" E& ?  u! R
3) 确定第i个素数(ithprime)
3 L7 ?, S0 V5 }8 ~6 a6 h$ a! I若记第1个素数为2,判断第i个素数的命令格式: ithprime(i);    % D2 A' s9 j: I1 [: v7 }4 D4 h# n
> ithprime(2002);
/ g3 V7 t" T/ q7 w, q ; h# \2 y9 a: h* f# r+ [
> ithprime(10000);8 Y3 Y  F8 u- D- C: y- \
6 ?9 o+ E. n8 @. J  Y0 g( z
4) 确定下一个较大(nextprime)/较小(prevprime)素数
/ M3 ?  N0 z+ N8 D/ t* c1 [* \$ K当n为整数时,判断比n稍大或稍小的素数的命令格式为:   
1 q7 Q6 N+ {. \nextprime(n);  
: Q1 n: X& l! V# x4 o+ i, S3 Fprevprime(n);
# h1 d* Z' z; [) v% f7 a> nextprime(2002);
  Z5 t% m' F) |6 c- V1 C% r& G& Q
+ C2 V$ |# |, }% `4 n* @> prevprime(2002);$ A8 R3 {! ^" T: k( g3 G* f* D
0 t- f4 ]& T5 X' X' G9 i) g) D
5) 一组数的最大值(max)/最小值(min)% C" Y# [5 T" l! r% }9 n# f
命令格式: max(x1,x2,…,xn);   #求x1,x2,…,xn中的最大值
0 g; m1 s5 j  J             min(x1,x2,…,xn);   #求x1,x2,…,xn中的最小值
' [- N) B- h# y  L6 U> max(1/5,ln(3),9/17,-infinity);
+ V) j3 Z1 F4 v1 b2 E9 I' K1 E) n/ R2 f 8 F! k$ a: T5 b( M: l# `
> min(x+1,x+2,y);
2 P. y) ]8 u  J# J, H$ u
. B1 `8 W$ g5 o, b7 t' F2 a6)模运算(mod/modp/mods)
6 [6 u. j  \2 f+ x% z3 N5 Z- e6 X命令格式:  e mod m;    # 表达式e对m的整数的模运算$ b1 ~% x# l, X
modp(e,m);  # e对正数m的模运算
3 B( `8 x  ]' J' jmods(e,m);  # e对m负对称数(即 -m)的模运算/ [. u# q0 u: L; w$ _7 I% [
`mod`(e,m);  # 表达式e对m的整数的模运算, 与e mod m等价  I, S2 Y& ]  p& X
值得注意的是, 要计算i^n mod m(其中i是一整数), 使用这种“明显的”语法是不必要的, 因为在计算模m之前, 指数要先在整数(可能导致一个非常大的整数)上计算. 更适合的是使用惰性运算符“&^”即: i &^n mod m, 此时, 指数运算将由mod运算符智能地处理. 另一方面, mod运算符的左面优先比其他运算符低, 而右面优先高于+和-, 但低于*和/.
3 U5 N5 {+ ]' X. h* u8 O+ R; {> 2002 mod 101;" T& {1 z4 L6 m

' A" T' z! G& Q2 L# z0 [5 P> modp(2002,101);; o4 k( e: U4 h# w

2 Y" x& d! j- \, z; K' ?+ s+ Y> mods(49,100);
* R# ?) [& f8 T/ C5 |6 u + D5 d- ~$ H, _! i0 c& X" B* p
> mods(51,100);
- L$ Y+ v* ?& e1 _, t
+ _8 u4 D2 ^# P> 2^101 mod 2002;  # 同 2 &^101 mod 2002;
% B. g8 r; c! V3 H0 u7 k+ [ / C1 t: O/ `7 S8 p9 s7 F) u
7)随机数生成器(rand)( \9 s7 W0 D& ~/ K
命令格式:   
- ~- |; d3 Z9 @# m# R2 Urand( );    #随机返回一个12位数字的非负整数+ v% p3 K3 v/ H4 X6 z4 K* S
rand(a..b);  #调用rand(a..b)返回一个程序, 它在调用时生成一个在范围[a, b]内的随机数
; C' @" A' i/ R> rand();) p( a/ b- K1 ?2 x2 i* x
3 f7 m. J: O  W
> myproc:=rand(1..2002):4 y/ ]% e  ~. M3 @1 w. Y4 |& h
> myproc();
+ y, T/ \9 @! g: @
% n; D* Z, D" q- |! y) {, L> myproc();! `6 w9 b+ A6 g& c$ O) T& O$ U

7 R' y2 k1 M5 c, f    注意, rand(n)是rand(0..n-1)的简写形式.
+ d" G5 i$ Z7 ~( B2.1.2 复数运算4 {3 F/ H- r4 Z! l' }% C7 b3 K
复数是Maple中的基本数据类型. 虚数单位i在Maple中用I表示. 在运算中, 数值类型转化成复数类型是自动的, 所有的算术运算符对复数类型均适用. 另外还可以用Re( )、Im( )、conjugate( )和argument( )等函数分别计算实数的实部、虚部、共轭复数和幅角主值等运算. 试作如下实验:   
+ N: S; O+ O0 d2 y9 R> complex_number:=(1+2*I)*(3+4*I);+ `  d8 C* {4 b+ ^
3 T1 k' j5 T3 V+ ?
> Re(%);Im(%%);conjugate(%%%);argument(complex_number);
+ |( l+ W$ s2 X  r, k% T: X 0 k% H2 W1 M+ P3 i

2 ^7 l% ], X# C- R+ h; k& M7 _ $ m9 B: y: n% Y

8 x& s9 L* G, @3 W4 L! N, ]2 i值得注意的是上行命令中均以“;”结束, 因此不能将命令中的2个%或3个%(最多只能用3个%)改为1个%, 因为%表示上一次输出结果, 若上行命令改为“,”结束, 则均可用1个%. ; b# C9 ~3 i6 J: X# d8 h
为了在符号表达式中进行复数运算, 可以用函数evalc( ), 函数evalc把表达式中所有的符号变量都当成实数, 也就是认为所有的复变量都写成 的形式, 其中a、b都是实变量. 另外还有一些实用命令, 分述如下:   4 Z7 w4 D* Y# L/ q+ J
1) 绝对值函数1 y; l6 e, I" R* h4 T$ |- F
命令格式: abs(expr);  
. J5 ^- a* b: H- q; B4 m' x当expr为实数时,返回其绝对值,当expr为复数时,返回复数的模.8 B) ]; w  k3 R/ n7 x  f
> abs(-2002);    #常数的绝对值
8 |5 o! N) {6 L+ q" R9 n0 e
" C! O$ R4 @5 `) C( Y. X2 ~: H> abs(1+2*I);   #复数的模
' c+ K% {; Q8 _. ]5 N% g $ m/ y! W/ D( k$ V% |/ M; f
> abs(sqrt(3)*I*u^2*v);  #复数表达式的绝对值  K5 i  v: n; L- n
3 q8 k3 d% E8 A, h' U& y0 U$ l
> abs(2*x-5);   #函数表达式的绝对值! ?$ _, f: O" u
* z& @' @: X5 @) G  s6 S' G
2)复数的幅角函数* L! n, Z, D) D
命令格式:   argument(x);  #返回复数x的幅角的主值8 G% T& v& w# K- `2 ^% }8 ?- j
> argument(6+11*I);
. S# l) D. q7 S$ R% S& \$ z. w . G. K3 Z+ g9 I/ G: ~+ x; ]$ K& T
> argument(exp(4*Pi/3*I));# y  r8 w1 h1 z+ [6 C* A. s1 A$ m5 g

6 P5 `7 A' Y; m* p( B+ u1 C) @7 |3)共轭复数" W; I7 k& i% q8 i: d9 y" M
命令格式:   conjugate(x);  #返回x的共轭复数1 j: I1 A5 C: [8 c
> conjugate(6+8*I);
% b# c7 Y9 n6 |, e+ B  Q" S
5 B* n. Q* x# l5 L0 _* z! z3 ~> conjugate(exp(4*Pi/3*I));& Q( V5 R1 s9 ^! q# `. e
* E) g) s& U1 t8 p, s
2.1.3 数的进制转换4 v+ n+ X: \+ b# V# T1 R
数的进制是数值运算中的一个重要问题. 而在Maple中数的进制转换非常容易, 使用convert命令即可. , w3 i# l3 p. J. c6 h. h
命令格式:   convert(expr, form, arg3, ...);   
5 O2 [! ~: m# ]& J$ K% X0 C9 G! w$ @其中, expr为任意表达式, form为一名称, arg3, ... 可选项.   X+ z" [% b' }) Z3 U
下面对其中常用数的转换予以概述. 而convert的其它功能将在后叙章节详述.
3 U8 Q6 K& P9 i    1)基数之间的转换0 B# p. N4 K+ U( s% t+ I
命令格式:   ; h6 P- m+ V" \9 `2 |$ n
convert(n, base, beta);      #将基数为10的数n转换为基数为beta的数. V' W( x6 L5 b6 z- p
    convert(n, base, alpha, beta);#将基数为alpha的数字n转换为基数为beta的数" t' Q5 S. _2 ?4 R
> convert(2003,base,7); #将10进制数2002转换为7进制数, 结果为: (5561)7. X7 s5 _- z9 M5 c0 B. k

. s9 w: f3 @+ y% q) m> convert([1,6,5,5],base,7,10); #将7进制数5561转换为10进制数
4 C7 H+ u# F0 B/ V
) d& O$ C$ N! f; _4 R> convert(2002,base,60);       #将十进制数2002转换为60进制数, 得33(分钟)22(秒)
+ @3 t$ |3 M) p# p/ n2 |) V* U  D ; H6 i& Y, j! k6 v* e
    2)转换为二进制形式
) a3 g# U4 q) _* r命令格式: convert(n, binary);, H+ W. X, a; B/ i# ]) l) ]
其功能是将十进制数n转换为2进制数. 值得注意的是, 数可以是正的, 也可以是负的, 或者是整数, 或者是浮点数, 是浮点数时情况较为复杂. : D$ W2 ^  E2 Q! A4 V" M) A7 m; U
> convert(2002,binary);   
: z, }3 \! C1 h9 q# g% w5 b 0 e! Q0 {! e8 u: Z: i5 a, H' q
> convert(-1999,binary);
5 \3 u% R1 R& N  X
  }8 x5 c- w7 v, l" C9 A( h7 Q> convert(1999.7,binary);
1 e' I+ W7 \8 |, H$ R6 F/ J
; j: R' q( h5 p9 S3)转换为十进制形式) r( \: T2 M6 `: P
其它数值转换为十进制的命令格式为:   ' e, n+ p# ~- T; u( i% K! q8 V
convert(n, decimal, binary);   #将一个2进制数n转换为10进制数  N. G% _2 ^2 t4 H, \
    convert(n, decimal, octal);    #将一个8进制数n转换为10进制数8 h, y( o* {% \9 x6 P1 [
    convert(string, decimal, hex);  #将一个16进制字符串string转换为10进制数2 S0 V  n2 Z9 Q. P8 P4 s
> convert(11111010010, decimal, binary);    # \, _. A3 f5 Q2 R
. A) l0 C+ ]) j( t
> convert(-1234, decimal, octal);           9 L& B3 Z7 Y' q

% Q% H% U6 S; {0 G2 ~> convert("2A.C", decimal, hex);         
6 N8 I* Q( I" C4 w- H9 a * S1 V% ?6 p4 N# j. y5 N3 H
4) 转换为16进制数2 l; f( L2 z( s& A6 A
将自然数n转换为16进制数的命令格式为: convert(n, hex);   
3 t& k/ f1 Q2 K" p> convert(2002,hex);  convert(1999,hex);
5 A2 K( S& e3 M* \% @$ `! A: y 4 T- C# y/ k+ N5 ^

: j; |4 h( j3 c+ }4 O5)转换为浮点数% |# Z1 F! T6 X* r2 Z9 q6 v* j
命令格式: convert(expr, float);, u1 z! W, ~; @* V5 D5 j4 {9 i4 S
注意, convert/float命令将任意表达式转换为精度为全局变量Digits的浮点数, 且仅是对evalf的调用. . R3 r: D( n- Z5 i) i( L5 Y
> convert(1999/2002,float);
! p4 D( }, U6 \1 N   z0 `8 a" N  C" O. b; d
> convert(Pi,float);( Z1 ~( K- U% `
- s  l% N) g, `  |' s
2.2 初等数学3 [& s) _( P( p5 P6 w) W
    初等数学是数学的基础之一, 也是数学中最有魅力的一部分内容. 通过下面的内容我们可以领略Maple对初等数学的驾驭能力, 也可以通过这些实验对Maple产生一些感性认识.
0 M! @1 Z" I9 q' G2.2.1 常用函数
* l6 W; a/ Q3 D  u9 q1 R( G作为一个数学工具, 基本的数学函数是必不可少的, Maple中的数学函数很多, 现例举一二如下:   ! p; F# \3 e/ Z" ~4 C: y  U
指数函数: exp4 _% x( v! I/ O* ~
一般对数: log[a]
3 U. w7 y. ~1 z0 D! R+ J自然函数: ln" i. T1 Q" b. S* h5 O9 y. }
常用对数: log10/ w4 {+ i# M8 c' B! \3 B( F2 @
平方根: sqrt
+ A  O9 O9 H- f6 L绝对值: abs% e: k( F9 f5 z$ r' R0 B
三角函数: sin、cos、tan、sec、csc、cot
: ^, X# W  t/ N' N% y3 C反三角函数: arcsin、arccos、arctan、arcsec、arccsc、arccot
; F; R; I, D+ K1 d* n! e双曲函数: sinh、cosh、tanh、sech、csch、coth7 D" y0 @3 Q3 N
反双曲函数: arcsinh、arccosh、arctanh、arcsech、arccsch、arccoth1 t* _8 n  ]4 N( a8 G& z
贝赛尔函数: BesselI、BesselJ、BesselK、BesselY
* u" Y; `* r' qGamma函数: GAMMA
# e. k& l; Q9 O/ p误差函数: erf
1 {) O# q* H- @$ N0 s/ }函数是数学研究与应用的基础之一, 现通过一些实验说明Maple中的函数的用法及功能. 7 k7 `; H; Y$ U, _, g! {' t. M3 e
1) 确定乘积和不确定乘积% m* b( p  N$ V' u* m$ a% [" Y: p( c
命令格式: product(f,k);  
& T* R, J' q, m% e2 |product(f,k=m..n);  - p6 s+ ]# \3 u- |
product(f,k=alpha); 5 }, e8 u; o. ~- [
product(f,k=expr);
$ {  V. O5 U3 a其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—包含k的任意表达式.
6 |9 Q$ C* z$ j; a2 |% c0 L* q> product(k^2,k=1..10);   #计算 关于1..10的连乘
' l$ I" o" C4 g. h6 P7 ~ 7 _: x5 }* B& e! ?9 K( A
> product(k^2,k);         #计算 的不确定乘积
$ N% o5 S( X  J  A! v) u
  S6 O: i/ v! w1 v4 v; C+ B3 |> product(a[k],k=0..5);    #计算ai(i=0..5)的连乘
# g) s. g; N6 L. r1 [ . Q* Y) D' o8 }( U  _
> product(a[k],k=0..n);    #计算ai(i=0..n)的连乘( ~* j2 d3 ^) s4 ?) ^, ^: j! @

5 v! j$ E8 T* D9 o3 e- Z> Product(n+k,k=0..m)=product(n+k,k=0..m);   #计算(n+k)的连乘, 并写出其惰性表达式4 e8 W0 P6 J9 C: K8 p$ Q( W; v

+ p. U$ {' I# y$ T5 x> product(k,k=RootOf(x^3-2));     #计算 的三个根的乘积1 {4 D* }+ A9 r; p" B9 w$ i

& K  i2 R' ^2 A. q    product命令计算符号乘积, 常常用来计算一个公式的确实或不确实的乘积. 如果这个公式不能求值计算, Maple返回 函数. 典型的例子是:   
% \: R% O9 k% z0 f/ ^2 n> product(x+k,k=0..n-1);% |4 r4 O; w$ q# v0 ]

5 j5 l! I: j5 l: k  C如果求一个有限序列值的乘积而不是计算一个公式, 则用mul命令. 如:   ! I  f/ r) }  d1 f1 `
> mul(x+k,k=0..3);. W: |4 [% j7 d

5 i: N+ X# Z8 x. s0 Q2)指数函数+ F* S" p, u4 T0 Y& P- J% J
计算指数函数exp关于x的表达式的命令格式为: exp(x);
1 s2 h* t% |* D9 u$ J0 K6 m> exp(1);4 S: p; L  q4 G) Z5 A! k

2 E2 Z$ D, f  G9 [3 E* W# s$ C> evalf(%);( ~! s% Q2 U, I1 ]8 y9 ?
( X9 V9 I2 K0 s1 |- H
> exp(1.29+2*I);8 o/ c0 V( h) A9 ^  U* v
' E1 W& I- V( _/ l9 A
> evalc(exp(x+I*y));4 E# D4 l: ^9 f* @/ ]

) f# G& @/ N+ B- p: d3)确定求和与不确定求和sum. n5 A4 x& A6 Q  w- X1 W
命令格式: sum(f,k);  
# c6 `2 v, ]' O' f! {) x9 [& xsum(f,k=m..n);  7 o( F5 X6 U) Z# k. m
sum(f,k=alpha); 5 f4 A4 R" \& B" U% f4 n
sum(f,k=expr);/ T# [6 e' ?( ^# W
其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—不含k的表达式.
3 @9 {7 k9 f/ `: |> Sum(k^2,k=1..n)=sum(k^2,k=1..n);
' o7 \* E+ u$ ]. C  U , z) l) d! i4 e! W) b2 X) |$ `7 B
> Sum(k^3,k=1..n)=sum(k^3,k=1..n);: k7 |3 Z! v! H

: a, l- l2 `# Z> Sum(k^4,k=1..n)=sum(k^4,k=1..n);! q! m8 T  T3 i" F4 \; s1 M) r- m

. a5 Z7 M* U' B$ j( @> Sum(1/k!,k=0..infinity)=sum(1/k!,k=0..infinity);
& W! _7 P# l$ t6 J( H5 e/ e
$ G/ \& I' t; }1 E> sum(a[k]*x[k],k=0..n);5 V) z# A; Q6 Q; L. ]  x" k$ n
. L8 p& ]/ m" ?5 `
> Sum(k/(k+1),k)=sum(k/(k+1),k);$ q: [, f  h% [8 L" M" S$ g: M7 A

+ E+ j. @; G. H$ L9 Z- l) I> sum(k/(k+1),k=RootOf(x^2-3));
+ ~! o: i9 f8 [0 v( N
- J- ^) e4 B+ Hsum函数可计算一个公式的确定和与不确定和, 如果Maple无法计算封闭形式, 则返回未求值的结果. 值得注意的是, 在sum命令中将f和k用单引号括起来, 可避免过早求值. 这一点在某些情况下是必需的.
9 G2 Z$ O2 V3 H6 z> Sum('k','k'=0..n)=sum('k','k'=0..n);- k# E" q1 Y& ?" x' L

) L* i: C8 }* |5 |如果计算一个有限序列的值, 而不是计算一个公式, 可用add命令. 如:   * o+ Z, U0 }8 u2 g
> add(k,k=1..100);
' X3 }: y- f  M6 b2 b8 M
" y  C" c& q/ G: A$ @& r: F尽管sum命令常常用于计算显式求和, 但在程序设计中计算一个显式和应该使用add命令. ! x4 [( a+ V0 t2 @
另外, sum知道各种求和方法, 并会对各类发散的求和给出正确的结果, 如果要将求和限制为收敛求和, 就必须检查显式的收敛性. * K8 B6 d  s# |  q3 F1 W
3)三角函数/双曲函数
! v& F$ D, F) ~5 W  |. d命令格式:   sin(x);   cos(x);   tan(x);   cot(x);   sec(x);   csc(x);
0 K+ K7 [8 s8 o& A- a2 D          sinh(x);  cosh(x);  tanh(x);  coth(x);  sech(x);  csch(x);
7 o; ?4 L! g9 l* J# Y( S其中, x为任意表达式. 8 A) ~3 C; h3 C8 B
值得注意的是三角函数/双曲函数的参数以弧度为单位. Maple提供了利用常见三角函数/双曲函数恒等式进行化简和展开的程序, 也有将其转化为其它函数的命令convert." H! r! X% m0 X* b$ a
> Sin(Pi)=sin(Pi);$ K% T: `, C- s; G( o2 ^! T' e/ N
+ }2 [4 Y+ h9 v  D# t7 J/ \) _
> coth(1.9+2.1*I);" ^2 A( A: Z1 m: z6 X
: W% i: D- \9 D1 g
> expand(sin(x+y));     #展开表达式; x& H- U$ o5 |" _+ {6 g+ q

+ @6 B  ~1 u$ o  P4 [% b1 G, _> combine(%);        #合并表达式
: `- G0 f) W+ |
7 Q/ W  b# L3 q> convert(sin(7*Pi/60),'radical');
5 f& m9 I$ c* \9 Z+ r6 \1 r( d: W5 ~
+ [2 \  n8 r4 |) `. F" n+ [> evalf(%);9 ^% ], u0 D+ \7 U0 p

1 ^4 }: G1 H( ]但有趣的是, combine只对sin, cos有效, 对tan, cot竟无能为力.; X$ P- {9 e5 I. b  ^$ m0 P
4)反三角函数/反双曲函数( |$ O" f# N6 P; x& Z1 b# s  x4 z
命令格式: arcsin(x);   arccos(x);   arctan(x);   arccot(x);   arcsec(x);   arccsc(x);
+ V7 H* h5 I. y. S4 ]. C; }6 ?, U     arcsinh(x);  arccosh(x);  arctanh(x);  arccoth(x);  arcsech(x);  arccsch(x);   
1 u7 i' A% j# e2 Sarctan(y,x);
$ k- @3 h+ S# z3 F  h* ?, j  X; S其中, x, y为表达式. 反三角函数/反双曲函数的参数必须按弧度计算. * X' E& x! b$ H9 W1 h
算子记法可用于对于反三角函数和反双曲函数. 例如, sin@@(-1)求值为arcsin.
' ~# {( ~+ |  I# s2 T9 c> arcsinh(1);' S, _  H+ D" a% ~8 \
3 y, m+ L) [2 K0 r' ]
> cos(arcsin(x));0 Q* @; s- b$ f# V6 }9 L

+ t* d# G3 I4 j, N( d> arcsin(1.9+2.1*I);. X5 s9 |! M5 c  C8 J$ K

: |. X- S# X, p& W. [& l) b5)对数函数" f4 M! y) f: `$ m! Z+ P  _
命令格式: ln(x);           #自然对数8 l! g6 M" o& G5 M+ W/ {8 C7 v) M
log[a](x);        #一般对数1 z% m1 n9 U" f0 X# i
log10(x);        #常用对数; v) |5 {8 X% N5 n% S
一般地, 在ln(x)中要求x>0. 但对于复数型表达式x, 有:   8 ~8 T, C, i" j0 u" _% b( y2 t7 I
  (其中,  )3 ]  s5 Y$ C, E! S
> ln(2002.0);" L5 |3 r& t! }+ O
9 u, u9 f$ w. u4 k* O; Z6 W! c' j
> ln(3+4*I);9 ]. {: a" f" ^$ H% c
: ^9 b$ U+ l' ^: S$ d+ p0 K
> evalc(%);    # 求出上式的实部、虚部
; k- z2 g5 ]7 u* Y* z6 N8 r
9 G- m/ h! d0 P3 p6 m> log10(1000000);, q' `7 C0 w5 n) Y# U
2 p% r) j: S  B8 q5 t1 w
> simplify(%);   #化简上式  |1 c* ?2 ~% a' p0 {# [7 d

' _5 b' ]7 |/ t5 p/ T( t' {1 e% @2.2.2 函数的定义
" A; d3 J, b: {5 sMaple是一个计算机代数系统, 带未知或者已知字母变量的表达式是它的基本数据形式. 一个简单的问题是, 既然表达式中可以包含未知变量, 那么它是不是函数呢?试看下面一个例子:   0 }( n6 X' ^! h- M" M) [; E
> f(x):=a*x^2+b*x+c;
1 f, j! M: }& V9 t
% S' o3 \" y" D9 O: M, {, i可以看出, Maple接受了这样的赋值语句, 但f(x)是不是一个函数呢?要回答这个问题,一个简单的方法是求函数值:   
7 q8 [( N# l6 v! Z9 V# h> f(x),f(0),f(1/a);
6 }7 F" z) P0 [2 U2 O$ H( G 0 L1 ~' @. Z) |. _
由上述结果可以看出, 用赋值方法定义的f(x)是一个表达式而不是一个函数, 因为f(x)不能把所定义的“自变量”或者“参数”转换成别的变量或表达式. 但从赋值“过程”可以看出, f(x)虽然也算是一个“函数”, 但却是一个没有具体定义的函数:   6 C% {& B* k" d  L% \
> print(f);
' t3 V1 j4 L. K, R2 b& ? 1 J" }" D1 I4 k
事实上, 我们所做的赋值运算, 只不过是在函数f的记忆表(remember table)中加入了f(x)在x上的值, 当我们把自变量换作0或1/a时, f(x)的记忆表中没有对应的表项, 所以输出结果就是抽象的表达式. - o4 N2 I1 _9 y- O- i0 M1 {) a
在Maple中, 要真正完成一个函数的定义, 需要用算子(也称箭头操作符):   
: ~% h! T  `' T! ?> f:=x->a*x^2+b*x+c;
9 Q; N- m& {$ J( G ' \0 c! ^$ Q2 R3 D
> f(x),f(0),f(1/a);+ z, I3 I5 Z  @7 L+ P" X4 Z- s
, f8 V' ]! |( E
多变量的函数也可以用同样的方法予以定义, 只不过要把所有的自变量定成一个序列, 并用一个括号“()”将它们括起来(这个括号是必须的, 因为括号运算优先于分隔符“,”).
. r4 r6 f% e& P> f:=(x,y)->x^2+y^2;: l9 }3 r4 ]' C, s7 @, v1 r1 Q! B

8 n7 g5 h6 h: R7 v+ o  }9 h! j. t> f(1,2);
6 }& B. b! K2 `+ Y& x) Y; G ; i( i2 t6 N- M
> f:=(x,y)->a*x*y*exp(x^2+y^2);
; H: G4 u+ h4 i9 F* y# R* O; U 1 H) L7 r/ s& Y5 O: ]. A
综上所述, 箭头操作符定义函数的方式一般为:   
/ j! I# [9 A2 W( y一元函数: 参数->函数表达式8 e$ s% Y+ G* D. ^
多多函数: (参数序列)->函数表达式* R9 g( w. l' t$ \9 _6 s
无参数函数也许不好理解, 但可以用来定义常函数:   
3 R) W- ]' k" ~5 E* l# O2 a> E:=()->exp(1);
( M- X! c9 _& i7 M% ?- _ : k) C. f: u: I/ R
> E();
1 s3 {  s9 N+ K$ J1 w! i8 F
0 s& K' O8 s; o9 ^, ]> E(x);
7 C& d: E) L' K; p) v 3 P# o3 p* B: m$ M3 n
另一个定义函数的命令是unapply,其作用是从一个表达式建立一个算子或函数.   V( e$ t% ^" v. J* x" O* s5 t. b
定义一个表达式为expr的关于x的函数f的命令格式为:  f:=unapply(expr, x);          , x" K- M/ h; K' H/ n3 N0 N
定义一个表达式为expr的关于x,y,…的多元函数f的命令格式为:  f:=unapply(expr, x, y, …);     
3 p5 _9 V& o0 r, [0 _> f:=unapply(x^4+x^3+x^2+x+1,x);0 C& n" i  M( R, `: g
* c: v: F# n3 _) }! i  P) W
> f(4);
4 b5 g7 W3 z) }7 C* p5 [
" m  V$ _; x6 c& P/ A* E7 A9 _> f:=unapply(x*y/(x^2+y^2),x,y);" |3 n/ s# I6 d) Z
3 A# v  j" e( O) O& I3 n
> f(1,1);
& O, _  r4 u! R5 P. L3 G( ^ " F# a7 E/ C: E1 H% ^
借助函数piecewise可以生成简单分段函数:9 Z/ |2 Q) @1 {3 Y& @- F# E7 L
> abs(x)=piecewise(x>0,x,x=0,0,x<0,-x);# U6 s$ V% ^5 q. A% `

8 Z$ G- I! s0 ^" b& u  A& S4 N3 w清除函数的定义用命令unassign. 6 T8 z7 P$ u3 Q$ A# Y
> unassign(f);
( k* e4 w0 B2 ]/ I# P: @( E0 \> f(1,1);: ?, M9 x7 h2 c, z* U

) n9 f9 h5 v6 c4 V) v除此之外, 还可以通过程序设计方式定义函数(参见第6章).
0 `& h! M. Y  }7 T3 C6 K定义了一个函数后, 就可以使用op或nops指令查看有关函数中操作数的信息. nops(expr)返回操作数的个数, 函数op的主要功能是获取表达式的操作数,其命令格式为:
1 N4 o# j0 P9 X" t2 Vop(expr);         
: B+ \- ]1 f% r% u1 yop(i, expr);         , ~, d  X* r* W* Q5 g" ?
op(i .. j, expr);      3 H/ R; p" l- i/ t8 L$ I  h
nops(expr);% ~% P% m. r3 ]- l* I
如果函数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的类型.
; T: A3 X& x+ T+ s6 j/ Y命令op(i .. j, expr); 执行的结果是expr的第i到第j个操作数, i..j中含负整数时的情形同上.
- U% }3 L5 s" D) L- O( t& l/ f命令op(expr); 等价于op(1..nops(expr), expr);
, I# C; E. R$ y" T1 }: z9 ?. H特别地, 当op函数中i为列表[a1, a2, ..., an], 则op([a1, a2, ..., an], expr); 等价于op(an, op(..., op(a2, op(a1, e))...)); 1 k1 {2 `1 [) i8 @
而当expr为一般表达式时,nops(expr)命令返回的是表达式的项数, 当expr是级数时返回级数每一项的系数和指数的总和. % m8 K" J2 [8 U0 T7 I
> expr:=6+cos(x)+sin(x)*cos(x)^2;
# t  g' e+ Z* S6 i; g& T& }4 n. I6 X! j
4 @* M2 E2 ^) t/ d1 ^> op(expr);
  g& k- l7 f( C6 a8 u, ^
7 ~3 ]) F; \/ Y/ E) L> nops(expr);
$ A6 f: m/ }) s0 ^7 u8 f# s( p
0 w9 H: ~* d6 [% U& S$ f+ C> p:=x^2*y+3*x^3*z+2;0 J& P" w5 ~  M2 y/ d

! t8 V$ }, G3 E0 ?8 ~' z9 a' U# r' Y> op(1,p);  x! V9 m- t. d% `9 m: W. [

' f! Y8 Y) R* q. u. x> op(1..nops(p),p);
; h, {; v# }9 l
( D: Y* A/ j2 X' E$ O> op(op(2,p));3 g& C* u' M  c' o& o- t* H% ?

. X/ @8 p" R6 z5 |! m> u:=[1,4,9];+ ]- @$ ?6 C8 z9 v6 i6 ]
. R+ B0 U$ o% w5 I/ P
> op(0,u);
1 i6 K  D- K' ~* T: e$ P
: x8 s" n2 S5 ~> s:=series(sin(x),x=1,3);
: r7 F- H$ M3 P; l3 H8 _
* S8 q1 T/ f4 o/ j9 W' {4 V4 j& R> op(0,s);; d( b( ~6 N) B! K7 Q9 u1 O; `/ u2 o
        7 ~- j- T2 S% M7 L2 o( z
> nops(s);2 w# e4 g0 r8 n! z' p5 l
5 Z/ r/ Y* ]+ D# S7 O- h
下面一个有趣的例子说明了Maple在处理算术运算时的“个性”:
& b/ _  v) v5 [3 f1 n; @> op(x*y*z);3 O1 v4 i# H! d: C2 t

& j* }. _. j: O9 n' C6 s> op(x*y*z+1);9 f$ \' c3 `8 ?& x# ]

# {" D( l3 b* W: G! b4 T, J2.2.3 Maple中的常量与变量名6 I* b# M" O6 W. l
为了解决数学问题, 一些常用的数学常数是必要的. Maple系统中已经存储了一些数学常数在表达式序列constants中:   3 q# S: \' q% ]- X& y- e
> constants;1 f8 h3 k9 U5 D

+ }4 H/ t% e2 \6 q; f5 Y0 \! w  Q' Y4 P为了方便使用, 现将上述常数的具体含义列示如下:   - S8 U, B4 h0 y, E( \
常    数        名 称        近似值
" l/ o! f# p. |圆周率 8 @. M, T) A' V- m
Pi        3.1415926535' D4 D# }4 ~. j5 O& {7 [' i( R
Catalan常数 " J3 i# A$ t: w- Y6 u$ X0 f
Catalan        0.91596559424 n2 D6 ]! n6 F; q3 D) G; {. `
Euler-Mascheroni常数
; C, K3 X, D* ygamma        0.5772156649# m, k; v# G1 {% T3 U

3 L7 i( m/ Z4 G/ w$ M5 p0 O) \infinity        ' x% a7 a/ N9 n

0 C: r- r7 U6 f% J需要注意的是, 自然对数的底数e未作为一个常数出现, 但这个常数是存在的, 可以通过exp(1)来获取. + R0 b/ }! K7 O4 D" X6 C
在Maple中, 最简单的变量名是字符串, 变量名是由字母、数码或下划线组成的序列, 其中第一个字符必须是字母或是下划线. 名字的长度限制是499个字符. 在定义变量名时常用连接符“.”将两个字符串连接成一个名. 主要有三种形式: “名.自然数”、“名.字符串”、“名.表达式”.
  N- X) P# W7 ]9 V. N5 o) b: ^值得注意的是, 在Maple中是区分字母大小写的. 在使用变量、常量和函数时应记住这一点. 数学常量 用Pi表示, 而pi则仅为符号 无任何意义. 如g, G, new_term, New_Team, x13a, x13A都是不同的变量名.
# f( h) k* Y, I4 H+ W在Maple中有一些保留字不可以被用作变量名:   % e/ Q. b* V: p8 |& s& h
by      do      done     elif     else     end        fi        for      
, R' [+ ^( Y8 G5 ?9 d2 ?+ vfrom    if       in       local     od     option    options     proc         / ~" k4 O. f# P$ K9 L8 b) J
quit    read     save     stop     then     to        while      D0 |2 E- D) F  N, X' d# c
Maple中的内部函数如sin, cos, exp, sqrt, ……等也不可以作变量名. 9 I0 k$ t4 P1 x' r" m! I2 G3 {1 X
另外一个值得注意的是在Maple中三种类型引号的不同作用:   ; W9 ]; d! N! [/ r4 y) X# U
`  `:   界定一个包含特殊字符的符号, 是为了输入特殊字符串用的;    & W& S- s3 p# A+ B  \  s& b& b
'  ':   界定一个暂时不求值的表达式;   
+ u% y: k. d8 y9 X' S2 E* x"  ":   界定一个字符串, 它不能被赋值. 4 d# E! Q9 h2 T' K4 m
2.2.4 函数类型转换           
, [& c7 i( _5 \, V( E& e函数类型转换是数学应用中一个重要问题, 譬如, 将三角函数转换成指数函数, 双曲函数转换成指数函数, 等等. 在Maple中, 实现函数类型转换的命令是convert. 命令格式:  
* C$ A+ W5 f5 A( K: _    convert(expr, form);        #把数学式expr转换成form的形式% Z0 }3 z+ H+ Z7 G
convert(expr, form, x);      #指定变量x, 此时form只适于exp、sin、cos
; c- G* e5 f+ J+ M4 v5 H" \convert指令所提供的三角函数、指数与函数的转换共有exp等7种:   
) k4 e% C+ T4 I1 y(1) exp: 将三角函数转换成指数
) |4 ]$ |* M( X, m" K! C(2) expln: 把数学式转换成指数与对数
) Z) A2 m; J  e. P7 p(3) expsincos: 分别把三角函数与双曲函数转换成sin、cos与指数的形式
% y: i( T, Y$ d: M4 N" }(4) ln: 将反三角函数转换成对数
3 k+ G' V; \" q) w, W6 }& Q2 f8 ~(5) sincos: 将三角函数转换成sin与cos的形式, 而把双曲函数转换成sinh与cosh的形式, x+ m/ r$ s- m( |$ w
(6) tan: 将三角函数转换成tan的形式+ r, u0 `3 n( d, _7 S7 q  S' @
(7) trig: 将指数函数转换成三角函数与对数函数( v7 R+ i; _1 ]
> convert(sinh(x),exp);   #将sinh(x)转换成exp类型' D6 G/ A' q  ?- f3 _: S
. u$ R* f; q) b0 i6 }
> convert(cos(x)*sinh(y),exp);( v8 U; e$ V* y1 K) Q0 u

+ S1 f6 f( I  {> convert(cos(x)*sinh(y),exp,y);; T7 X  r8 h: q4 X* u' m( e. `- W1 N

+ P; A' }' {1 g. f$ T4 g> convert(exp(x)*exp(x^(-2)),trig);
- @% ?& q0 ?  y# U9 i + ]3 F( v! l  r! s# J
> convert(arcsinh(x)*cos(x),expln);$ K) h2 j8 e- \- N( X; Y$ h
2 L' t6 V! A; r. Z
> convert(cot(x)+sinh(x),expsincos);
, D0 I: _! E& i$ ?8 I6 m* a
5 m+ p% V3 u2 c" F. g+ |> convert(arctanh(x),ln);2 X4 o  Y3 r6 m" c
, L- x# Q. X* W8 B6 x; P
convert在有理式的转换中也起着重要的作用. 在有关多项式运算的过程中, 利用秦九韶算法可以减少多项式求值的计算量. 在Maple中, 可以用函数convert将多项式转换为这种形式, 而cost则可以获取求值所需的计算量. 注意: cost命令是一个库函数, 第一次调用时需要使用with(codegen)加载. 例举如下:     I: }0 F1 U1 }
> with(codegen):. x+ a5 U( ~! }" j; K
> p:=4*x^4+3*x^3+2*x^2-x;
$ f! ~% a' Y2 w
! e  R0 V3 l" g0 q5 F% O( _> cost(p);9 R( G# s* \* @' @/ s& u; p: W
, f& q* b; E# S
> convert(p,'horner');  #将展开的表达式转换成嵌套形式. r5 X) k3 I$ W0 z& r3 T5 Z
5 d4 u$ {- H; B8 V
> cost(%);
% I0 T6 W8 J; h1 n5 f6 H  U % K3 g: f! \6 f- c
同样, 把分式化成连分式(continued fraction)形式也可以降低求值所需的计算量. # `2 g1 x  q$ i  L) @
> (1+x+x^2+x^3)/p;
! x" g) [" ?2 D0 B2 Z7 c% A ' e7 c* _( t7 |9 ?8 u4 r6 F" O
> cost(%);
$ ?! S# ~: n4 O ; T$ f3 J5 M9 m! c: i
> convert(%%,'confrac',x);
2 s2 T( |. ?# h1 M3 H& O9 s # S8 N7 t. Q/ G* U. E
> cost(%);$ h  ~; S& Z* W* A4 p" q# V" N

# I6 Z5 V' t, d0 j% d. C在某些场合下(比如求微分、积分时), 把分式化成部分分式(partial fraction)也就是几个最简分式的和式的形式也可以简化运算, 但简化程度不及连分数形式.
1 n5 f2 c( E0 M* g: D> convert(%%, 'parfrac',x);( @, s2 o+ ~- z

! o% [) i. F) z& e: v7 }% q2 j> cost(%);
2 m8 O; }5 ]6 i7 z! L" e* S, s5 \, [1 \
- v2 P* E" u9 }6 O- V而把分数转换成连分数的方法为:
# Z2 D. d' M9 v) ^3 t% |) r1 X> with(numtheory):) P5 Y% T) `! v0 ^) L7 r3 L0 h
> cfrac(339/284);
+ }. y3 K6 V$ [% k! e/ ]9 M
9 t! z( Q4 m- D2.2.5 函数的映射—map指令
) N- J$ k/ [, u0 n+ Y在符号运算的世界里, 映射指令map可以说是相当重要的一个指令, 它可以把函数或指令映射到这些结构里的元素, 而不破坏整个结构的完整性. 命令格式为:; j* [, |+ \+ m: S" X
map(f, expr);      #将函数f映射到expr的每个操作数, d3 v# Z9 K5 b" O7 p3 K2 E
map(f, expr, a);    #将函数f映射到expr的每个操作数, 并取出a为f的第2个自变量7 U5 t" c; i& p% h0 \) a% Z* r
map(f, expr, a1, a2,…, an); #将函数f映射到expr的每个操作数, 并取a1~an为f的第2~n+1个自变量
; i6 a9 G1 Q3 z! R" H" p% C2 w" @map2(f, a1, expr, a2, …, an);    #以a1为第1个自变量, expr的操作数为第2个自变量, a2为, `/ Y, \. x, E$ b, x% X
第3个自变量…, an为第n+1个自变量来映射函数f
& ]* u, A0 u& M# C> map(f,x1+x2+x3+x4,a1,a2,a3,a4);
3 b! d; z: x8 s* v* A$ z
+ d) L" i9 q' Y" X0 J3 r9 V> f:=x->sqrt(x)+x^2;
# w! s: w8 o# v
2 G! a2 e/ M0 L3 v+ `> map(f,[a,b,c]);
5 E9 E/ e  c* F+ G, i$ l7 ~- _. K 4 m  e: A4 |% R* L4 y- H
> map(h, [a,b,c],x,y);   k) a1 n0 b6 E- j. s# k% L
& r9 G. M8 p, |  k( i! J
> map(convert,[arcsinh(x/2),arccosh(x/2)],ln);' y! H( d) a; d, q

: f% S9 H+ x8 A( `5 L! Q  u> map(x->convert(x,exp),[sin(x),cos(x)]);
$ x; v5 |5 a9 ^  { 7 `/ W, B# E, j) W; x
上式的映射关系可通过下式理解:
6 |/ {0 \/ Y7 {' m> [convert(sin(x),exp),convert(cos(x),exp)];- T/ U2 H- x+ ?5 X- S0 [! J2 m

9 F) s& y* N3 M( G6 B> restart: ; J" v* c6 }0 ~' [- P- A; A2 S( n
map2(f,a1,x1+x2+x3+x4,a2,a3,a4);' S% ~$ ^9 A, \/ q
2 m" |8 e& [1 b$ {0 ~2 A
> map2(max,k,[a,b,c,d]); 5 z2 Q  L1 J/ W! Z

0 X3 y' ~+ Q7 z: x1 f" Z再看下面示例:   ) O' J% y, a/ D( e& N# r
> L:=[seq(i,i=1..10)];7 _" {. T% h2 k' B  H

$ f) j. j% [0 d- f3 p> nops(L);, I1 a- ?' x- R' Z1 t

6 U' Q  Q8 o/ }& U  {> sqr:=(x)->x^2;
. T8 F" |. [* w8 T& A$ M
  ^" N; E2 T( D: v! j, w3 ~> map(sqr,L);; k- o9 A: Q2 t7 u

9 \8 V( Y& a/ @  A  T  k> map((x)->x+1,L);
; A0 y  a9 t8 h" F  R* F6 ]
4 V' z! \. o4 M5 a1 ^; v> map(f,L);' m: g6 k0 B* g/ L. Q" c6 F0 @* c
9 W; \( k9 ~: _3 D
> map(f,{a,b,c});
( z7 ?; [1 Z: |+ q! Y4 q: C 4 h  I, D0 _" l
> map(sqr,x+y*z);& H& o6 s# T' M, h2 t6 V9 L" A

1 }4 s1 P( W" Z5 J% H# Y( r- w) U> M:=linalg[matrix](3,3,(i,j)->i+j);! y# g. L$ q0 h! J2 K5 h
  X4 {+ \: C/ A0 {  J, w
> map((x)->1/x,M);# E4 y' n2 c1 }, I1 s  i! R- q
+ e, q, ^( J# Z: h
3 求 值: k' D- C3 o4 i( Z' W2 d
3.1 赋值8 s# P: |# W: K* r; c6 B
在Maple中, 不需要申明变量的类型, 甚至在使用变量前不需要将它赋值, 这是Maple与其它高级程序设计语言不同的一点, 也正是Maple符号演算的魅力所在, 这个特性是由Maple与众不同的赋值方法决定的. 为了理解其赋值机制, 先看下面的例子.
/ r, G5 K) G/ M; D6 [> p:=9*x^3-37*x^2+47*x-19;7 R* c, m: l1 Z; U" f; E5 x  E
' Q. b% d6 E. j' J6 Z4 V% x, x
> roots(p);3 Z- x7 H% k- N# T3 O
2 S" \* \1 j" y. Y. t. ^
> subs(x=19/9,p);& K! O8 z, h+ q6 i. V! Q

# ]: l  z  E" a- V* A$ Z在这个例子中, 第一条语句是一个赋值语句, 它的作用是把变量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;”这样的简单语句即可验证.
, ]1 A8 P+ {6 b2 p6 {3.2 变量代换( ?" O0 p2 T5 w0 G. S/ U- W
在表达式化简中, 变量代换是一个得力工具. 我们可以利用函数subs根据自己的意愿进行变量代换, 最简单的调用这个函数的形式是这样的:   % {7 M) X; \% w. r, Y
subs ( var = repacedment, expression);0 b+ Z7 O  E2 `
调用的结果是将表达式expression中所有变量var出现的地方替换成 replacement. 5 G3 N* e! B4 @# W( K% I
> f:=x^2+exp(x^3)-8;
1 {$ _1 Q  }+ N$ }% Z$ a' V: f( v
, a1 ?# P( l0 a> subs(x=1,f);& p- e! F+ q: f) e( D4 v- e
" e4 ?4 ^) _% o2 Y
> subs(x=0,cos(x)*(sin(x)+x^2+5));
) w+ y+ R' p- R( Q* k: W. C
$ w) ?% N4 F' f$ H% m    由此可见, 变量替换只得到替换后的结果, 而不改变表达式的内容, 而且Maple只对替换的结果进行化简而不求值计算, 如果需要计算, 必须调用求值函数evalf. 如:   
4 l" a  _, e9 _  G& P> evalf(%);/ w. Q  X( ]: [3 e
  Y1 }: q3 N0 J' X3 r4 U; {
变量替换函数subs也可以进行多重的变量替换, 以两重代换为例:   
. h) L+ ~1 E4 {- _3 T5 A5 F  `) qsubs (var1 = repacedment1, var2 = repacedment2, expression)
: T' |4 B6 |9 f) O  @0 e$ |调用的结果和按从左到右的顺序连续两次调用是一样的, 也就是先将expression中的var1替换成replacement1, 再将其结果中的var2替换成replacement2, 把这种替换称作顺序替换;    与此相对, 还可以进行同步替换, 即同时将expression中的var1替换成replacement1, 而var2替换成replacement2. 同步替换的调用形式为:   
9 c) p8 B5 |3 [subs ( {var1 = repacedment1, var2 = repacedment2 }, expression)
( n9 a: Z4 \+ M+ {: A- ^$ K' G. ^下面通过例子说明这几种形式的替换.
% F; ~4 n- [( q' H5 \> subs(x=y,y=z,x^2*y);              (顺序替换)
$ _# o. f- q  j4 y- [3 w- ?0 b( L " N6 \2 C; i# Y6 n8 _& x4 S4 m5 ~+ H
> subs({x=y,y=z},x^2*y);            (同步替换)7 L) u/ r, @* y
& H+ i+ A3 {/ \3 ~) f
> subs((a=b,b=c,c=a),a+2*b+3*c);   (顺序替换)
/ G% @- w( v& @( O# c# E
, x& M( v1 n+ s7 E: D. n, P> subs({a=b,b=c,c=a},a+2*b+3*c);    (轮  换)1 t8 V: s  W3 M
" }+ u( k7 e( m5 Y) {. y
> subs({p=q,q=p},f(p,q));             (互  换)
; _& f0 \4 }! k* k, R" U " v) {$ D! d$ B. J* p( D& i$ B
3.3 假设机制  G7 i- x0 S- N7 l0 L
Maple是一种计算机代数语言, 显然, 很多人会尝试用Maple(或其他计算机代数语言)解决分析问题. 但由于分析问题与处理问题的考虑方法不同, 使得问题的解决存在某些困难. 例如考虑方程 的解. 如果k是实数, 结果显然是x=1, 但如果k是 的复根, 为了保证解x=1的正确性, 必需添加附带条件: 也就是当 时x=1. 这是一个对结果进行正确分析的例子. 然而从代数的角度考虑这个问题时就会把k当作不定元, 此时k没有值, 从方程两端去除k的多项式是合法的, 只要这个多项式不是零多项式即可(这一点是可以保证的, 因为其所有系数不全为0). 在此情况下x=1就不需要任何附加条件. 计算机代数系统经常采用这种分析的观点.
/ f) U- F9 N0 @1 U; }在Maple中, 采用分析观点解决这类带有一定附加条件的实用工具是函数assume, 其命令格式为: assume(x, prop);% V7 o3 @+ L/ z- I! d. X5 n6 @
函数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);”也不会产生矛盾.   \- q$ Z8 G- `6 q
> Int(exp(-s*t),t=0..infinity);2 \" Y7 g/ y! E) e7 q

) |* W5 W) ^& c( o* o  i> value(%);
5 n, X; b3 x* ?) ?) A% M5 M. iDefinite integration: Can't determine if the integral is convergent.
3 F5 O- F) h! N8 n' e! i; `Need to know the sign of --> s7 |! H, U8 [2 Q' R2 t4 M! P3 @
Will now try indefinite integration and then take limits.
. \/ W7 R6 T6 f2 Y
! j7 L1 m0 c" }5 }, w; F& Q7 Q3 l! t> assume(s>0);
1 B' F4 J4 L1 Z) d5 G> Int(exp(-s*t),t=0..infinity);
4 q( L! j; D* t  @
* t" ^+ \* p6 K& x/ I7 M> value(%);
' ~( f7 }% D2 l/ O9 x: F
7 _9 R  P2 Y/ v1 E& f, }7 i3.4 求值规则3 {' \  p/ S8 d0 k) C, ^% _* w
在多数情况下, Maple的求值规则设计为做用户期望的事情, 但要做到这一点很困难,因为不同的人在相同的情形下会有不同的期望. 在大多数情况下, 全局变量被完全求值, 局部变量被一层求值. 而由符号' '界定一个暂时不求值的表达式, 单步求值仅去掉引号, 不作计算, 这也是允许取消指定名字或清除变量的原因. 如下例:   5 _6 f7 _1 V; G$ V  S
> x:=y;
  a+ }* v. ], y# ]2 {
, p: o" z  x+ m8 J> y:=z;  t& H/ R5 X7 L: {  z% m, O! V' ~

" |- K' a% q2 Y  W> z:=3;
. s/ w) P4 P4 k8 \/ a1 i  Y6 w 4 Z8 O  M1 p+ i
> x;0 p3 G/ p3 m; p. l2 `

+ w6 H: d. ^: U> y;
7 W2 f. k! w/ Z- s% p- ?
/ }. m( u+ S' `( Y5 d6 d; w6 E> x:='x';/ n$ g0 |+ i* l! `9 k8 D

4 D' }9 X/ @& z" P! x> x;
7 `! _. T/ x- j) K # b/ V- Z4 L5 G* @
> y;
' Q2 y4 ~7 B$ k! I$ b9 ]
8 K6 Q. i( G8 k; q对于不同的问题, Maple设计了不同的求值命令. 现分述如下:   ' }" }' j' z) C! {8 U; d* {
1) 对表达式求值1 {1 Y# |+ F! L
命令格式: eval(e, x=a);  #求表达式e在x=a处的值
/ E* l( h0 {+ v% r  O3 W# I             eval(e, eqns); #对方程或方程组eqns求值9 g' p+ T: e% t9 [  T* X
             eval(e);      #表达式e求值到上面两层
3 x% W* O* f  Z6 p3 I/ g9 @: }             eval(x,n);    #给出求值名称的第n层求值! K9 o% W6 w: h; z3 k& E: B
> p:=x^5+x^4+x^3+x^2+x+73;
; [5 u1 Z/ c$ Y. u6 G ' s, d/ U9 I5 c. R, y+ I9 p2 Z7 ^
> eval(p,x=7);* ]6 J% p# J. {; [. X
5 P; i  i% x) G& t4 B& i, P
> P:=exp(y)+x*y+exp(x);  R! [# ]. [: [0 g* N$ _- }
& D! ~1 Z. ~; p/ O2 `9 x9 C
> eval(P,[x=2,y=3]);
: U; i1 P- ]$ w& A
; J% T) g  @2 D/ Q6 l0 g! K; x* R    当表达式在异常点处求值时, eval会给一个错误消息. 如下:   7 u# W; G: Y: T2 I; W
> eval(sin(x)/x,x=0);
. W" P" T; _3 E3 Y! vError, numeric exception: division by zero
7 S$ R, ?- V3 x" L! [3 k: S    下面再看使用eval进行全层求值或者对名称几层求值的示例:   
& d, o, u- B6 T4 e> a:=b: b:=c: c:=x+1:
# w# z9 s: y  E, x& j> a;              #默认的全层递归求值
+ f' l9 i0 ~. O " ^2 k% ?5 u, p: o6 ~) T2 U
> eval(a);        #强制全层递归求值
7 O' q& u4 {. p% A: |& V$ ?
6 E# r" V: I. R8 c5 e: Z* n0 y> eval(a,1);       #对a一层求值
. \; o" K  f: C3 y5 \/ Z 4 w9 u# f1 w2 h! M
> eval(a,2);       #对a二层求值
2 _" K6 Y) K' n/ U ' {8 t5 B. M' _' _
> eval(a,3);       #对a三层求值" W/ h3 l, M% ~: x1 h

8 c  Z7 Y+ N. N; _! U* f: A> eval(a,4);       #对a四层求值
# O& t$ q' H( c* G3 n) p
, c2 n! O# p0 m& d% F    2) 在代数数(或者函数)域求值
( [/ t: J3 S: L5 j9 v' C4 Q+ S命令格式: evala(expr);       # 对表达式或者未求值函数求值
' q4 L1 j6 g4 S             evala(expr,opts);   #求值时可加选项(opts)
. P) N! W9 A6 z: E$ q+ H6 s6 I所谓代数数(Algebraic number)就是整系数单变量多项式的根, 其范围比有理数大, 真包含于实数域, 也就是说任意实数都是整系数多项式的根(如 就不是任何整系数多项式的根). 另一方面, 代数数也不是都可以表示成为根式的, 如多项式 的根就不能表示成为根式的形式.
6 j9 L4 ^6 ^+ N1 y( r  `; K代数数的计算, 算法复杂, 而且相当费时. 在Maple中, 代数数用函数RootOf()来表示. 如 作为一个代数数, 可以表示为:   6 I* a/ f5 @3 H/ }' B4 d8 L. |
> alpha:=RootOf(x^2-3,x);
5 p9 L8 o# k& x5 a8 n; P1 ~1 X/ v5 P
# w# ~& x% D6 _: s4 I5 T- e> simplify(alpha^2);
& v/ ]. U+ S% k8 k
" U' b9 h' F$ Q9 @7 B) W( G5 X在Maple内部, 代数数 不再表示为根式, 而在化简时, 仅仅利用到 这样的事实. 这里, Maple用到一个内部变量_Z. 再看下面一个例子,其中alias是缩写的定义函数,而参数lenstra指lenstra椭圆曲线方法:" ~# l6 a, a3 J4 I; c  m) x
> alias(alpha=RootOf(x^2-2)):6 c! u: }, c. Q  P
> evala(factor(x^2-2,alpha),lenstra);
2 }( m! v9 S1 S% Z; G8 V  S 9 L& n  ?: T" ~8 f5 a2 j
> evala(quo(x^2-x+3,x-alpha,x,'r')); 8 U3 g8 w9 c# b, c
6 m( ^, S7 \$ O. T
> r;8 P+ L. E) O0 {) F9 x

/ E8 |; A9 `8 F9 Q; D> simplify(%);
3 I) y6 [. E* S, k: Y1 w
2 e' @: B5 J8 K5 e3 ]: |3) 在复数域上符号求值
1 _' Y2 K. Q( y, h% }操纵复数型表达式并将其分离给出expr的实部和虚部的函数为evalc, 命令格式为:2 k; z3 M8 c- e1 u$ F: L
evalc(expr);   
$ P% U8 A' j) D; u" ]8 l4 y! f% U. pevalc假定所有变量表示数值, 且实数变量的函数是实数类型. 其输出规范形式为: expr1+I*expr2. , W5 P; p0 ~6 a/ W- x
> evalc(sin(6+8*I));* z1 `4 \% L( C0 o4 u

( {3 a0 g  u4 z2 i* }8 P5 u% `/ ?/ f> evalc(f(exp(alpha+x*I)));2 t+ `8 e- T& a- A1 X
* R! o2 a# V* C% L" k
> evalc(abs(x+y*I)=cos(u(x)+I*v(y)));# j( `- f1 S, g! B  W
/ e9 t4 ~2 q2 Q. h+ w0 V
4) 使用浮点算法求值
, H; Y7 p# _! R1 g/ J0 B; X浮点算法是数值计算的一种基本方法,在任何情况下均可以对表达式expr使用evalf命令计算精度为n的浮点数(n=Digits), 如果n缺省, 则取系统默认值, 命令格式为: evalf(expr, n);     + P+ ^- J% N5 W( W" u1 s. J$ s0 e
> evalf(Pi,50);    0 d3 j! ~( i. ^! N& v2 r
2 m# p  w, ]1 d- u$ c& V
> evalf(sin(3+4*I));   
4 ^1 e$ @. i% @
+ X6 x; L/ w' H/ x  D0 E" v> evalf(int(sin(x)/x,x=0..1),20);$ ~; L' x3 j0 Y0 _3 x
; l. n6 N! k3 Z' P3 y" l$ \
5) 对惰性函数求值2 H7 _- P/ R# T. |: G8 r/ q
把只用表达式表示而暂不求值的函数称为惰性函数, 除了第一个字母大写外, Maple中的惰性函数和活性函数的名字是相同的. 惰性函数调用的典型用法是预防对问题的符号求值, 这样可以节省对输入进行符号处理的时间, 而value函数强制对其求值. 对任意代数表达式f求值的命令格式为: value(f);   4 z2 X8 z# D% W7 t' @+ _) k+ F  n$ S
> F:=Int(exp(x),x);
9 w3 Q) U& G0 a3 Y# w 0 W  W- g5 P/ e. L* t6 g
> value(%);5 A) q. r1 G! G! i  f5 @& n- _

; h* E6 c- F+ l/ W> f:=Limit(sin(x)/x,x=0);& c8 @# ]: N9 L- @* {$ \' H
; [; r' p+ l) G& h' c5 z% p* N
> value(%);5 u) o; `3 e! x" r* Q& P8 h

* N% ?4 t( p( `0 ?另外, 将惰性函数的大写字母改为小写字母亦即可求值. 如下例:   
; c/ b! ]+ L( J% I3 j> Limit(sin(x)/x,x=0)=limit(sin(x)/x,x=0);
4 g2 k. j  V7 R* ]6 n3 I$ g ) z% s- u0 i- I, a9 }5 O1 K& \
4 数据结构/ b& ?: E" ]0 b2 j/ B' _
Maple中有许多内建的与FORTRAN、C或Pascal不同的数据结构. 主要的数据结构有序列(sequence)、列表(list)、集合(set)、代数数( algebraic number)、未求值或惰性函数调用、表(table)、级数(series)、串(string)、索引名(index)、关系(relation)、过程体(process)以及整数(integer)、分数(fraction)、浮点数(float)、复数(complex number)等数据结构, 而矩阵(matrix)在Maple中表示为阵列, 是一种特殊的表.
- |8 p( c% Q+ ?/ B; _1 v2 h+ v+ x, C4.1 数据类型查询. ?/ {, H6 u% L/ [& w. V6 E
在Maple中, 用whattype指令来查询某个变量的数据类型或特定类型, 命令格式为:
' I3 n2 m$ j+ W- Ywhattype(expr)        # 查询expr的数据类型
5 Y1 F  p7 e: k1 Atype(expr, t)           # 查询expr是否为t类型, 若是则返回true, 否则返回false
+ L' o0 T4 H& i> whattype(12);
3 i' h5 F; g' z
) O8 ^0 U6 I( E! b9 o' g- [$ w> whattype(Pi);
& @6 |5 r+ [" D4 N
) y/ }4 |) e. b3 P* x4 w9 G% h> type(1.1,fraction);
4 f. p0 o" [2 \( ]: {
- v  m) o  f5 T' z( n* _> whattype(1.1);
8 t- B1 }5 T! s) m4 C1 }% e7 I3 L
: G$ |) D1 h" |" J4.2 序列, 列表和集合
' d' [+ t5 f% ]) i4.2.1 序列: n' s+ I  T" H4 \6 m0 m+ U  {
所谓序列(Sequence), 就是一组用逗号隔开的表达式列. 如:   
' L, u9 `: w6 L- G> s:=1,4,9,16,25;: f. y; U+ x& d$ [
4 Q6 `' M' q; N! a. {0 I
> t:=sin,com,tan,cot;
4 }' a+ w+ J7 M
  q* |6 b7 T5 P4 Z' _  u5 V  S一个序列也可以由若干个序列复合而成, 如:   
2 R* s/ Z/ _- s( A  Z/ F8 w) J/ h* }> s:=1,(4,9,16),25;  f) n' X5 \: i$ @9 _

6 j; S' g' Y) [& t2 \" ?* Z9 d1 L" _> s,s;0 ?( K, d5 J; X2 c+ a8 T

) j5 z5 s8 F9 N7 A: N# B而符号NULL表示一个空序列. 序列有很多用途, 如构成列表、集合等. 事实上, 有些函数命令也是由序列构成. 例如:   5 e9 M: D  f, p4 g# U2 r
> max(s);+ I! m  j  |5 F6 K5 e0 [

$ i( N& B& w  t> min(s,0,s);
7 J) ?* o9 m- R8 B" T % g6 C1 D1 J# a) i" R% F
值得注意的是, op和nops函数命令不适用于序列, 如op(s)或nops(s)都是错误的, 如果要使用op(s)或nops(s)前应先把序列s置于列表中.
; X% b1 A  E& E# ]( |> s:=1, 2, abc, x^2+1, `hi world`, Pi, x -> x^2, 1/2, 1;
/ K! ]' E+ J6 o3 \ 1 D  p4 r' n; @$ [
> op(s);
6 ]+ e& y& L7 A' k; x' O+ z9 B4 qError, wrong number (or type) of parameters in function op: N6 c$ z9 q. l, O% z! n
> nops(s);( x! ]$ u) J6 ], t1 ?
Error, wrong number (or type) of parameters in function nops' w" l! |4 s* I5 f0 r$ R; r
> op([s]);
6 K+ A+ Q' S+ }4 w! B " G$ u$ [$ X7 ?( {& w4 d
> nops([stuff]);# g! k+ b* D% l# K  Y
  {: A7 {) |% n9 Q& ?8 c
函数seq是最有用的生成序列的命令, 通常用于写出具有一定规律的序列的通项, 命令格式为:   
7 {# R3 R' c/ q: Hseq(f(i), i=m..n);  # 生成序列f(m), f(m+1), …, f(n) (m,n为任意有理数)
+ z' Q4 N5 N) s6 k% Wseq(f(i), i=expr);  # 生成一个f映射expr操作数的序列
! I$ ~% f6 y# T# n; v/ d" xseq(f(op(i,expr)), i=1..nops(expr));  # 生成nops(expr)个元素组成的序列( K9 T$ [3 D7 E0 R' V0 u5 p
> seq(i^2,i=1..10);* _6 ?; X2 L( V5 J, l
- f/ G/ ~3 F% D& C
> seq(ithprime(i),i=1..20);  I, Y1 Z+ Y6 p, Z, y

9 H5 n# J! Q$ G5 d9 [> seq(i^3,i=x+y+z);
8 i/ b! W4 P' ^* _( y0 t
/ b) M, v" q; j  v; r% h> seq(D(f),f=[sin,cos,tan,cot]);
0 P" E( Y  M. T; p( z& a7 T
* e$ N* L" I' U0 ^# |" x2 j+ O> seq(f(op(i,x1+x2+x3+x4)),i=1..nops(x1+x2+x3+x4));
  `# n/ {2 N+ i- K3 X9 C) y
9 d6 g6 B3 P. m3 {9 V6 v获得一个序列中的特定元素选用操作符[  ], 如:   - ^% r+ r3 j# W8 V7 g; a: U) h" S/ y
> seq(ithprime(i),i=1..20);
0 w% F  x, D0 X! ? ) ^9 g4 F/ T+ V* g. e
> %[6],%[17];+ }6 X. j/ T' r4 b' n! N* W

, \/ G3 y6 {) s+ r) f0 c4.2.2 列表
. D; B! u1 g/ f列表(list), 就是把对象(元素)放在一起的一种数据结构, 一般地, 用方括号[  ]表示列表. 如下例:   + c& V+ l* U5 ]; M
> l:=[x,1,1-z,x];4 t) Q& F0 [7 z2 C( a: W9 ~6 I
9 i# |, `8 L( D9 k+ F. |
> whattype(%);5 c4 @1 m2 }2 `4 {, b+ }; S/ R: f
& g3 N  i! V6 ^' C8 T1 c
空列表定义为[ ]. " `- s4 a( a5 K
但下述两个列表是不一样的, 因为对于列表而言, 次序是重要的:   
3 |7 X; |2 H; g  j. Y! y> L:=[1,2,3,4];: Z! C& b% }# }
( j+ \- V5 u9 S' G( e3 U
> M:=[2,3,4,1];7 s5 E& ?' ^6 o4 h6 Z% W0 g0 v7 a7 N
& e$ P6 k1 N8 z& I* s' }
4.2.3 集合
7 J8 A- S" d6 D; f' i( B  U集合(set)也是把对象(元素)放在一起的数据结构, 与列表不同的是集合中不可以有相同的元素(如果有, Maple也会自动将其当作同一个元素), 另外, 集合中的元素不管次序. 一般地, 用花括号表示集合. 5 N- V) o1 @, A5 _
> s:={x,1,1-z,x};$ \& I4 Y( |: x( T

- H8 Q4 j8 C& U9 y> whattype(%);
8 \9 R) d" G- q! C$ u2 B; S
( v- i9 ?! N  G( P" J8 p2 E空集定义为{ }. 0 M0 e, }2 S& K4 a
函数nop返回列表或集合的元素数, 而op则可返回其第I个元素.
) C! \) x: @, k# l) x0 N> op(1,s);
! [7 }% J# g8 j! H0 V) j) B
6 C# T: s! v2 O% [> s[1];
& ^: V4 n, _5 g3 Z& o0 b
! v3 z, w1 j& J3 e+ C9 h> op(1..3,s);) ^7 G5 Z6 u# s2 e0 o! [4 C2 e
! i6 P  I: e6 I/ Z; `7 R  d2 I( q
> s[1..3];* a6 Q: u' F$ L. h7 P, j- ]

8 W; ^" C5 j. F+ C函数member可以判定元素是否属于一个列表或集合, 如果属于, 返回true, 否则返回false.
; {1 g* o+ c* P  `0 @, r9 q> member(1+x,s);
. l  ?, Y( W, D+ P5 V! t ; W2 u8 j8 x3 T- {4 `! f
可以通过下述方法在列表中增减元素:   7 e0 a: b4 d. Q7 \! }9 e* m
> t:=[op(s),x];
4 S( G' [1 j6 a/ I( I
8 W  Z# k. f! M2 I4 Y2 K> u:=[s[1..5],s[7..nops(s)]];5 d0 p$ T1 w  e* L3 E

( \& `, u( n$ b" G6 f! M5 LMaple中集合的基本运算有交(intersect)、并(union)、差(minus):   % ]; Y+ [$ o4 l! H  |: n1 I
> A:={seq(i^3,i=1..10)};B:={seq(i^2,i=1..10)};
, g/ a6 t6 x' U" N, l; U 1 a9 g) _" h0 g0 s

( y3 m: Q3 g7 y1 F7 w& Z> A intersect B; : N; K1 F* r3 ?: ]/ g; v
' m% _8 p  H  u5 t" g
> A union B;
* \4 S6 S, u2 N% P3 `4 v 3 |; _$ s0 a/ L1 `4 b* O
> A minus B;
  g, }2 n1 ?% I7 V$ {
6 E0 v7 Z4 }9 O2 L" ?* M6 r4.3 数组和表& G- D* S9 w& K  O% l
在Maple中, 数组(array)由命令array产生, 其下标变量(index)可以自由指定. 下标由1开始的一维数组称为向量(vector), 二维以上的数组称为矩阵(matrix). 数组的元素按顺序排列, 任意存取一数组的元素要比列表或序列快的多. 区分一个数据结构是数组还是列表要用“type”命令. - A, b6 s) t4 M; k- U; c. O; \
    表(table)在建立时使用圆括号, 变量能对一个表赋值, 但一个在存取在算子中的未赋值变量会被自动地假定是表, 表的索引可以成为任意Maple表达式. 表中元素的次序不是固定的.
/ N: P- d% R9 _2 K) e> A:=array(1..4);
) X0 H, Z8 e4 r! H. ?5 S% u1 R7 t1 U9 O 1 X- f6 i9 j# D6 G
> for i from 1 to 4 do A[i]:=i: od:
$ |$ y0 U2 R2 X. k/ F# h) J8 }  T> eval(A);/ q# }% w/ A& o: Z3 Q5 T
3 I- N1 m# K5 u
> type(A,array);2 \: t# `3 I- {1 x) [

+ M  l5 a* K* G2 p4 f! M8 Z> type(A,list);1 ^+ u# p( s4 K4 Z9 U. w

2 y% l8 q& P$ v% ~, S> T:=table();
2 v2 B6 C$ V2 k8 q1 S : `! u: K- `! g, [  T" N
> T[1]:= 1;
+ L; L4 Y/ T1 e
" g! D, _8 E0 b8 O> T[5]:= 5;
5 r. y$ b. I# K+ X! k& i. O0 L: k
5 K7 Y( G  M5 N> T[3]:= 3;
4 H( _  J' q  |0 M6 N6 o 1 q! T; r4 w! K1 k4 C
> T[sam]:=sally;
$ o8 ~  T& Y* F; j$ L* q
' Z0 n- H% C4 t2 @7 e+ F/ }> T[Pi]:=exp(1);; C2 K: Z/ a3 b% v8 l
- t, f, [- H/ P$ Q4 n4 ~
> x:='x';
' T0 M( O- n' O9 n( i2 y4 P ' j" ^0 Q( s; t# l4 P
> T[(1+x+x^3)*sin(x)] := 0;
/ y4 z' A1 n2 h
( `6 F8 A+ L( k5 A2 N4 x> eval(T);
* D2 E, z# v" x% q
- V$ o/ h% P2 a+ Q* [> T[3]:='T[3]';
4 Y. _: Q& _# v2 f& [+ i
) B; D' f/ Y& \7 Q3 S9 Q> eval(T);
; j6 a" Z6 d9 t6 h: O5 | + Z; S- S$ y8 H! Q# H8 X
4.4 其他数据结构% y6 h7 R: w# d
串在Maple中是很重要的, 他们主要用于取名字和显示信息. 一个Maple的串可以作为变量名, 它们中的大多数是简单的、不需要加引号的串, 但是如果变量名中包含/. 例如“diff/T”则必须把变量名用引号括起来. & [& M( J4 N1 Y4 k7 F* j
索引名是像Database[1,2,drawer]或A[3]这样的对象, 在使用索引前不需要直接建立表, 如果不得不做, Maple会自动建立表. 索引名通常被用于矩阵和向量. 为了保证Maple建立表的正确次序, 建议在赋值前直接建立. ( {" y. r* |8 y! `
> x:=T[3];
; x/ Y7 k3 L% o9 u, a' g& V4 @ , x3 y+ ?3 ]* y- S, r5 n. x4 }0 X
> eval(T);
7 ~5 T4 ^" C% V* Q1 b- V" P  q, S) F 8 R9 h0 w5 V9 y# a' f( ^
> T[5]:=y;/ }5 N1 Y( N2 Q% y) m: I* S8 g+ c

: _7 Q$ d; H  G& o9 C+ e- v> eval(T);+ M! h. O( P+ e6 S

+ d' }- ^5 M4 W9 ]; q* ~! f  {由此可见, Maple并不直接建立T的表, 直到给T[5]赋了值.     
$ E0 L- E+ U+ W# a+ ]" }数值数据结构(整数、分数、有理数、浮点数、硬件浮点数和复数等)在它们的使用中是大量透明的. 浮点数是有传染性的, 这意味着如果数值结构中有一个是浮点数, 则整个结构自动转换为浮点数. 9 U6 Y+ |% L3 d$ I* B# p$ ^
4.5 数据类型转换和合并
$ P0 V  C3 c# T0 j8 I8 Sconvert是一个功能强大的类型转换函数, 它可以实现列表和数组的类型转换:   # ~% D" K- b9 F3 @( q& p
> L:=[1,2,3,4];
1 n& X: l$ }  l4 d' d( R ! i/ }1 O. K+ i; i
> type(L,list);% O+ q2 K/ B; k3 O$ R9 r1 C! U' p

2 ]+ ^# s! q# v# |* b+ V( x* v> A:=convert(L,array);4 F1 v, g% Y! f- H) c' d$ p

8 |4 |' w9 G( y8 d3 z> type(A,list);
& P; i/ U7 z" D" _1 A 8 E' P2 f! [. x! r6 h5 |
> type(A,array);, d* \  h+ Z& l+ q7 \3 W
! A3 r- n" z. O. N: c
另一个有用的函数zip则可把两个列表或向量合并:   - N# X1 q# p% M$ t2 O
>L:=[seq(i,i=1..10)];
2 m: ]8 H& N* y6 y+ C6 P
" ^/ n  ?' Q. @! e$ q+ v) Y> Sqr:=(x)->x^2;
$ ~- O. [7 W' U4 j
# j) l( }6 B2 g; h> M:=map(sqr,L);
$ f* f" `- p6 P- R
3 s8 J9 X$ S; O> LM:=zip((x,y)->[x,y],L,M);
" m, q$ \! e8 ^ ) v; ~, |9 L! Q" z% v
> map(op,LM);
1 Y1 t8 o3 _. n" a" T* ~+ d) g ; J- A4 ]( t% _
5 Maple高级输入与输出操作
# z8 }5 ^# H: ~1 X' Y  D, v. C8 dMaple提供了良好的接口来编辑与计算数学式. 许多时候, 我们可能需要把Maple的运算结果输出到一个文件中, 或者在一个文本编辑器里先编好一个较大的Maple程序, 再将它加载到Maple的环境里.
) W5 m2 q1 f6 }- j  |/ E5 P5.1 写入文件+ `5 K) p1 r, x& I
5.1.1 将数值数据写入到一个文件7 K% Z7 o' A; v2 ?4 D
如果Maple的计算结果是一长串的数值串行或数组, 而想把它写到一个文件时, 用writedata命令.
% G* |% u5 o. f若Maple的计算结果data为集合、矩阵、列表、向量等形式时, 将其写入名为filename的文件时命令格式为: writedata("filename", data);
# s7 B2 k& y: |4 m. o8 k5 c> with(linalg):8 J+ w* P( l( z
> M:=matrix(3,3,[1,2,3,4,5,6,7,8,9]);
+ G1 b* ?( D0 s
; d; B/ i  X9 r* k* k> writedata("e:\\filename.txt",M);! ~# Y  \9 {3 x1 U8 t& m/ k
而将结果附加在一个已存在的文件后时,使用命令: writedata[APPEND]("filename", data);3 d' w7 `2 Q; Z6 l
> W:=matrix(2,2,[1,2,3,4]);; k2 P! ~5 ~9 K5 d3 _% g& D
& a- k9 O. h: F8 ^& F% q1 q
> writedata[APPEND]("e:\\filename.txt",W);
, o. h( R! W& W: l1 K7 U需要注意的是, 这里的APPEND是必需的, 否则W结果将会覆盖M结果.& v7 _0 q2 @+ n
另外, 若想将结果显示在屏幕上时, 用命令: writedata('terminal', data);
4 K' o7 n4 w1 D! n) J> writedata[APPEND]("e:\\filename.txt",W); / [. }/ }# b& j  C% \9 j- Z
> writedata('terminal',M);) S5 ~  R0 k1 M  p
1                   2                   3           : O5 n% t. u. M
4                   5                   6           
* x5 U2 ^) Y" k9 M9 q7                   8                   9   
( T4 v' T; l7 d& v. Z5.1.2 将Maple语句写入一个文件
! _) [8 q4 p; c3 R. Y& Q. \- g如果所要写入文件的是表达式、函数的定义或者是一个完整的程序, 则使用命令save, 写入一个或多个语句的命令格式分别如下:% ~$ J8 q" T0 B, K4 Y+ O; j( r/ J+ U
save name, "filename";
& ?9 H0 B1 B" D% f  L% ]save name1, name2, …, "filename";
) \4 L; `& v) J( e4 P若filename的扩展名为.m, 则Maple会以内定的格式储存, 若扩展名为.txt, 则以纯文本文件储存. 以内定的格式储存的文件作纯文本编辑器无法读取, 但在大多数情况下, 它会比纯文本文件的加载速度更快, 且文件容量小.
+ v9 H) M( M1 V/ Y> myfunc:=(k,n)->sum(x^k/k!,x=1..n);
; U: f" N8 O1 \1 Q/ [% r4 S 1 d( m, z3 g; n4 z4 K/ B9 Y2 ^
> myresult:=myfunc(6,8);+ B' B0 i3 Y6 T' M0 }3 A
, z! B& ]- F+ ]( ?& H- C
> save myfunc,myresult,"e:\\test.m";8 [, O1 ?5 l6 |* u' j9 E# K2 R
调用已存m文件用命令read. 试看下述实验:6 ~: X! |& b8 I# i: w6 k& e
> restart:+ ~8 z- A4 Y/ R
> myfunc(6,8);
- @) l4 M; ?5 }8 n- m8 J2 C7 }
% ~$ J$ c" C* z+ y> read "e:\\test.m";( `4 U& j: k0 n- J# Z! C
> myfunc(6,8);' S* k' f3 z4 f% M& c! @+ E

7 _& {. h6 s% R. {+ g> myresult;
7 X5 \% d" k0 y) S
( |+ E9 Z; s9 N4 H+ B( E  {    而存为txt文件时则将整个语句存为一个文件:( Z1 |* Z' d- N% q2 Y: l3 |! ^4 u
> save myfunc,myresult,"e:\\test.txt";
+ N4 Z2 S6 B8 @% w) x+ V( e> restart: read"e:\\test.txt";1 W3 x' \# u' K
/ \! g4 f* j+ k! G* N  L1 C* S2 Z

  g3 l$ H% t- l! X3 l- h7 j- H5.2 读取文件" U$ e9 E! V1 n$ @
在Maple里最常用的两个读取文件的命令, 一个是读取数值数据, 另一个是是读取Maple的指令.) \* P' @. A8 p  T. o; O/ L0 B
5.2.1 读取数值数据' h0 l+ K4 o- j9 L: d
如果想把大量的数据导入Maple里进行进一步的运算或者要运用大量的实验数据在Maple环境绘图时, 可以用readdata( )命令完成.
" h; N8 K. C. o1 \/ b* D从filename文件里读取n行数据时使用命令: readdata("filename",n);- }! {7 s- v3 {2 K
以指定的格式读取数据时使用命令: readdata("filename",[tyep1,type2,…]);" C$ `+ w: o4 j0 Z
> readdata("e:\\filename.txt",3);
5 b# p: E4 }5 x4 r. Z& v) }  @
# ?- f% ?- N* n5 p+ Z  [) b    读取filename的前三列, 第一列为整数形式, 第二、三列为浮点数形式:1 Q2 ]7 B; V& O
> readdata("e:\\filename.txt",[integer,float,float]);
8 |1 _+ b. Z. N 5 m4 b6 h. }2 @. V3 n
下面再看一个运用大量的实验数据在Maple环境绘图的实验:5 A+ l/ E( N) A
> mypts:=[seq([x/1000,cos(x^2/100000)],x=1..1000)]:5 o" K, m& z; H8 j
> writedata("e:\\data.txt",evalf(mypts));
! Q1 G3 W2 {$ h' x9 f# l> dots:=readdata("e:\\data.txt",100):; L$ S6 n2 Q8 u4 i
> nops(dots);$ V4 o& K. L/ F: p6 {
. H( Z" m9 }! e  o  S4 K1 R
> dots[1..4];
: g9 A9 J4 q" a# y3 T 2 X2 y! l3 h# a3 F9 G
> plot(dots,style=line);
  ], a4 ~1 ]2 H0 P; U/ y# w
& i" N5 G6 Y& a+ A5.2.2 读取Maple的指令. z1 m/ N/ v# x
在编写程序时, 在普通软件中先编好程序再将其读入Maple环境中常常比直接在Maple中编写更为方便. 如果要将程序代码或Maple指令加载用read命令:
9 T# {" A" S, ]3 r5 Eread "filename";; P* q8 N, W4 [1 H
如下例:
# k) d/ ]. y0 `> reatart:
# O$ X! W: Q7 E8 R0 z9 |> myfunc:=(a::list)->add(i,i=a);
) l# S! N; {0 X! F / o5 X- q& `4 {2 d- R2 z- t2 h
> avg:=(a::list)->myfunc(a)/nops(a);
& S  [4 I9 |) v- s7 }0 g% R0 I 8 D' \- C  W5 N6 ~8 G' z; ?
> save myfunc,avg,"e:\\function.m";  w7 v% l, T  x6 L* d" E4 o0 g
> restart:! c' e7 v% `4 n4 m; t
> read "e:\\function.m";7 p, t  v, f  @
> myfunc([1,2,3,4,5,6,7,8,9]);
1 a9 H: N) \3 z- L2 t8 B# f
9 m* a: N# w4 ^& d/ I. U. g> avg([1,2,3,4,5,6,7,8,9]);; Q4 T; }, r8 f  g: G4 Z; P

! R! i! H/ a0 c, K7 |5.3 与其它程序语言的连接
" K. a$ L8 J  x/ d& Y1 q! K- k5.3.1 转换成FORTRAN或C语言5 l% R. t( ]0 ^6 D
调用codegen程序包中的fortran命令可以把Maple的结果转换成FORTRAN语言:
9 Y5 x$ _7 i1 P1 W$ g7 C$ P6 v/ E- W2 I> with(codegen,fortran):
$ T9 H0 X- ~" g, {/ Hf:= 1-2*x+3*x^2-2*x^3+x^4;
4 w% c( G; A" {% T. E/ H - U1 V/ y0 ~- h) e  m8 K! B
> fortran(%);2 Z9 w& q, e' D) h' {
      t0 = 1-2*x+3*x**2-2*x**3+x**4% b; [1 H* p8 U0 {
> fortran(f,optimized);6 x; g" C2 j& j  o& S% M( m
      t2 = x**2
+ N. O* @: x  S' U4 R1 T      t6 = t2**2
5 B7 q4 U3 n- o* ^4 L1 w, Y# x      t7 = 1-2*x+3*t2-2*t2*x+t6
9 D! T2 f) S1 S! _* e> fortran(convert(f,horner,x));; q/ V. K+ {/ i! c- X+ `- G2 t2 C
      t0 = 1+(-2+(3+(-2+x)*x)*x)*x
+ J4 `' p8 }* a. z$ |( P5 r而codegen程序包中的C命令可以把Maple结果转换成C语言格式:
& N+ l6 H6 I  `  D3 \5 k, [> with(codegen,C):
7 Q- i! i* P& l2 b7 \f:=1-x/2+3*x^2-x^3+x^4;+ z! D$ \, u' h! h# L7 o' [

; e+ _! @) `( p4 ?$ ~6 b0 c/ @) T> C(f);) R3 N6 v. o( ~: T
      t0 = 1.0-x/2.0+3.0*x*x-x*x*x+x*x*x*x;
% U& L, h1 q( u1 Y3 V> C(f,optimized);
% g% q$ r3 J& L! [' L7 }* o2 \      t2 = x*x;
( K& j6 b( a. }, m( R      t5 = t2*t2;& K3 v- e- ^! p
      t6 = 1.0-x/2.0+3.0*t2-t2*x+t5;
- h) h& l0 V4 j1 g3 z0 Noptimized命令表示要对转换的表达式进行优化, 如果不加此可选参数, 则直接对表达式进行一一对应的转换.
# q2 n6 U& j0 U" b5.3.2 生成LATEX' d; B' p1 M$ C0 o* A) u: R
Maple可以把它的表达式转换成LATEX, 使用latex命令即可:/ L2 I3 Z7 Z7 I. f# |7 {
> latex(x^2+y^2=z^2);
, L" `( D0 S7 [" i% l{x}^{2}+{y}^{2}={z}^{2}1 ?  q7 R$ \9 K* ~& B$ Q
    还可以将转换结果存为一个文件(LatexFile):- H6 L( @; l+ Z: n/ m
> latex(x^2 + y^2 = z^2, LatexFile);: p( J# |- O9 A, v% q
    再如下例:
, z6 W- n, {" a* m> latex(Int(1/(x^2+1),x)=int(1/(x^2+1),x));2 q0 D+ r5 N; T' A, I$ G. T
\int \! \left( {x}^{2}+1 \right) ^{-1}{dx}=\arctan\left( x \right)
% j& t+ I4 R; W- V
! P4 m. e# p: }6 j' Z. 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年!
    * O& g+ L, A2 F! S0 B( c9 F1 k9 B! r1 ?

    ; u: h6 u; ]5 h' q! U% U: A
    回复

    使用道具 举报

    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-7-9 13:14 , Processed in 0.438600 second(s), 100 queries .

    回顶部