QQ登录

只需要一步,快速开始

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

maple基础

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

1

主题

5

听众

4

积分

升级  80%

该用户从未签到

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

6 ]+ a+ k+ R; I1 Y7 l第一章  Maple基础# p. D& D: Z: p  p  x3 E" p

4 F' H6 S' \8 Z& l3 \2 a& f1 初识计算机代数系统Maple
$ Q8 p* w+ I: g; u' `+ b6 j1.1 Maple简说0 n; j  c% m2 Q0 C8 H( P/ ~
1980年9月, 加拿大Waterloo大学的符号计算机研究小组成立, 开始了符号计算在计算机上实现的研究项目, 数学软件Maple是这个项目的产品. 目前, 这仍是一个正在研究的项目. % [9 H8 s% X3 C
Maple的第一个商业版本是1985年出版的. 随后几经更新, 到1992年, Windows系统下的Maple 2面世后, Maple被广泛地使用, 得到越来越多的用户. 特别是1994年, Maple 3出版后, 兴起了Maple热. 1996年初, Maple 4问世, 1998年初, Maple 5正式发行. 目前广泛流行的是Maple 7以及2002年5月面市的Maple 8. 5 D- U7 x' V/ X
Maple是一个具有强大符号运算能力、数值计算能力、图形处理能力的交互式计算机代数系统(Computer Algebra System). 它可以借助键盘和显示器代替原来的笔和纸进行各种科学计算、数学推理、猜想的证明以及智能化文字处理.
6 ?* m1 G' H# u# f: L/ X, Q1 iMaple这个超强数学工具不仅适合数学家、物理学家、工程师, 还适合化学家、生物学家和社会学家, 总之, 它适合于所有需要科学计算的人. 9 s7 f1 Z4 H8 s; P
1.2 Maple结构9 C" ^. R' h- d
Maple软件主要由三个部分组成: 用户界面(Iris)、代数运算器(Kernel)、外部函数库(External library). 用户界面和代数运算器是用C语言写成的, 只占整个软件的一小部分, 当系统启动时, 即被装入, 主要负责输入命令和算式的初步处理、显示结果、函数图象的显示等. 代数运算器负责输入的编译、基本的代数运算(如有理数运算、初等代数运算等)以及内存的管理. Maple的大部分数学函数和过程是用Maple自身的语言写成的, 存于外部函数库中. 当一个函数被调用时, 在多数情况下, Maple会自动将该函数的过程调入内存, 一些不常用的函数才需要用户自己调入, 如线性代数包、统计包等, 这使得Maple在资源的利用上具有很大的优势, 只有最有用的东西才留驻内存, 这保证了Maple可以在较小内存的计算机上正常运行. 用户可以查看Maple的非内存函数的源程序, 也可以将自己编的函数、过程加到Maple的程序库中, 或建立自己的函数库. & r7 u: U$ q# P* [- ]! P
1.3 Maple输入输出方式
+ I3 \/ Z( w8 k1 m/ z% p为了满足不同用户的需要, Maple可以更换输入输出格式: 从菜单“Options | Input Display和Out Display下可以选择所需的输入输出格式. " @* A' H% }2 G4 s/ v$ ~
Maple 7有2种输入方式: Maple语言(Maple Notation)和标准数学记法(Standard Math Notation). Maple语言是一种结构良好、方便实用的内建高级语言, 它的语法和Pascal或C有一定程度的相似, 但有很大差别. 它支持多种数据操作命令, 如函数、序列、集合、列表、数组、表, 还包含许多数据操作命令, 如类型检验、选择、组合等. 标准数学记法就是我们常用的数学语言. , o5 b9 A' Y* p1 v- h
启动Maple, 会出现新建文档中的“[>”提示符, 这是Maple中可执行块的标志, 在“>”后即可输入命令, 结束用“;”(显示输出结果)或者“:”(不显示输出结果). 但是, 值得注意的是, 并不是说Maple的每一行只能执行一句命令, 而是在一个完整的可执行块中健入回车之后, Maple会执行当前执行块中所有命令(可以是若干条命令或者是一段程序). 如果要输入的命令很长, 不能在一行输完, 可以换行输入, 此时换行命令用“shift+Enter”组合键, 而在最后一行加入结束标志“;”或“:”, 也可在非末行尾加符号“\”完成. ) O0 S9 K4 E1 G+ R
Maple 7有4种输出方式: Maple语言、格式化文本(Character Notation)、固定格式记法(Typeset Notation)、标准数学记法(Standard Math Notation). 通常采用标准数学记法.
( y& z! K/ k' x+ n! Y$ d3 hMaple会认识一些输入的变量名称, 如希腊字母等. 为了使用方便, 现将希腊字母表罗列如下,输入时只需录入相应的英文,要输入大写希腊字母, 只需把英文首字母大写:   3 ?9 i) M0 `1 G( t9 L
( _7 o. G- d. I, f; O3 e" [, ?, t* l

& Q9 `0 r* ^. r- h( |2 S4 q+ q
- X/ M$ U7 |' e- q8 V5 ~( L1 J0 { 5 r7 t9 c4 D- b3 j

- b# l1 C8 p- Y+ T' E+ s0 a
( E6 k5 y, R3 O& ~% r! B  U  n' y0 i( a % w* p- [( C, p

. Y4 w( }" g7 k( ]/ C2 f; |" ~
  p2 s- g( L# w# ^
4 r' w1 R! V# T# y * O, h& e4 P, y: x
: d( R) s! d( R# [
1 S; U) s/ P1 z# e7 T. P
alpha        beta        gamma        delta        epsilon        zeta        eta        theta        iota        kappa        lambda        mu) g0 ]* z* O/ p; y/ ?
. f/ P5 |" E& H* s# b# r" |2 z

6 Q; R1 G* f; E2 ^4 ^. P- n
# [: M! E. D4 M/ j 7 h  d8 D. H  f8 I# ?

: I0 B; V0 t- _7 |8 S. r1 l 7 X8 }7 \+ l$ t7 b( i8 }& h/ _
; \4 {9 c8 i0 S4 B5 ]5 @

' W0 ?1 @9 f4 O# o2 x
& ^( l$ P0 z3 U8 W0 E& Z - m% N4 ?  X% \8 ?" l

2 [0 ~; F' l. O. K5 U8 ^- c
" a) R4 P; ^3 x/ Q9 u, `
! k, l1 A" n# bnu        xi        omicron        pi        rho        sigma        tau        upsilon        phi        chi        psi        omega0 Q' J" V7 T5 `
有时候为了美观或特殊需要,可以采用Maple中的函数或程序设计方式控制其输出方式,如下例:
6 U% Y1 D) n2 D" ~& U> for i to 10 do
0 m6 H9 n; F! [9 Bprintf("i=%+2d and i^(1/2)=%+6.3f", i, eval(sqrt(i)));! ?, S6 S! m. X3 M8 b
od;! n; J' ]& T1 }) R  v8 |; P6 Q
i=+1 and i^(1/2)=+1.000i=+2 and i^(1/2)=+1.414i=+3 and i^(1/2)=+1.732i=+4 and i^(1/2)=+2.000i=+5 and i^(1/2)=+2.236i=+6 and i^(1/2)=+2.449i=+7 and i^(1/2)=+2.646i=+8 and i^(1/2)=+2.828i=+9 and i^(1/2)=+3.000i=+10 and i^(1/2)=+3.162
* q# |$ W# j+ f# j  Q" O1 i+2d的含义是带符号的十进位整数,域宽为2. 显然,这种输出方式不是我们想要的,为了得到更美观的输出效果,在语句中加入换行控制符“\n”即可:
" p9 E  i! p0 E, C& V7 Q> for i to 10 do
5 D% A( h+ S& ?" [printf("i=%+2d and i^(1/2)=%+6.3f\n", i, eval(sqrt(i)));
2 z" s9 i. T: O  u2 o' Vod;! f8 A  j$ g- }& W9 z9 C( y% [
i=+1 and i^(1/2)=+1.000
3 t/ e9 k: T, Ti=+2 and i^(1/2)=+1.414
7 l3 @" y) {9 D$ W& `i=+3 and i^(1/2)=+1.732
: m: H1 B+ b2 Z( Ki=+4 and i^(1/2)=+2.000
$ y/ r/ ~6 w7 @. M& M8 G; I' H. mi=+5 and i^(1/2)=+2.2366 N8 n( b; I3 [
i=+6 and i^(1/2)=+2.4492 U: J5 d/ Y6 J$ C
i=+7 and i^(1/2)=+2.6462 f) U1 N) B- e
i=+8 and i^(1/2)=+2.828+ F2 m3 r- m5 O- N, w3 h0 \
i=+9 and i^(1/2)=+3.000
! p9 G* o& n/ ^9 ^, `' g2 s% di=+10 and i^(1/2)=+3.162/ @- ^) g1 p4 ?) t) b+ U
再看下例:将输入的两个数字用特殊形式打印:
7 C3 |* u  A6 O; r7 L> niceP:=proc(x,y)+ r! U6 @4 F+ K5 ]$ U' Z
printf("value of x=%6.4f, value of y=%6.4f",x,y);
2 L+ o4 K) t% A$ |7 Zend proc;
2 v% g5 a+ r4 ] $ l2 F) B0 j' n: G# Y7 b7 `
> niceP(2.4,2002.204);
# z& q+ E4 M' M; F6 B4 w9 V" Uvalue of x=2.4000, value of y=2002.2040
- {: @" E( ]5 A3 R) K# j1.4 Maple联机帮助
. {7 y' V1 F( V- F& W, V! [; w学会寻求联机帮助是掌握一个软件的钥匙. Maple有一个非常好的联机帮助系统, 它包含了90%以上命令的使用说明. 要了解Maple的功能可用菜单帮助“Help”, 它给出Maple内容的浏览表, 这是一种树结构的目录表, 跟有…的词条说明其后还有子目录, 点击这样的词条后子目录就会出现(也可以用Tab键和up, down选定). 可以从底栏中看到函数命令全称, 例如, 我们选graphics…, 出现该条的子目录, 从中选2D…, 再选plot就可得到作函数图象的命令plot的完整帮助信息. 一般帮助信息都有实例, 我们可以将实例中的命令部分拷贝到作业面进行计算、演示, 由此可了解该命令的作用.
* _9 X5 h" T0 g% m在使用过程中, 如果对一个命令把握不准, 可用键盘命令对某个命令进行查询. 例如, 在命令区输入命令“?plot”(或help(plot);), 然后回车将给出plot命令的帮助信息, 或者将鼠标放在选定的要查询的命令的任何位置再点击菜单中的“Help”即可.
+ ^  l4 X% C' ]$ n# |( L2  Maple的基本运算( ^/ K+ \' }; ?4 z1 Q7 F
2.1 数值计算问题, h: }# F* O) Y6 S
算术是数学中最古老、最基础和最初等的一个分支, 它研究数的性质及其运算, 主要包括自然数、分数、小数的性质以及他们的加、减、乘、除四则运算. 在应用Maple做算术运算时, 只需将Maple当作一个“计算器”使用, 所不同的是命令结束时需加“;”或“:”. + x' R3 k1 B) i" Y. X+ X
在Maple中, 主要的算术运算符有“+”(加)、“–”(减)、“*”(乘)、“/”(除)以及“^”(乘方或幂,或记为**), 算术运算符与数字或字母一起组成任意表达式, 但其中“+”、“*”是最基本的运算, 其余运算均可归诸于求和或乘积形式. 算述表达式运算的次序为: 从左到右, 圆括号最先, 幂运算优先, 其次是乘除,最后是加减. 值得注意的是, “^”的表达式只能有两个操作数, 换言之,  是错误的, 而“+”或“*”的任意表达式可以有两个或者两个以上的操作数. 5 X( U1 I* G) L" }
Maple有能力精确计算任意位的整数、有理数或者实数、复数的四则运算, 以及模算术、硬件浮点数和任意精度的浮点数甚至于矩阵的计算等等. 总之, Maple可以进行任意数值计算. - L" o5 [! @) d* C0 `
但是, 任何软件或程序毕竟只是人们进行科学研究的一种必要的辅助, 即便它有很多优点, 但也有它的局限性, 为了客观地认识数学软件、认识Maple, 下面通过两个简单例子予以说明. 2 R+ v7 }$ |, `8 K/ m; y
第一个简单的数值计算实例想说明Maple数值计算的答案的正确性:   
6 K5 k( F$ j  l: q+ y4 }> 3!!!;) \2 ]: W1 Q' Y6 x$ G
2601218943565795100204903227081043611191521875016945785727541837850835631156947382240678577958130457082619920575892247259536641565162052015873791984587740832529105244690388811884123764341191951045505346658616243271940197113909845536727278537099345629855586719369774070003700430783758997420676784016967207846280629229032107161669867260548988445514257193985499448939594496064045132362140265986193073249369770477606067680670176491669403034819961881455625195592566918830825514942947596537274845624628824234526597789737740896466553992435928786212515967483220976029505696699927284670563747137533019248313587076125412683415860129447566011455420749589952563543068288634631084965650682771552996256790845235702552186222358130016700834523443236821935793184701956510729781804354173890560727428048583995919729021726612291298420516067579036232337699453964191475175567557695392233803056825308599977441675784352815913461340394604901269542028838347101363733824484506660093348484440711931292537694657354337375724772230181534032647177531984537341478674327048457983786618703257405938924215709695994630557521063203263493209220738320923356309923267504401701760572026010829288042335606643089888710297380797578013056049576342838683057190662205291174822510536697756603029574043387983471518552602805333866357139101046336419769097397432285994219837046979109956303389604675889865795711176566670039156748153115943980043625399399731203066490601325311304719028898491856203766669164468791125249193754425845895000311561682974304641142538074897281723375955380661719801404677935614793635266265683339509760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000) ?' u# A6 G9 ^6 W. B
上述运算结果在IBM PC机(1G, 128M)上计算只需要0.01秒, 得到如此复杂的结果(1747位), 一个自然的问题是: 答案正确吗?
( t0 Q% L4 x: d; x为了回答这个问题, 我们借助于数值分析方法, 由Stiring公式) Y) |+ v5 g& X
4 E5 s6 k' F( l
可得:  , 前三位数字与Maple输出结果相同, 且两者结果均为1747位. 另外, 在720!的计算中, 5的因子的个数为:   5 x1 f/ p' E8 x; Y0 ~

* l3 i$ {. q4 h1 E2 W- ?8 v* \这些5与足够多的2相乘将得到178个0, 而Maple的输出结果中最后178位数为零. 由此, 可以相信Maple结果的正确性.
% ~# l. g5 d. _# J$ D  w7 K$ l另一个例子则想说明Maple计算的局限性:   2 ?2 J3 B5 W, w/ A2 ?# }4 I1 L1 s
  0 k/ p* J# W; C# f6 x! Q
Maple在处理问题时, 为了避免失根, 从不求算术式的近似值, 分数则化简为既约分数. 因此, 在Maple中很容易得到:   
4 D. \8 ], w5 m6 J
; P/ M% t* ~4 B( H显然这是错误的. 这一点可以从代数的角度予以分析. 5 c9 E6 b, n* w7 b+ b+ K
不妨设 , 则 , 即 , 显然 有3个结果, -2是其实数结果.
1 R4 P% o7 J8 U9 {, |' h2 C$ p, j另一方面, 设 , 则 , 即:
: o5 ~$ m# C) W$ v; T& E
8 K! d! t2 [  k( y' E' b6 d: _- _显然 有6个结果, -2、2是其实数结果. 9 r" e- D* ?6 B+ F9 @
这个简单的例子说明了Maple在数值计算方面绝对不是万能的, 其计算结果也不是完全正确的, 但是, 通过更多的实验可以发现: Maple只可能丢失部分结果, 而不会增加或很少给出完全错误的结果(如上例中Maple的浮点数结果皆为 ). 这一点提醒我们, 在利用Maple或其他任何数学软件或应用程序进行科学计算时, 必须运用相关数学基础知识校验结果的正确性. ( T5 V1 s1 L3 E1 N7 n7 m4 Z
尽管Maple存在缺陷(实际上, 任何一个数学软件或程序都存在缺陷), 但无数的事实说明Maple仍然不失为一个具有强大科学计算功能的计算机代数系统. 事实上, Maple同其他数学软件或程序一样只是科学计算的一个辅助工具, 数学基础才是数学科学中最重要的.
/ t3 |; a9 n$ F" f) m# m) p: r: E2.1.1 有理数运算
1 L" f. x2 f2 z! @8 f作为一个符号代数系统, Maple可以绝对避免算术运算的舍入误差. 与计算器不同, Maple从来不自作主张把算术式近似成浮点数, 而只是把两个有公因数的整数的商作化简处理. 如果要求出两个整数运算的近似值时, 只需在任意一个整数后加“.”(或“.0”), 或者利用“evalf”命令把表达式转换成浮点形式, 默认浮点数位是10 (即: Digits:=10, 据此可任意改变浮点数位, 如Digits:=20).
  V. E1 C: ^, _" p2 C5 a3 k> 12!+(7*8^2)-12345/125;
/ b- ^& g' E4 J' @, ~ 8 T/ ^0 t1 f2 V5 r/ u/ O
> 123456789/987654321;7 _7 j6 P5 F4 M" `/ q4 ?9 r* A
6 h# |- [1 [' V' O1 z. k
> evalf(%);% A7 V* @9 N% ?% V
( U* @8 Y4 d$ @. J1 \, u
> 10!; 100*100+1000+10+1; (100+100)*100-9;9 e3 G; b* y, S
9 D2 q1 l$ e5 X7 Z4 S- d' O$ [

+ g* r! B% \7 E" @! D" P( _9 V) Q
- f6 m9 ~6 q5 n  _9 u6 \0 C> big_number:=3^(3^3);8 O2 U1 X' W7 d) ]  W- E
  j2 k) Q1 }! F( M
> length(%);: Z2 T% \5 M! i/ Z

" A# r6 N7 F/ Z. A上述实验中使用了一个变量“big_number”并用“:=”对其赋值, 与Pascal语言一样为一个变量赋值用的是“:=”. 而另一个函数“length”作用在整数上时是整数的十进制位数即数字的长度. “%”是一个非常有用的简写形式, 表示最后一次执行结果, 在本例中是上一行输出结果. 再看下面数值计算例子:   . z  c5 q& z. r8 n: P
    1)整数的余(irem)/商(iquo)) `' n- i/ c7 d% N0 T8 `' a+ y  @
命令格式:   $ t* ~( T; v  f# g! z, S
irem(m,n);        #求m除以n的余数
" Z" Q1 ^4 G6 q( _* u6 @3 ~- Rirem(m,n,'q');    #求m除以n的余数, 并将商赋给q3 Q: l, e9 N& N* m3 {
iquo(m,n);        #求m除以n的商数
0 z' B' ?5 P$ o) i( `# U. biquo(m,n,'r');    #求m除以n的商数, 并将余数赋给r
' e& P( i4 v, C; ^7 T% e其中, m, n是整数或整数函数, 也可以是代数值, 此时, irem保留为未求值.
4 f' q2 C: a! s, I> irem(2002,101,'q'); # 求2002除以101的余数, 将商赋给q- R/ b/ U! b0 M) d

( y3 m6 v/ h: E0 I. b- l> q; #显示q- V" I) _7 {6 v: B

7 M( O5 L8 X6 R8 I$ @9 X- a> iquo(2002,101,'r'); # 求2002除以101的商, 将余数赋给r
3 {+ }* I" v8 B " y; V+ J4 I) z1 u3 F) e& I
> r; #显示r
( v  |* z9 g/ q5 D
. a" N& z3 \1 B. d4 @0 p% P3 R. W> irem(x,3);
0 O- V% x. g! C6 g) B 9 _$ N  y: K9 g9 J
2)素数判别(isprime)3 e# F& G0 G* F, j- ^
素数判别一直是初等数论的一个难点, 也是整数分解问题的基础. Maple提供的isprime命令可以判定一个整数n是否为素数. 命令格式: isprime(n);
3 ?+ ^0 k! [1 g1 ]; |, o7 e+ g( L    如果判定n可分解, 则返回false, 如果返回true, 则n“很可能”是素数. ( x, I: E  R' o5 K
> isprime(2^(2^4)+1);
. ]3 U: C# v8 Z- l2 e% O: s' N
3 u. {9 E7 x+ z! J3 _> isprime(2^(2^5)+1);
7 W9 o' g1 S: f% E6 o. d% l 1 f* n- e3 B# {0 `
上述两个例子是一个有趣的数论难题。形如 的数称为Fermat数, 其中的素数称为Fermat素数, 显然, F0=3、F1=5、F2=17、F3=257、F4=65537都是素数. Fermat曾经猜想所有的Fn都是素数, 但是Euler在1732年证明了F5=641•6700417不是素数. 目前, 这仍是一个未解决的问题, 人们不知道还有没有Fermat素数, 更不知道这样的素数是否有无穷多. + n3 I8 K# }( x5 b, L& \: v* Y* H' i6 Z
3) 确定第i个素数(ithprime): O& T2 ?2 B) d
若记第1个素数为2,判断第i个素数的命令格式: ithprime(i);    + K* k8 K" `( s( X
> ithprime(2002);
* f5 p! u+ n! [4 y
* j' l" f0 J: A; Z& A5 C> ithprime(10000);
( g. x- A6 @" z, r+ r8 R# d 5 h2 @2 T, P) q: z- x
4) 确定下一个较大(nextprime)/较小(prevprime)素数: d3 z6 {( I! H9 d) u
当n为整数时,判断比n稍大或稍小的素数的命令格式为:   
8 @0 b4 r0 H* u) fnextprime(n);  - }8 f$ r  e3 c6 N; H* l
prevprime(n);
! r) I$ h9 v& Z> nextprime(2002);9 f# |  j9 a" n6 V* y

" i  o1 C! y; Q# j> prevprime(2002);% Z/ Y: ~% n. d  q4 D

  z! r4 M  U1 R  i# h9 O5) 一组数的最大值(max)/最小值(min)
( U9 p) i' X9 M( ~' a: V命令格式: max(x1,x2,…,xn);   #求x1,x2,…,xn中的最大值
8 o; I# ]4 m0 }, P/ N7 P% V# ]             min(x1,x2,…,xn);   #求x1,x2,…,xn中的最小值
& t. g/ Y2 Q- T3 ~& L  D- X> max(1/5,ln(3),9/17,-infinity);
7 k4 G4 L: X! {( ^- L- U ; W4 k( d0 K. a9 w: d* u1 N! n
> min(x+1,x+2,y);. [1 x, D) ]  c' X1 ^" G
. j: b5 b% [" o- S- x. r9 o0 \  q
6)模运算(mod/modp/mods)3 a* i  B/ R- D5 a0 u- ]9 j
命令格式:  e mod m;    # 表达式e对m的整数的模运算
4 F- P% w1 E# |: _modp(e,m);  # e对正数m的模运算
& J" P: r) n1 p4 _4 v. {: l+ ]mods(e,m);  # e对m负对称数(即 -m)的模运算/ w% _* d: e* B, [& r4 t
`mod`(e,m);  # 表达式e对m的整数的模运算, 与e mod m等价5 g  M$ e! A9 ~& y) j; B
值得注意的是, 要计算i^n mod m(其中i是一整数), 使用这种“明显的”语法是不必要的, 因为在计算模m之前, 指数要先在整数(可能导致一个非常大的整数)上计算. 更适合的是使用惰性运算符“&^”即: i &^n mod m, 此时, 指数运算将由mod运算符智能地处理. 另一方面, mod运算符的左面优先比其他运算符低, 而右面优先高于+和-, 但低于*和/. " f* m. y' h: B" Q( T
> 2002 mod 101;4 \: v8 ?* Y4 Q1 X

* ?0 k6 ~6 R/ c0 C8 J* @> modp(2002,101);
5 ~- \) o) j( `( b! E  D   Y5 ?1 L+ ?! b0 P: Z; F4 W  M
> mods(49,100);( L+ W" V" `  X+ y# J& i8 k5 ~

, w3 }4 B7 Z' n> mods(51,100);
1 N/ z  }( u* _# ]; C/ U% L9 h 2 c- E) ]! O* ~! P4 Y# Y- m
> 2^101 mod 2002;  # 同 2 &^101 mod 2002;6 o: Q' ^* O6 |( Y& Q* B

8 t; z( N7 G0 f- i  b, N7)随机数生成器(rand)) h. C3 Z0 T6 N) Q0 |: h% Z0 g
命令格式:   ) @& }; Y* V0 `" v& c
rand( );    #随机返回一个12位数字的非负整数9 u8 }8 {7 P6 Y0 w
rand(a..b);  #调用rand(a..b)返回一个程序, 它在调用时生成一个在范围[a, b]内的随机数
& J+ p2 w( v5 V8 M- B> rand();. T1 @4 k6 N$ |. X2 Q0 I% r9 R

1 k8 W, }( U4 b6 a! q& ?> myproc:=rand(1..2002):7 q( O$ C$ V" X6 d* Q+ I. \* l6 E# Q
> myproc();0 u: w) f: f% V6 S1 h/ G

' K  ?+ u4 L2 k1 v0 ~> myproc();- \% ^  P1 L/ s- @

- l8 b4 y+ b' Q$ ^5 \6 ^    注意, rand(n)是rand(0..n-1)的简写形式.+ E/ A2 ^0 m* R4 ^) x
2.1.2 复数运算
# s* m& p! [2 L$ A0 c复数是Maple中的基本数据类型. 虚数单位i在Maple中用I表示. 在运算中, 数值类型转化成复数类型是自动的, 所有的算术运算符对复数类型均适用. 另外还可以用Re( )、Im( )、conjugate( )和argument( )等函数分别计算实数的实部、虚部、共轭复数和幅角主值等运算. 试作如下实验:   * R' \3 s& @4 D# A  \
> complex_number:=(1+2*I)*(3+4*I);1 {! s6 S* }; H$ E0 a' x2 Z

' J; R; G6 P; D, ~> Re(%);Im(%%);conjugate(%%%);argument(complex_number);( _! z/ a4 V" j2 x& p9 D$ h8 R2 y

2 I. @+ S( E; V
; k% r0 U, G- Y) G + N" r1 V1 _# P, E
( H$ U* {- R0 ?( M8 Q5 y
值得注意的是上行命令中均以“;”结束, 因此不能将命令中的2个%或3个%(最多只能用3个%)改为1个%, 因为%表示上一次输出结果, 若上行命令改为“,”结束, 则均可用1个%. 0 ~# G4 x/ z( l. A+ o
为了在符号表达式中进行复数运算, 可以用函数evalc( ), 函数evalc把表达式中所有的符号变量都当成实数, 也就是认为所有的复变量都写成 的形式, 其中a、b都是实变量. 另外还有一些实用命令, 分述如下:   
9 o+ T( X0 l" _$ h1) 绝对值函数
, O6 {; ^) t6 B( k: f' M命令格式: abs(expr);  
  @& `* s# E' Y- c$ k. j当expr为实数时,返回其绝对值,当expr为复数时,返回复数的模., U% q" I7 R0 E2 t! c0 B
> abs(-2002);    #常数的绝对值8 P1 \8 u+ S& V* w* p
9 I$ Y: Y, _/ d
> abs(1+2*I);   #复数的模3 l3 s9 U$ I& ~& b+ W8 p$ x
- L- L  Z7 J0 }, `; N1 s% S
> abs(sqrt(3)*I*u^2*v);  #复数表达式的绝对值
: n! g4 F  q, ] 3 u- R$ _! s- d9 z; `- Y
> abs(2*x-5);   #函数表达式的绝对值) d" I$ _% `3 a+ y
  w( W( @: D% {
2)复数的幅角函数. y; S+ P# {( |- x' O$ b# j
命令格式:   argument(x);  #返回复数x的幅角的主值
9 s' F8 r9 u: [- z9 J$ Y: V> argument(6+11*I);" s  H, B% z) n+ D  w3 E

$ ^  X* k1 g  ]/ u> argument(exp(4*Pi/3*I));, t& V4 _( Y/ e4 |8 p7 _3 K
8 B- t7 R- U: z/ C
3)共轭复数% K3 c5 h( G! \7 H
命令格式:   conjugate(x);  #返回x的共轭复数
% `2 d* d$ C( P' {5 E! B> conjugate(6+8*I);
4 W% g4 d$ G) I . ]& K3 E2 d. r1 t& K! C
> conjugate(exp(4*Pi/3*I));
7 X0 f$ F, y6 G" a6 O
: d: v) h+ X7 p/ O2.1.3 数的进制转换
% f5 V3 v. @) F& {: [9 G0 }+ a数的进制是数值运算中的一个重要问题. 而在Maple中数的进制转换非常容易, 使用convert命令即可. : b4 t* Q0 P( r( |% v% G8 r
命令格式:   convert(expr, form, arg3, ...);   
2 E1 r+ x) l& o* p) I) e其中, expr为任意表达式, form为一名称, arg3, ... 可选项. , i$ L" E1 J5 X" _
下面对其中常用数的转换予以概述. 而convert的其它功能将在后叙章节详述.
4 W! G+ \! O" D+ ^' |) a    1)基数之间的转换
# h5 Q4 O: \+ W# l9 d3 B4 _  ~命令格式:   
; y0 s2 }% [) q4 _7 Q) R8 Nconvert(n, base, beta);      #将基数为10的数n转换为基数为beta的数
" e% m6 U; A, c1 W6 @    convert(n, base, alpha, beta);#将基数为alpha的数字n转换为基数为beta的数- a5 {/ o( ?. F) j
> convert(2003,base,7); #将10进制数2002转换为7进制数, 结果为: (5561)7" }3 [! V# y) n% ^  h* [7 m
) _- w) {! [: }8 G( g
> convert([1,6,5,5],base,7,10); #将7进制数5561转换为10进制数: \# d: e. S' F1 _7 C

# \6 m, Q4 p  c0 y* b( ]1 f> convert(2002,base,60);       #将十进制数2002转换为60进制数, 得33(分钟)22(秒)* x- K! A0 y( |
/ A2 `8 C. a- P# y" P
    2)转换为二进制形式* }# m4 B# c: y
命令格式: convert(n, binary);
6 O* S& L1 |: Z$ V$ t( g其功能是将十进制数n转换为2进制数. 值得注意的是, 数可以是正的, 也可以是负的, 或者是整数, 或者是浮点数, 是浮点数时情况较为复杂.
9 J( A& n9 Z) C! _0 X4 P5 l> convert(2002,binary);   
) Z& [& V- i/ \% p / z1 L1 B1 J6 k% Y$ [9 A/ D
> convert(-1999,binary);
" W- ^# M! }8 j0 J" H6 E/ {: J   \: a! n* R6 {+ o) [, K. s
> convert(1999.7,binary);
$ E$ g0 G6 R  S+ a7 v* f; ^- Q . L+ h6 F; o0 s" }- ~. L
3)转换为十进制形式- X" ]3 J( P+ V# J' W* k+ f9 P2 A: W
其它数值转换为十进制的命令格式为:   
8 x  k0 d# ~+ G' S) s% `' Q7 D3 lconvert(n, decimal, binary);   #将一个2进制数n转换为10进制数* l! D3 c( i! Y: n  g
    convert(n, decimal, octal);    #将一个8进制数n转换为10进制数% D: c, M: z1 J
    convert(string, decimal, hex);  #将一个16进制字符串string转换为10进制数
0 S5 g- U5 w2 c> convert(11111010010, decimal, binary);    + {- t: i) g  U# @* b
) q+ S$ c( S# L
> convert(-1234, decimal, octal);           , Y* [9 }3 r. t* Y+ h

' L2 b( E$ h- h> convert("2A.C", decimal, hex);         
9 q7 X# l+ y; }0 }   F0 Q1 m% x6 L$ a% i" {
4) 转换为16进制数( ?3 z$ @! K3 W7 n5 b0 {
将自然数n转换为16进制数的命令格式为: convert(n, hex);   ! p) [' o" [% \( U! r9 I
> convert(2002,hex);  convert(1999,hex);
3 N; J  Q0 Z8 V9 h/ d9 @) w- `" j
* q% b9 y  X4 w$ a" P) b% H" e , {6 A. Y8 O! e6 T0 k+ P6 F- g
5)转换为浮点数8 }, ?+ j1 Y' @: R. b
命令格式: convert(expr, float);5 q1 y1 N2 q. C- \* X0 r
注意, convert/float命令将任意表达式转换为精度为全局变量Digits的浮点数, 且仅是对evalf的调用.
. d9 f' E% c: B+ g7 q, K> convert(1999/2002,float);
% t$ S# ?- ~! I! V1 O
1 u! E/ v* s; I! o' G: F1 j  k> convert(Pi,float);, ^  [( Y% M* W+ }% [. I9 N

( V' ?- d8 e9 m' q  ^6 F" w( d, W! o2.2 初等数学3 v# g: u4 ^' e( v+ C
    初等数学是数学的基础之一, 也是数学中最有魅力的一部分内容. 通过下面的内容我们可以领略Maple对初等数学的驾驭能力, 也可以通过这些实验对Maple产生一些感性认识. 4 w3 x, h7 h7 w$ V5 [* Y
2.2.1 常用函数5 J* ~! g+ ]% k# ?+ ?- U
作为一个数学工具, 基本的数学函数是必不可少的, Maple中的数学函数很多, 现例举一二如下:   
; ~% b  D! `& g6 d4 H$ Q指数函数: exp
4 C( q- b  i2 D一般对数: log[a]* O1 a; A( U4 b$ h1 h, |
自然函数: ln( M; e1 A, B0 W- z+ \" f! n
常用对数: log10$ ]2 s  a9 i9 J, r( J0 l
平方根: sqrt
3 r+ A% u  P. m1 A2 t6 p6 [绝对值: abs
9 m  r- E' e9 i# n三角函数: sin、cos、tan、sec、csc、cot
$ U* \) K. U' B. V9 @9 ~  _. |反三角函数: arcsin、arccos、arctan、arcsec、arccsc、arccot
% N- m7 L2 m! Y7 {双曲函数: sinh、cosh、tanh、sech、csch、coth
. x9 S% c3 Q0 o/ }& q* I# {1 ^反双曲函数: arcsinh、arccosh、arctanh、arcsech、arccsch、arccoth: f  V9 `7 }4 V! @
贝赛尔函数: BesselI、BesselJ、BesselK、BesselY
( R. s0 f$ r2 pGamma函数: GAMMA
9 N/ |( A% d' }( F2 r误差函数: erf
# D# l6 g. W* Y( ^1 U; ^: c$ v函数是数学研究与应用的基础之一, 现通过一些实验说明Maple中的函数的用法及功能. + V9 ^" j' f6 m& A
1) 确定乘积和不确定乘积1 `' T+ x+ q6 B4 m; \8 z4 O! z9 O" y2 ^* y
命令格式: product(f,k);  
+ C5 b  b  `5 ~  v0 G) fproduct(f,k=m..n);  
% O4 u: D9 ^$ xproduct(f,k=alpha); 0 Y0 U% @# k9 }0 l. U9 M$ R: U
product(f,k=expr);
6 D2 G+ o6 h; I( t8 U0 }) v, z! ~其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—包含k的任意表达式.
4 d+ S' y& n! N. U6 d> product(k^2,k=1..10);   #计算 关于1..10的连乘2 W( h  i2 c/ v' J& m/ e

4 d0 t( r/ Y8 I' K( i> product(k^2,k);         #计算 的不确定乘积; x3 f" J, D! {2 `+ T

3 s- W1 j9 c, N. k' G  p# _, ~, A> product(a[k],k=0..5);    #计算ai(i=0..5)的连乘
, v& i0 ^' [+ C; Y; @+ e
! d1 f' i' Q3 L  Q4 K> product(a[k],k=0..n);    #计算ai(i=0..n)的连乘: f! n+ Q/ }' V" w# T- X8 h0 H& y
! ^; Z# g( [: y) b9 k' c0 H4 Z
> Product(n+k,k=0..m)=product(n+k,k=0..m);   #计算(n+k)的连乘, 并写出其惰性表达式! Z( K2 ?8 W  |7 ~
  g- I  l4 [8 |& F' y
> product(k,k=RootOf(x^3-2));     #计算 的三个根的乘积
$ ]: W2 c8 E4 G6 p* C: d % i' V& w. ]! }! @+ _. C
    product命令计算符号乘积, 常常用来计算一个公式的确实或不确实的乘积. 如果这个公式不能求值计算, Maple返回 函数. 典型的例子是:   
( f7 @  J& T1 @> product(x+k,k=0..n-1);
$ T- u9 B3 g% R. b3 W2 Q
, M/ q7 T- y% i2 _如果求一个有限序列值的乘积而不是计算一个公式, 则用mul命令. 如:   $ m. _: F7 D  R
> mul(x+k,k=0..3);! [& S+ t- b* |. x) a" t. \3 F& r: P
0 l9 w  E& w2 p8 S- H0 g
2)指数函数
/ O) w  |, E3 J2 m0 Y- P2 e计算指数函数exp关于x的表达式的命令格式为: exp(x); 6 A; v4 Y5 G/ K8 [' Z- a% [
> exp(1);9 }4 z0 u. T4 |
5 I1 v8 E+ r6 Z7 u5 R: D' v4 B
> evalf(%);8 u$ W% }) \8 O0 W+ }
7 W3 V8 z3 ?9 R. ?; X
> exp(1.29+2*I);9 ?  v- s  e( N6 m: N1 u# `0 b

, M2 C/ D5 ^( p8 X( R> evalc(exp(x+I*y));
+ D' l. s6 I) w- U; o0 ^8 Q
- b1 r4 m1 \7 J; G- C3)确定求和与不确定求和sum
# B; L( ^, Z* F, K- j1 H命令格式: sum(f,k);  : a) V+ n" M+ d2 A/ S* g5 T. e5 o
sum(f,k=m..n);  ; d5 M& D0 h& E6 T) m, q+ Y9 A3 X+ H
sum(f,k=alpha);
! W; T6 F" ?& l& |' _sum(f,k=expr);9 z6 z. O& e2 l5 {9 F
其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—不含k的表达式.
9 n6 s, @- f& Z( [5 r> Sum(k^2,k=1..n)=sum(k^2,k=1..n);
# ?- f1 t, ?$ u% Q, `) b
1 a0 d5 k) r% ~- F> Sum(k^3,k=1..n)=sum(k^3,k=1..n);8 _- _/ e" _* U* j% ^% m
. F( C8 h' d) B( v9 }
> Sum(k^4,k=1..n)=sum(k^4,k=1..n);
" c" B0 ?% l& {, Z/ R& u& | : M. C' e( n# N% J
> Sum(1/k!,k=0..infinity)=sum(1/k!,k=0..infinity);! ^4 A( a; ]# G0 [
; v# f' a& ~3 D+ [; u
> sum(a[k]*x[k],k=0..n);8 ^2 {' L6 y4 S% h9 y# l0 u
" c$ o6 n: M2 [6 `
> Sum(k/(k+1),k)=sum(k/(k+1),k);5 i) \5 N* R- r1 V7 o. U7 o

# d# e9 ?* }4 w$ s* r> sum(k/(k+1),k=RootOf(x^2-3));
/ W! O+ d# \9 _6 S& ]! v
( `' B& a- [3 Esum函数可计算一个公式的确定和与不确定和, 如果Maple无法计算封闭形式, 则返回未求值的结果. 值得注意的是, 在sum命令中将f和k用单引号括起来, 可避免过早求值. 这一点在某些情况下是必需的.
" H0 V' Z. @, o  I1 u> Sum('k','k'=0..n)=sum('k','k'=0..n);
( B3 d. R9 j9 y
" @+ a" B8 [  b/ J7 b; D如果计算一个有限序列的值, 而不是计算一个公式, 可用add命令. 如:   6 p) f# k0 }5 y7 X
> add(k,k=1..100);
0 ~# x( m5 S" B
8 o+ j6 f. T: ^/ T) L尽管sum命令常常用于计算显式求和, 但在程序设计中计算一个显式和应该使用add命令. ; i( F7 {% }: M: ]% c
另外, sum知道各种求和方法, 并会对各类发散的求和给出正确的结果, 如果要将求和限制为收敛求和, 就必须检查显式的收敛性.
& T  d: w3 [; s8 d; l1 R2 R' P# R3)三角函数/双曲函数
" |- v1 @, @/ m& d" G命令格式:   sin(x);   cos(x);   tan(x);   cot(x);   sec(x);   csc(x);
1 v8 E1 S* Z; Z/ P- `          sinh(x);  cosh(x);  tanh(x);  coth(x);  sech(x);  csch(x);; t. G/ R# r) ~5 L
其中, x为任意表达式.
- H* S* w; \4 m# y' v值得注意的是三角函数/双曲函数的参数以弧度为单位. Maple提供了利用常见三角函数/双曲函数恒等式进行化简和展开的程序, 也有将其转化为其它函数的命令convert.
( [5 K' Z" W9 d' e6 S! P. H> Sin(Pi)=sin(Pi);( j, \  E3 S  O8 c' v

' g+ m5 e8 k" h0 Z; j> coth(1.9+2.1*I);8 O  O! `  ^/ E, T2 Q$ k
: m2 E. ^1 L6 y4 U0 @
> expand(sin(x+y));     #展开表达式2 m1 l+ I( u0 z4 E( i
  P& u' Y6 w7 S0 Q5 H$ }7 Z# I0 z
> combine(%);        #合并表达式
: F/ h# F3 W2 Z/ M* e1 f$ y! Y / [8 k6 j& |0 V, p9 ]* u1 G
> convert(sin(7*Pi/60),'radical');6 R& E  w# S# P8 ~: s; }# v9 o, f7 P

' k) R3 x9 P3 p* w> evalf(%);
1 z. g( B5 u' j- J8 z4 P  a
5 c' D/ f( @  ?# U5 H但有趣的是, combine只对sin, cos有效, 对tan, cot竟无能为力.
/ G& a; P  R) }4 A; E- i! O' I2 k) v/ }4)反三角函数/反双曲函数
( y2 Y1 S$ h6 E, _命令格式: arcsin(x);   arccos(x);   arctan(x);   arccot(x);   arcsec(x);   arccsc(x);
7 O9 T, n7 r' l' n; n  P! d     arcsinh(x);  arccosh(x);  arctanh(x);  arccoth(x);  arcsech(x);  arccsch(x);     Y' g: J0 P( i0 W8 t6 S" I
arctan(y,x);, W' @6 z  R/ @1 K+ J2 V
其中, x, y为表达式. 反三角函数/反双曲函数的参数必须按弧度计算. ; P  T9 N# I! X1 l; `9 T: b( ?6 g
算子记法可用于对于反三角函数和反双曲函数. 例如, sin@@(-1)求值为arcsin.$ W" J& ]7 x+ X7 R
> arcsinh(1);
" d3 B+ M. B' D
! Y5 @8 u$ W2 d  k# N$ h  y. U: W; F> cos(arcsin(x));/ F2 A! d* M5 [

) g8 Z3 P0 t* k+ q7 ~. U, M' j> arcsin(1.9+2.1*I);6 K4 \) y, h3 x4 U

& ^% d6 {. u, |. o% H5)对数函数/ u9 I7 v' G, K: x& r. f+ [
命令格式: ln(x);           #自然对数1 Z" g7 {" Y/ L4 c% D7 ]
log[a](x);        #一般对数
5 J3 o: [+ b. f( f' F2 R* Clog10(x);        #常用对数
! c& I. O6 z# D+ @* i: a一般地, 在ln(x)中要求x>0. 但对于复数型表达式x, 有:   + M6 a! b; o& H
  (其中,  )0 a7 w: U2 ]- b2 q
> ln(2002.0);) b* F( n9 A" ?9 W6 U, Y( |
' e( }9 M  X9 F6 K
> ln(3+4*I);8 b) a7 _6 B0 t0 A# I( m3 i
/ N9 }. J- [- m" f
> evalc(%);    # 求出上式的实部、虚部
" Z. W, g/ m8 Z* u8 x7 n8 L% n : g) y( J' N0 O
> log10(1000000);. U: x0 A, u0 J$ ]/ O4 v

2 O. Q# v+ y3 U9 c* ~! \3 o> simplify(%);   #化简上式8 d- z& Q8 A9 E$ ~+ \+ B+ j, y
8 u7 l# x8 N5 P
2.2.2 函数的定义6 K/ I. y/ s& s2 M* q6 v
Maple是一个计算机代数系统, 带未知或者已知字母变量的表达式是它的基本数据形式. 一个简单的问题是, 既然表达式中可以包含未知变量, 那么它是不是函数呢?试看下面一个例子:   ; J9 g9 n0 l1 |5 i' I
> f(x):=a*x^2+b*x+c;% @7 B7 A! C# m' c9 b

8 E9 H7 q" V, l6 u8 c可以看出, Maple接受了这样的赋值语句, 但f(x)是不是一个函数呢?要回答这个问题,一个简单的方法是求函数值:   
7 u/ ?# v8 I* I1 W* Q1 x! Z> f(x),f(0),f(1/a);
% |- f) ~. e5 E9 W) I: u
1 y. S- R$ j# x, E* c由上述结果可以看出, 用赋值方法定义的f(x)是一个表达式而不是一个函数, 因为f(x)不能把所定义的“自变量”或者“参数”转换成别的变量或表达式. 但从赋值“过程”可以看出, f(x)虽然也算是一个“函数”, 但却是一个没有具体定义的函数:   0 h2 n' t. ]# O2 [
> print(f);) `6 T: \* O* B. h0 w* K
9 l3 f3 h0 s, J3 [" Y& w7 l
事实上, 我们所做的赋值运算, 只不过是在函数f的记忆表(remember table)中加入了f(x)在x上的值, 当我们把自变量换作0或1/a时, f(x)的记忆表中没有对应的表项, 所以输出结果就是抽象的表达式. ' {7 f: L' W% X5 v9 K2 @
在Maple中, 要真正完成一个函数的定义, 需要用算子(也称箭头操作符):   9 p; Q: e  p" u3 y" L' q7 \
> f:=x->a*x^2+b*x+c;
) ^2 e) g! E/ f" B2 W, H . `- a  H8 u8 V* [
> f(x),f(0),f(1/a);
5 A# v- C( {* @9 q ) }" P9 X  ]# Q
多变量的函数也可以用同样的方法予以定义, 只不过要把所有的自变量定成一个序列, 并用一个括号“()”将它们括起来(这个括号是必须的, 因为括号运算优先于分隔符“,”). $ `$ w8 m/ P) N5 M
> f:=(x,y)->x^2+y^2;
7 }) d5 Z/ F4 c( @" b6 v# d * h' u4 }5 w8 M4 s
> f(1,2);
: l9 ^' \. |1 V7 s( `+ c. V" d
- O& T2 ]+ c' h' \> f:=(x,y)->a*x*y*exp(x^2+y^2);
' O; _2 k+ l8 G. c
+ M. G2 A% y4 n' S7 K0 F0 Q综上所述, 箭头操作符定义函数的方式一般为:   - w1 Y7 J) t' {% f1 ]& o: @
一元函数: 参数->函数表达式
/ ?5 ]6 Z# M% [多多函数: (参数序列)->函数表达式
) t6 M( ~! |. o, I$ t无参数函数也许不好理解, 但可以用来定义常函数:   
& ]& z8 A0 r( p# z5 `" ^6 m> E:=()->exp(1);6 ]* ?7 b$ X* e% S2 ~9 b
9 H  f# [% }1 s# l7 ^
> E();
( T2 _# T+ d4 L  S
5 U7 p  K9 k7 \# x% i> E(x);
& X# U0 h$ z' Z! ~ * |! j8 ?. `! E) ~
另一个定义函数的命令是unapply,其作用是从一个表达式建立一个算子或函数.
! R  a6 r5 b, d& P定义一个表达式为expr的关于x的函数f的命令格式为:  f:=unapply(expr, x);          . [, T' D: h3 w8 R8 j
定义一个表达式为expr的关于x,y,…的多元函数f的命令格式为:  f:=unapply(expr, x, y, …);     4 n& y5 B6 K) {+ O
> f:=unapply(x^4+x^3+x^2+x+1,x);$ Y- P0 s$ ~& B$ B

' K% x+ \$ }* J9 _> f(4);
+ v4 X3 H# R% @2 Z0 V
8 v# G3 X0 p& O3 V> f:=unapply(x*y/(x^2+y^2),x,y);
( S4 h# H5 W4 S( u
$ F6 K8 m% U. A$ b> f(1,1);
7 Z3 U. Q0 [1 z
! e! X) }0 n9 ?: M2 ]5 v借助函数piecewise可以生成简单分段函数:
6 F* J4 t! Q) v7 y0 d> abs(x)=piecewise(x>0,x,x=0,0,x<0,-x);/ S) Z4 W* q; K
% h( }) S( D( ?4 D7 B* U' _1 e
清除函数的定义用命令unassign. $ @4 g& _+ v" E
> unassign(f);
( z: q3 u. N8 Q# ~- k; }5 N> f(1,1);
0 d- |" B$ c- k* @. p) Z, }5 u
7 t. M- f1 i5 }$ l1 H除此之外, 还可以通过程序设计方式定义函数(参见第6章).
0 g- J" q/ D( R2 m9 Y定义了一个函数后, 就可以使用op或nops指令查看有关函数中操作数的信息. nops(expr)返回操作数的个数, 函数op的主要功能是获取表达式的操作数,其命令格式为:
4 h( e0 b. l/ {. D- J/ G4 n9 Rop(expr);            @7 A3 d- \9 j( u6 B# t0 W8 S
op(i, expr);         
- T/ c7 ]' Q6 Rop(i .. j, expr);      1 S0 A6 |# V/ _2 m' D7 y
nops(expr);8 c+ H9 r! m6 @* y
如果函数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的类型. 2 N) g# [" _8 L: P$ U
命令op(i .. j, expr); 执行的结果是expr的第i到第j个操作数, i..j中含负整数时的情形同上.6 m/ F6 B7 F7 `. ]3 C2 I
命令op(expr); 等价于op(1..nops(expr), expr); 9 ?2 ]9 q5 g1 M: A% o4 Z- T) R6 r
特别地, 当op函数中i为列表[a1, a2, ..., an], 则op([a1, a2, ..., an], expr); 等价于op(an, op(..., op(a2, op(a1, e))...)); 4 W5 E! v# M' _% a
而当expr为一般表达式时,nops(expr)命令返回的是表达式的项数, 当expr是级数时返回级数每一项的系数和指数的总和.
' `/ p8 I# _2 l> expr:=6+cos(x)+sin(x)*cos(x)^2;2 X7 K+ l* S' o+ W
9 b  j7 ?: V+ A, F7 Y
> op(expr);
0 M9 ~: K) \! ?! b- W6 V
! H8 c9 G9 P" I9 Y( R' r( H> nops(expr);4 q2 ?  v" L  v9 w
/ S  h3 T- m" o: U. T- k2 i
> p:=x^2*y+3*x^3*z+2;
( {! S0 M& G4 a( P8 I
! L, }9 j/ e3 h, |; _> op(1,p);. c' H  g: A; d5 J
! x4 M) l6 a9 H- c/ G% L2 ^
> op(1..nops(p),p);- U- n6 E0 t) b+ C  C$ e1 A( J; `
7 g" V" R- {: X# ^6 K3 X+ J
> op(op(2,p));9 D7 E; F6 x  b
' F# {2 e1 V# ?0 g7 a, N0 o4 q# `
> u:=[1,4,9];9 S1 V% ~" l( [4 p
) C$ g; P: F6 U
> op(0,u);
; ]) g% |: u+ J: l- x) A. H) s( |" ^ 2 {( X, S- y5 S
> s:=series(sin(x),x=1,3);
. d+ t7 S$ [5 ~4 Z5 U- A0 U0 x. d
8 }' m2 h4 q7 z: w1 R2 y9 |6 G> op(0,s);
$ N, N  O! `. ]  a8 Y        
! t6 P! F7 |0 O5 O6 P; p> nops(s);" Q+ ?( r* K/ V2 ~

8 J4 m1 _8 g( Q7 f" h下面一个有趣的例子说明了Maple在处理算术运算时的“个性”:
$ ^+ I* z0 e6 g8 q6 k8 g! |: Y> op(x*y*z);
! l% R+ V* h2 M, r0 Q! _
9 h; i" ?4 {& c4 j% S# ~6 J; ~; t4 k> op(x*y*z+1);
9 S- D3 R4 E7 q, ~( g7 G5 F; f
- t3 Z# T1 I, J1 W2.2.3 Maple中的常量与变量名
6 m2 m4 c6 c  v5 I8 T" N为了解决数学问题, 一些常用的数学常数是必要的. Maple系统中已经存储了一些数学常数在表达式序列constants中:   
( m* T' V) n: V4 C+ I> constants;
8 n+ D. h% }) W
+ h/ c" u7 i5 M6 G% V/ l% z为了方便使用, 现将上述常数的具体含义列示如下:   
) ?& K1 U' E$ u+ e常    数        名 称        近似值0 X) f' R7 P* X/ {) B
圆周率 + y3 F+ {) q! p8 X$ @* U; n1 R
Pi        3.1415926535
3 l( K" v6 z* R( w$ g. Q9 _: K5 UCatalan常数
. @1 K3 \6 i4 X1 ZCatalan        0.91596559420 G; `- `, b- a0 d1 O$ D
Euler-Mascheroni常数 + m$ S8 S( l; X# M8 u7 ~
gamma        0.5772156649
, D; F3 k4 ~$ [6 N8 N- J) S2 X2 P) ` ! V  v% d. R. |1 ^# Z
infinity       
5 q6 e9 i: F4 W. x: K+ U: _9 t* y, l* u7 {" P' u% C
需要注意的是, 自然对数的底数e未作为一个常数出现, 但这个常数是存在的, 可以通过exp(1)来获取.
% S0 M% C3 y3 g- B8 ~. Z在Maple中, 最简单的变量名是字符串, 变量名是由字母、数码或下划线组成的序列, 其中第一个字符必须是字母或是下划线. 名字的长度限制是499个字符. 在定义变量名时常用连接符“.”将两个字符串连接成一个名. 主要有三种形式: “名.自然数”、“名.字符串”、“名.表达式”.
- W: v: n3 P" @  w值得注意的是, 在Maple中是区分字母大小写的. 在使用变量、常量和函数时应记住这一点. 数学常量 用Pi表示, 而pi则仅为符号 无任何意义. 如g, G, new_term, New_Team, x13a, x13A都是不同的变量名. * i! P2 y; |9 M6 V$ H" Q- Y
在Maple中有一些保留字不可以被用作变量名:   . U/ c5 m2 Z2 E  C9 a: t. Q
by      do      done     elif     else     end        fi        for      7 U6 h7 f2 {6 \' M. L5 H
from    if       in       local     od     option    options     proc         
: Q6 L, s) g* D, J3 }/ _quit    read     save     stop     then     to        while      D
. Z- u! L: G( I' HMaple中的内部函数如sin, cos, exp, sqrt, ……等也不可以作变量名. 6 G4 c2 \" X# t& F) ]
另外一个值得注意的是在Maple中三种类型引号的不同作用:   1 p( g; M& K) J
`  `:   界定一个包含特殊字符的符号, 是为了输入特殊字符串用的;    ! `& E5 s1 N1 d: G2 k* v% L9 V
'  ':   界定一个暂时不求值的表达式;    % T0 ^3 D; R: J* g# V) R  R' X
"  ":   界定一个字符串, 它不能被赋值.
* e! t8 o0 B/ g1 p2 q( h+ Q. @2.2.4 函数类型转换           
& z  o, \# s8 X: @4 I7 m5 A1 h3 v函数类型转换是数学应用中一个重要问题, 譬如, 将三角函数转换成指数函数, 双曲函数转换成指数函数, 等等. 在Maple中, 实现函数类型转换的命令是convert. 命令格式:  / ~) ?5 R  Q0 i1 f  d
    convert(expr, form);        #把数学式expr转换成form的形式7 Z( V. U( r4 M/ i
convert(expr, form, x);      #指定变量x, 此时form只适于exp、sin、cos
5 \* q8 s/ W8 G( s% econvert指令所提供的三角函数、指数与函数的转换共有exp等7种:   ; s/ l, F! ^/ B* R: h
(1) exp: 将三角函数转换成指数0 k  C* C4 M/ a
(2) expln: 把数学式转换成指数与对数
" y) s+ y! W7 r8 @9 f; x(3) expsincos: 分别把三角函数与双曲函数转换成sin、cos与指数的形式
  D" P: v4 C4 P/ P(4) ln: 将反三角函数转换成对数
$ p: O! _. P, Q, E(5) sincos: 将三角函数转换成sin与cos的形式, 而把双曲函数转换成sinh与cosh的形式
# j6 J) E0 u: i: B. M& u4 |(6) tan: 将三角函数转换成tan的形式) h' H( D6 K$ v: c, u1 r
(7) trig: 将指数函数转换成三角函数与对数函数
. }% U" [! I$ u- K- Z  b* u> convert(sinh(x),exp);   #将sinh(x)转换成exp类型( }: q4 f, ]9 J7 z+ i0 U4 e

" P: I, d0 k' K- e> convert(cos(x)*sinh(y),exp);
7 b% k, q8 k1 W ' y: d6 y: k6 v' ^. }
> convert(cos(x)*sinh(y),exp,y);) E* u( q# q8 J1 Y
1 `# D' j) e3 T  c. U; u
> convert(exp(x)*exp(x^(-2)),trig);) O' F: m1 ^' q. W+ o5 N* _
  Q3 e8 i3 C0 ?% j( ?
> convert(arcsinh(x)*cos(x),expln);
8 o; `0 p# d. I" q4 ~ 8 Z' |. C1 O; R( O# r
> convert(cot(x)+sinh(x),expsincos);3 J+ t/ Z3 ]1 V3 p3 H

6 B. Q' v, e0 a3 q* o  ?> convert(arctanh(x),ln);7 |- m) b" T: C' x0 q* Q
; X. {+ h- K1 v
convert在有理式的转换中也起着重要的作用. 在有关多项式运算的过程中, 利用秦九韶算法可以减少多项式求值的计算量. 在Maple中, 可以用函数convert将多项式转换为这种形式, 而cost则可以获取求值所需的计算量. 注意: cost命令是一个库函数, 第一次调用时需要使用with(codegen)加载. 例举如下:   
& J: t- j0 P; \( C$ \6 S> with(codegen):
1 b) y9 A( t4 e8 x4 q/ R% Y5 K> p:=4*x^4+3*x^3+2*x^2-x;
+ y5 k8 G8 W$ l0 k+ [2 ^7 Y: L: D
# G$ M) g& e! F# m> cost(p);
, K1 B9 b( @) |# b. T! U" T 4 F+ ?; m( Z. L# E
> convert(p,'horner');  #将展开的表达式转换成嵌套形式' h' P; T: r9 c- ~( G8 i
3 v5 D& ~2 {& X5 u" D6 `
> cost(%);/ R1 R6 }8 {3 u. b/ h
" K$ F- G' {  I4 t% F5 z; F2 Z  D
同样, 把分式化成连分式(continued fraction)形式也可以降低求值所需的计算量.
$ Q5 q! I6 v/ C% \: @/ \; g- y7 v> (1+x+x^2+x^3)/p;
$ r& \- ^; z& W( S" a( L' D6 ?. r& H
; {9 @/ X; ?- d9 k: e; E> cost(%);
' R1 C3 r& u; [' M
3 g/ V0 V6 M9 u. z. q9 [! O0 b> convert(%%,'confrac',x);8 m% B$ Q3 n/ O5 g( e6 ^
. q' g( ^+ b% S) `$ U; W4 F7 B, ]
> cost(%);
' n1 q' _$ E( c9 s! s 6 H0 M3 I6 C% V& S& z1 W7 m
在某些场合下(比如求微分、积分时), 把分式化成部分分式(partial fraction)也就是几个最简分式的和式的形式也可以简化运算, 但简化程度不及连分数形式.
5 s8 k9 ]9 o, C6 i> convert(%%, 'parfrac',x);1 C( C: D. E7 L0 A5 W3 q
# T0 L. Y' c, \: e- K
> cost(%);2 p7 A+ f/ A1 ~  X1 u

3 B- [( d+ |3 _而把分数转换成连分数的方法为:
+ r  R  M5 O+ p/ Y9 S! \: I; k> with(numtheory):
' R8 ^. k- s# Z4 R6 }; m> cfrac(339/284);
6 Q! b, G! p7 e9 N . [8 F# G5 p8 L2 F8 W, S. i. [
2.2.5 函数的映射—map指令
: g6 ]! B- |. [+ y. l在符号运算的世界里, 映射指令map可以说是相当重要的一个指令, 它可以把函数或指令映射到这些结构里的元素, 而不破坏整个结构的完整性. 命令格式为:% L2 l1 o; F( \4 c; L! k1 H2 ]
map(f, expr);      #将函数f映射到expr的每个操作数/ d" c& Q1 x+ d% y: h# |2 y
map(f, expr, a);    #将函数f映射到expr的每个操作数, 并取出a为f的第2个自变量) v: r/ t& \; U% q
map(f, expr, a1, a2,…, an); #将函数f映射到expr的每个操作数, 并取a1~an为f的第2~n+1个自变量1 j0 X4 V; A' e( l5 B- v
map2(f, a1, expr, a2, …, an);    #以a1为第1个自变量, expr的操作数为第2个自变量, a2为# W# Q1 L2 Y' `% y
第3个自变量…, an为第n+1个自变量来映射函数f
' I' ^6 a: u* v6 x. c. z! S> map(f,x1+x2+x3+x4,a1,a2,a3,a4);- t* r# J5 P# C, A) c0 \% b- @

: w- H  J& g6 z9 z8 v> f:=x->sqrt(x)+x^2;
+ V' z) O4 Z: C) K$ ~+ X  l' m
/ i" r- X% Y: A* L> map(f,[a,b,c]);
& O' X/ W- \3 @7 A& \- O
; j8 _! Q( F/ I% _> map(h, [a,b,c],x,y);
9 B8 y2 R8 h6 F: l
% t, |" v' w/ d6 x+ ~> map(convert,[arcsinh(x/2),arccosh(x/2)],ln);
( T0 b5 O* z: L2 I
  B# l9 [6 t: G/ ?3 k> map(x->convert(x,exp),[sin(x),cos(x)]);
* J& J- \  L# Y6 y2 ?
, C- c/ V! U: L$ ?5 m5 g  {1 D上式的映射关系可通过下式理解:5 T0 Z/ _( x: ^+ @; V
> [convert(sin(x),exp),convert(cos(x),exp)];, D5 r0 l# P( f, d
  K% ?% D8 r6 Q# K+ O9 P; E
> restart:
0 ]  Z, g' O3 {) zmap2(f,a1,x1+x2+x3+x4,a2,a3,a4);; j& n% \$ {  A  m  P) T
' G8 y6 T% Z5 W* l, N8 _8 B. U1 K1 J  q
> map2(max,k,[a,b,c,d]); , z3 j6 G/ G" D$ A" x% ~" _2 N

2 l2 ~3 \  c7 k! F! g& e, b再看下面示例:   
% _; {. s: d/ U" `. `( C, ^> L:=[seq(i,i=1..10)];! E( d5 {' y" V, Y% D7 s* a7 i
/ v1 m6 U: [4 j( R3 j& ~
> nops(L);
! n: k% v3 s1 N % t0 {7 V' {* r
> sqr:=(x)->x^2;
5 p; X- ?7 W) }2 P3 `! j
2 |" x6 M% w- r> map(sqr,L);5 p% w) r2 F  Y; {* `  G

0 p7 a  i: R! m  P> map((x)->x+1,L);
$ O* E& z: x: B: G
* G) T1 T  T4 S& Q& T  z: E> map(f,L);
$ s7 J3 X1 s2 `( u5 b, l* m . ~  v4 b6 C5 ?8 n3 h
> map(f,{a,b,c});
+ h9 D5 S7 O. T- f$ J
; E+ ^/ H, C) G> map(sqr,x+y*z);( x8 b8 S- q4 H  U/ R

9 ~5 F! N$ {$ v1 e: \1 {> M:=linalg[matrix](3,3,(i,j)->i+j);) B$ ~3 e: |3 w: n: L
, `( l$ l) i/ G! n
> map((x)->1/x,M);
5 n4 O  `& P* v3 |3 k) M
% V3 ^# c0 [, {+ ^  }/ }! E3 求 值( m# C  P) a) J- @
3.1 赋值/ }/ N+ v( i$ \
在Maple中, 不需要申明变量的类型, 甚至在使用变量前不需要将它赋值, 这是Maple与其它高级程序设计语言不同的一点, 也正是Maple符号演算的魅力所在, 这个特性是由Maple与众不同的赋值方法决定的. 为了理解其赋值机制, 先看下面的例子.
; J9 ?9 O" H8 w  N% |6 ?# }> p:=9*x^3-37*x^2+47*x-19;
4 w( X/ n8 y' g% X - d, @' ^* z+ B6 G
> roots(p);
' l- j( I! U8 L6 a$ \ ! z7 `* q1 I8 X) X
> subs(x=19/9,p);) J7 \; U0 V. ]1 J# V; V- J
; p) u/ d" ^  e- S
在这个例子中, 第一条语句是一个赋值语句, 它的作用是把变量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;”这样的简单语句即可验证. ; g3 m' \9 V& K' W) P# b) m
3.2 变量代换
2 l) z9 x: y6 B2 x0 \! i在表达式化简中, 变量代换是一个得力工具. 我们可以利用函数subs根据自己的意愿进行变量代换, 最简单的调用这个函数的形式是这样的:     z( b* E0 d+ U8 r: A/ }
subs ( var = repacedment, expression);
5 }! t& ]; V# Q; n1 V调用的结果是将表达式expression中所有变量var出现的地方替换成 replacement.
& l% G  T% n0 Z1 J  `/ s> f:=x^2+exp(x^3)-8;+ u5 d7 N0 Y" X% E' g( Z2 G

, s5 _( N% a% g9 |> subs(x=1,f);
2 u0 R+ Q( }7 s * ]" r1 g7 k$ e$ F
> subs(x=0,cos(x)*(sin(x)+x^2+5));
8 E" K! P+ e, B: V( l  w 5 r  p/ k$ r  v1 i% o
    由此可见, 变量替换只得到替换后的结果, 而不改变表达式的内容, 而且Maple只对替换的结果进行化简而不求值计算, 如果需要计算, 必须调用求值函数evalf. 如:   * r8 n# R8 i4 i- u' p  q+ @8 I
> evalf(%);1 H! _% g) q- f- A& c
5 O% \4 U7 {0 t; F
变量替换函数subs也可以进行多重的变量替换, 以两重代换为例:   * G) t6 w$ u# ~) g) P
subs (var1 = repacedment1, var2 = repacedment2, expression)+ n$ T* ?. X3 z" W
调用的结果和按从左到右的顺序连续两次调用是一样的, 也就是先将expression中的var1替换成replacement1, 再将其结果中的var2替换成replacement2, 把这种替换称作顺序替换;    与此相对, 还可以进行同步替换, 即同时将expression中的var1替换成replacement1, 而var2替换成replacement2. 同步替换的调用形式为:   
& z' }2 A9 b6 a; s: k2 @; z/ Csubs ( {var1 = repacedment1, var2 = repacedment2 }, expression)$ S7 d. c/ H) z$ M
下面通过例子说明这几种形式的替换. , O, }/ y* Y. j
> subs(x=y,y=z,x^2*y);              (顺序替换)
4 o; }& H. z3 ]: [1 K3 ~
& h% j" u, U1 Z2 }. Z> subs({x=y,y=z},x^2*y);            (同步替换)8 b( I* q9 B9 q( u' L' X
/ j' Y/ m* ^0 H' V
> subs((a=b,b=c,c=a),a+2*b+3*c);   (顺序替换), w& }9 }( H1 C. p% E0 S  B

0 @1 e% Q) t1 a$ x9 u  M6 p> subs({a=b,b=c,c=a},a+2*b+3*c);    (轮  换)# q0 O1 N8 F6 }6 O  h3 z$ y3 }) l* B- n

2 {! b2 R' U' ^9 ?" W6 d$ X( q> subs({p=q,q=p},f(p,q));             (互  换)
9 l1 |+ S, ?/ a' I8 z5 p; H; W
6 O; f) q; u0 `) P3.3 假设机制
9 t8 j1 E3 s( o$ I$ b! J8 u2 PMaple是一种计算机代数语言, 显然, 很多人会尝试用Maple(或其他计算机代数语言)解决分析问题. 但由于分析问题与处理问题的考虑方法不同, 使得问题的解决存在某些困难. 例如考虑方程 的解. 如果k是实数, 结果显然是x=1, 但如果k是 的复根, 为了保证解x=1的正确性, 必需添加附带条件: 也就是当 时x=1. 这是一个对结果进行正确分析的例子. 然而从代数的角度考虑这个问题时就会把k当作不定元, 此时k没有值, 从方程两端去除k的多项式是合法的, 只要这个多项式不是零多项式即可(这一点是可以保证的, 因为其所有系数不全为0). 在此情况下x=1就不需要任何附加条件. 计算机代数系统经常采用这种分析的观点.   f$ Y3 U& N( o  }0 @9 f
在Maple中, 采用分析观点解决这类带有一定附加条件的实用工具是函数assume, 其命令格式为: assume(x, prop);
/ l! E* h5 r# f% Q5 t! k# P% s" 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);”也不会产生矛盾.
2 t6 `4 j- J! _# r+ Z1 s  r- u; d> Int(exp(-s*t),t=0..infinity);1 C  M. a' v+ k# {3 k$ O

3 K7 O5 e8 c4 R4 f> value(%);( D7 h3 P. X' d7 {7 V
Definite integration: Can't determine if the integral is convergent.
$ V7 j" N" i/ ^$ x) s) _4 mNeed to know the sign of --> s" Y& p% w$ Z; ~0 E3 U. K$ o
Will now try indefinite integration and then take limits.6 l9 c# ?# Q4 j
0 s) i) S- C+ v5 z0 K( x
> assume(s>0);
: B6 E, _2 I4 q) R3 K7 D8 I> Int(exp(-s*t),t=0..infinity);
: u. \+ ~1 T* }! P0 _6 ~$ ^ # U# h9 _( m4 T
> value(%);2 J7 o% v0 m9 s& [+ V5 o: v
+ g/ C6 T+ b& w  T, j
3.4 求值规则
) i9 K( e" d4 D. d& W在多数情况下, Maple的求值规则设计为做用户期望的事情, 但要做到这一点很困难,因为不同的人在相同的情形下会有不同的期望. 在大多数情况下, 全局变量被完全求值, 局部变量被一层求值. 而由符号' '界定一个暂时不求值的表达式, 单步求值仅去掉引号, 不作计算, 这也是允许取消指定名字或清除变量的原因. 如下例:   9 ~& M, g7 `3 s5 l! C6 v
> x:=y;
* P; c7 p6 g, G9 w* R8 T# H  B) b9 h ) ]1 B+ k& V" O0 N; t6 U
> y:=z;. A$ @( r* }) M
/ V( i# _& y+ E! H5 o$ i9 I7 ~
> z:=3;
- L  H7 T; }; ~5 e9 B7 Y8 {$ y 8 t5 p! r4 m: _
> x;5 r2 z% u! s! H0 c& |" w; U

- \- X2 f) ]9 Q. M> y;$ O; N% ?1 U! K; }* N# Y; @$ F
4 W9 r7 L3 s/ \+ O# i  ]: _$ o
> x:='x';. ?8 _) x" I6 i2 @' P3 X& T: l; ]4 ?1 b
  {5 k: f' k/ h
> x;' P1 Z7 K8 S2 ]3 z$ V0 Q

1 b% z5 A. r4 L; ~2 Z/ o: Z1 _> y;4 l/ H* ^7 f; P/ E4 ^. V
- c& }0 A  X( j! k: v: V/ j: e
对于不同的问题, Maple设计了不同的求值命令. 现分述如下:   1 e7 s- F( d4 n' E/ h
1) 对表达式求值& ~" U* F" t; ]
命令格式: eval(e, x=a);  #求表达式e在x=a处的值
7 w& C% K; v6 [9 `" e! s             eval(e, eqns); #对方程或方程组eqns求值' `0 `6 j1 P$ V7 b% ]3 d2 b$ K4 ~
             eval(e);      #表达式e求值到上面两层
8 s, M' i$ ^) i; a8 [             eval(x,n);    #给出求值名称的第n层求值
. w/ I4 h# m4 ^- k5 D1 i9 Z> p:=x^5+x^4+x^3+x^2+x+73;9 g! g8 f0 `/ X# C
, O4 L+ N( N/ G
> eval(p,x=7);# a1 D* ?4 s* e) ^1 ]& l. m
; T+ @( Y/ z# D+ z+ Q
> P:=exp(y)+x*y+exp(x);5 w$ w, S8 q8 O. k# S

- v+ y9 E8 @4 z& M. q3 E4 {7 P> eval(P,[x=2,y=3]);
* |$ O* W  o! B6 s: M 1 l; e$ f! }/ @2 z3 ^5 T% n
    当表达式在异常点处求值时, eval会给一个错误消息. 如下:   ' J+ N* r. W: a. j
> eval(sin(x)/x,x=0);7 Q4 q+ Z: Z$ }6 C# C3 I
Error, numeric exception: division by zero% f" |: Z( s1 M
    下面再看使用eval进行全层求值或者对名称几层求值的示例:   
8 K% }0 ]: R3 g( x/ D> a:=b: b:=c: c:=x+1:8 y& i. H# T1 h% u7 c" |) h5 `# g+ c
> a;              #默认的全层递归求值5 ]0 S/ E) B/ ]8 ^$ f$ R- j

* D  S% F3 i. a# H4 c> eval(a);        #强制全层递归求值
2 Z1 }/ ?% Z1 G" m* q5 L, o
% ~* [8 i1 z8 ~" ^5 s! d> eval(a,1);       #对a一层求值$ [' a; e  |! z5 s: o" V
0 w  i# J$ _2 h' G$ |9 T
> eval(a,2);       #对a二层求值# c7 J3 Z; {, u) M( v# n0 f2 z
" h# @5 h8 S" p8 j0 U
> eval(a,3);       #对a三层求值
" F4 M+ ]2 W& \8 ]7 {6 p& m: K
, K5 D7 T9 M4 |4 E" C! [+ u> eval(a,4);       #对a四层求值% P, A: Z8 q0 w. N3 J4 [1 T% ~+ K
% t/ e3 I8 B* ^
    2) 在代数数(或者函数)域求值
! ?& e* y$ v0 M0 I/ z/ Z' f命令格式: evala(expr);       # 对表达式或者未求值函数求值: G. D+ P. N9 J1 h7 m/ \
             evala(expr,opts);   #求值时可加选项(opts)8 W( x2 m$ a( U9 j; t( Y  ^
所谓代数数(Algebraic number)就是整系数单变量多项式的根, 其范围比有理数大, 真包含于实数域, 也就是说任意实数都是整系数多项式的根(如 就不是任何整系数多项式的根). 另一方面, 代数数也不是都可以表示成为根式的, 如多项式 的根就不能表示成为根式的形式. 9 F, S$ f5 u' e% Z/ t7 R" {
代数数的计算, 算法复杂, 而且相当费时. 在Maple中, 代数数用函数RootOf()来表示. 如 作为一个代数数, 可以表示为:   , S0 J9 W2 z5 M: R  J
> alpha:=RootOf(x^2-3,x);- N5 p1 t6 d1 p/ r$ o* y

0 o! Q- u" n! N" F0 Z) F1 |- X> simplify(alpha^2);
; Z, w+ B( M: P$ a+ U6 u& e ) A" [0 H. U% k" |2 r9 e9 ?6 F
在Maple内部, 代数数 不再表示为根式, 而在化简时, 仅仅利用到 这样的事实. 这里, Maple用到一个内部变量_Z. 再看下面一个例子,其中alias是缩写的定义函数,而参数lenstra指lenstra椭圆曲线方法:
) X/ f3 S$ B3 X> alias(alpha=RootOf(x^2-2)):" f: A( {' \! t  @
> evala(factor(x^2-2,alpha),lenstra);
6 Y! ], ~1 s* S! W) t' ^, J
! H3 x8 ]/ ^% h> evala(quo(x^2-x+3,x-alpha,x,'r')); 6 z1 P' z" H3 B( M

8 m0 @9 ?, y% Y( J/ v: R: c> r;
. i1 ~7 D% u2 C) x8 i, t1 k/ j
7 D6 |+ h1 V4 ?" i- T> simplify(%);
  D# B8 N9 O- o8 E: B  S
. K# c8 Q$ x: m6 D" R3) 在复数域上符号求值  M# \8 `$ [, D! r7 o; ]$ A% D
操纵复数型表达式并将其分离给出expr的实部和虚部的函数为evalc, 命令格式为:
5 b2 R1 q' v) T) ^1 b& V$ mevalc(expr);   , V$ c# F8 J# k7 E7 i
evalc假定所有变量表示数值, 且实数变量的函数是实数类型. 其输出规范形式为: expr1+I*expr2. ! v* }$ _" @% r2 D" ~- A/ b2 f8 i
> evalc(sin(6+8*I));
) Q' _# {1 I( p9 z) {1 _0 T 9 X0 N# k& R) e) y, ?
> evalc(f(exp(alpha+x*I)));6 v, O6 x2 g$ t: H8 e

  c( U1 w9 c& ^% o> evalc(abs(x+y*I)=cos(u(x)+I*v(y)));
4 }! h5 ^. ~, [
. X1 @5 e, p7 e$ u4) 使用浮点算法求值
, F  l. y0 t# G! L3 l浮点算法是数值计算的一种基本方法,在任何情况下均可以对表达式expr使用evalf命令计算精度为n的浮点数(n=Digits), 如果n缺省, 则取系统默认值, 命令格式为: evalf(expr, n);     2 _' s5 Y1 G$ j( b6 y( A5 ~  q
> evalf(Pi,50);    + k. ^+ u# e9 |: l& A; M
# M7 R, R( M% |$ e+ e* d7 p
> evalf(sin(3+4*I));   : n8 ^1 V9 L4 b$ l* v4 d

9 E1 Z& U# x$ `) r7 Q> evalf(int(sin(x)/x,x=0..1),20);
$ l2 p& ^) e/ h8 s
& y: r( f1 E9 J5) 对惰性函数求值
7 e" J+ D1 @  T% u8 i1 |把只用表达式表示而暂不求值的函数称为惰性函数, 除了第一个字母大写外, Maple中的惰性函数和活性函数的名字是相同的. 惰性函数调用的典型用法是预防对问题的符号求值, 这样可以节省对输入进行符号处理的时间, 而value函数强制对其求值. 对任意代数表达式f求值的命令格式为: value(f);   
, ]# D* f! B7 L  A> F:=Int(exp(x),x);
* M! S9 `& h( J; k7 B- U  i
  f1 _/ |+ s. y5 g> value(%);
! c' Q9 v% |( D" [0 Z
3 Z: s5 }6 o2 c$ p: x> f:=Limit(sin(x)/x,x=0);
/ B4 U: x$ A: e$ {3 ?5 U4 B. L 3 W! D1 y8 M: C
> value(%);
3 ^; X  T$ ]6 z3 T 3 w: U# B5 G7 \! k
另外, 将惰性函数的大写字母改为小写字母亦即可求值. 如下例:   
1 \) x6 m6 ]/ W: v) p: w6 [> Limit(sin(x)/x,x=0)=limit(sin(x)/x,x=0);
! x4 U$ A8 l* _1 H5 [( d0 S
) E& P# c$ K- n0 ~; C4 {: c3 t/ G4 数据结构+ j+ T3 g; ~- A0 `% ~
Maple中有许多内建的与FORTRAN、C或Pascal不同的数据结构. 主要的数据结构有序列(sequence)、列表(list)、集合(set)、代数数( algebraic number)、未求值或惰性函数调用、表(table)、级数(series)、串(string)、索引名(index)、关系(relation)、过程体(process)以及整数(integer)、分数(fraction)、浮点数(float)、复数(complex number)等数据结构, 而矩阵(matrix)在Maple中表示为阵列, 是一种特殊的表.
7 u# s9 @/ h* g% ^4.1 数据类型查询
9 U' |' @, I5 f8 |' d5 ~' J! h在Maple中, 用whattype指令来查询某个变量的数据类型或特定类型, 命令格式为: & H, Z% @6 P; q6 ?
whattype(expr)        # 查询expr的数据类型
7 {" g# M- I+ utype(expr, t)           # 查询expr是否为t类型, 若是则返回true, 否则返回false; b$ {# V% P5 }0 I' B5 m
> whattype(12);
! u" X0 C) T6 m, O4 N3 Z1 M5 ?( d( X
0 Y; a' R; y6 D, S# y; K8 Y) W> whattype(Pi);
- W5 t+ P. n5 E) t 7 n5 ], e4 \5 C9 P
> type(1.1,fraction);( ~; ]7 _* K( G, O
: U2 p5 F4 v1 n
> whattype(1.1);
+ w/ S1 M' ]3 q - t. A( i% }2 J0 ], W
4.2 序列, 列表和集合
- c! X, ^: I5 {( P! I1 k4.2.1 序列
( L9 k9 b4 R: O所谓序列(Sequence), 就是一组用逗号隔开的表达式列. 如:   ; l5 ~0 P8 I* w" {
> s:=1,4,9,16,25;" u- ]5 Q6 g$ ?) _3 W( ]
' X2 v+ S7 W! q+ G7 g+ _
> t:=sin,com,tan,cot;
; \0 R& P' Z4 O2 g + D; t' X9 Q# {* U7 C
一个序列也可以由若干个序列复合而成, 如:   
' ]) W* n9 P/ ~# p' n, t  e5 t> s:=1,(4,9,16),25;8 w- \5 e2 U( E; Q- v7 i
/ w' ~. e9 j, i, l% N
> s,s;- \( h2 h0 W  Q! Y# X
; t& _5 ?8 S% O& Q: A
而符号NULL表示一个空序列. 序列有很多用途, 如构成列表、集合等. 事实上, 有些函数命令也是由序列构成. 例如:   
6 ^5 {! q3 i/ y$ `6 X: U4 ?> max(s);5 j( z& \2 Z/ E
# K6 C* \3 y  V
> min(s,0,s);
0 N- z+ O; F5 W2 ~+ Z. y
% M/ M. |+ q& L值得注意的是, op和nops函数命令不适用于序列, 如op(s)或nops(s)都是错误的, 如果要使用op(s)或nops(s)前应先把序列s置于列表中.
: A: ?/ w* Q% M) ^/ E> s:=1, 2, abc, x^2+1, `hi world`, Pi, x -> x^2, 1/2, 1;% x7 ]# D$ N5 ?  M
* Q/ |6 g& y, C! f
> op(s);( K' P! f, c# w( f" D2 }
Error, wrong number (or type) of parameters in function op
. s9 i) j* s% p, q; Z; `> nops(s);! ~% K. V+ S! s9 @2 @$ r
Error, wrong number (or type) of parameters in function nops
6 ~- d3 R$ `/ W: O% M8 s' a4 n> op([s]);0 u+ Z; T# }; P$ N- _  D

" b6 _* X) g4 x> nops([stuff]);- p( H4 E( |( X
/ A% Q9 V4 W7 b+ Y- g' Z
函数seq是最有用的生成序列的命令, 通常用于写出具有一定规律的序列的通项, 命令格式为:   
4 J! z& H0 X3 ]+ ?( W( x/ V) [seq(f(i), i=m..n);  # 生成序列f(m), f(m+1), …, f(n) (m,n为任意有理数)7 {2 G( D4 [5 W  K. [9 R% w
seq(f(i), i=expr);  # 生成一个f映射expr操作数的序列, g$ F# u5 t0 K! i0 I+ O: r8 e
seq(f(op(i,expr)), i=1..nops(expr));  # 生成nops(expr)个元素组成的序列
( a% m3 E% o9 `) }> seq(i^2,i=1..10);+ J% W7 F9 ]( V* {# S
# m  T: Y" j: c0 l1 v0 D# U6 b, y
> seq(ithprime(i),i=1..20);" _- w1 j) F9 ^7 Q3 m; [6 W

( ]3 M" f5 C4 f3 u0 O5 q8 W; H> seq(i^3,i=x+y+z);
' q/ \7 b9 l' u' Y 4 I7 {- ]4 H8 N$ ~  T
> seq(D(f),f=[sin,cos,tan,cot]);) n3 R, K8 N  g5 m

7 D+ R- T. s# R* t3 C+ ^> seq(f(op(i,x1+x2+x3+x4)),i=1..nops(x1+x2+x3+x4));
* u! ]( V% M# |; p2 R2 o$ l$ B
. x. d9 |0 {" @& e获得一个序列中的特定元素选用操作符[  ], 如:   6 V9 q- k* J8 m8 p; t* l
> seq(ithprime(i),i=1..20);
% W' g+ R" n4 d  p/ {
0 R7 c8 E7 U: K$ w> %[6],%[17];9 L8 @0 ]/ N6 T$ p9 J

% S: H4 F! l" y7 V; N, w' [4.2.2 列表3 I  S* R' {9 t5 t$ J
列表(list), 就是把对象(元素)放在一起的一种数据结构, 一般地, 用方括号[  ]表示列表. 如下例:   / g, \; D" o9 B2 b3 `' F! \4 y: C* o
> l:=[x,1,1-z,x];
" [" q) ?2 P# |6 }' u& G' ^# J
+ J3 s& c( T6 Y* n( h: \6 F> whattype(%);
$ Y$ r! q# @" Z5 s) ^) t0 G% P% z
9 v0 N9 w! i& M% v空列表定义为[ ]. & p$ e$ a+ J  |: q
但下述两个列表是不一样的, 因为对于列表而言, 次序是重要的:   1 B/ F* H. d( p9 \
> L:=[1,2,3,4];) H- ?% H) S- E; `" e  {
: ~9 m4 H; O# w% r# p
> M:=[2,3,4,1];+ {+ B3 W* B/ N7 S) e

  O* [7 g/ D8 ^! }/ Q4.2.3 集合
4 B! d/ j( x0 f: r. Z# Q. g集合(set)也是把对象(元素)放在一起的数据结构, 与列表不同的是集合中不可以有相同的元素(如果有, Maple也会自动将其当作同一个元素), 另外, 集合中的元素不管次序. 一般地, 用花括号表示集合. , G3 O& R$ E  R- l& D
> s:={x,1,1-z,x};
5 i6 A5 t! j- Y' B$ {7 t * ~  K% e5 C9 C4 X' _* X, Q- r" ~
> whattype(%);, ?# \& X+ @8 `" y# ^+ Q! p
5 W- V, d) P, {. E2 {! X/ Y
空集定义为{ }. % T: h  c7 g  Z  U, `
函数nop返回列表或集合的元素数, 而op则可返回其第I个元素. 8 F! J/ I& _3 M2 v5 p( ?0 M# I' b
> op(1,s);* ]2 v& @/ l$ D
* M5 r; Z% n& E$ K
> s[1];
5 B0 k4 P9 H. R
  l* T: I% o3 N' {! D4 X> op(1..3,s);
/ A) s, G, n1 K& k- v& j4 ]" L/ x* P
" \: d" r* w! T6 \> s[1..3];
% Y$ m; m7 k/ Z
$ w& Z4 R0 ?' p( A- @函数member可以判定元素是否属于一个列表或集合, 如果属于, 返回true, 否则返回false. " u8 Q) y2 j5 j
> member(1+x,s);2 F" X9 j- {  `# @# o9 {7 C
2 L4 Y( N) W. |2 ?5 Z% a$ C/ y
可以通过下述方法在列表中增减元素:   
* o5 \5 F' n; G3 z0 ?> t:=[op(s),x];" j6 W4 p0 C# u7 _' K. o" s
! F. S3 M# Z8 {9 N  G& m, O# C
> u:=[s[1..5],s[7..nops(s)]];7 D* j  ]( y/ {! V1 X7 i
7 A7 @$ ~# a/ {# `3 v6 }
Maple中集合的基本运算有交(intersect)、并(union)、差(minus):   % K% S/ C# z4 ~" ?2 @7 V
> A:={seq(i^3,i=1..10)};B:={seq(i^2,i=1..10)};
- o' m2 u. ~! r- m) ] 5 D( `6 C* w/ ~2 p7 J' A

. ^9 h3 F1 H7 g> A intersect B;
, X) I8 d# w; C9 [) ~
+ [! p( w* }: i& M> A union B; + I( l4 v+ B- L, }& u2 C2 C
6 ~. F# Q; o5 G9 L0 C4 i$ Z
> A minus B;' I, u$ S1 n* K

) _. ?# ]! n; Q( y0 s$ X- S4.3 数组和表
6 H% d3 [; S6 `! {3 R* J. p在Maple中, 数组(array)由命令array产生, 其下标变量(index)可以自由指定. 下标由1开始的一维数组称为向量(vector), 二维以上的数组称为矩阵(matrix). 数组的元素按顺序排列, 任意存取一数组的元素要比列表或序列快的多. 区分一个数据结构是数组还是列表要用“type”命令.
- F8 l% M: s! w    表(table)在建立时使用圆括号, 变量能对一个表赋值, 但一个在存取在算子中的未赋值变量会被自动地假定是表, 表的索引可以成为任意Maple表达式. 表中元素的次序不是固定的.
6 `' U7 ~$ {$ Z% F" g( G> A:=array(1..4);
8 [' S; S% O( ?! D9 i- H& Y 2 X2 @9 t2 E3 p% v  |* N: ~
> for i from 1 to 4 do A[i]:=i: od:
9 M. |! P$ N$ a$ q) A> eval(A);* w+ {0 _. `, G3 p
7 c5 S8 _( B% x7 _
> type(A,array);$ Z. E9 ~* r- O
! c; V: s; |; F1 M
> type(A,list);$ ^* B! R3 H' l: F: {& d) |8 O

7 a3 C; J! M7 b: m, t( X8 @  K  l4 h> T:=table();" E! F( Z# g, k  K8 u# Q7 W; a

" s& a% ?6 k( h, @+ ]/ W6 s> T[1]:= 1;
0 p0 q: L# m) @4 ~+ z+ y( ]
: Y9 c$ A0 v# w> T[5]:= 5;# F9 c5 e/ t9 F
, ]% `0 l# A0 u( ^  R- H7 k
> T[3]:= 3;
& p5 v7 \: f1 s8 G% B' ~ & ~" q4 n! V# x6 ~
> T[sam]:=sally;, |' R4 V! t# D4 z6 W: M2 M  |

! T; M, Y5 i; \9 r# S3 {" v> T[Pi]:=exp(1);
, o- r8 }* Y" I# r7 @, E0 o ( d/ h' z" u/ n& o; J0 B% L
> x:='x';$ w  }' |) c6 e. G+ c; A
0 P7 D' G. ?: K& e$ S: w4 P
> T[(1+x+x^3)*sin(x)] := 0;/ J8 o! V1 t7 P3 X" R

: p4 H* Q2 _  O- s6 t> eval(T);' U$ Q% V4 c" @( v* M# b# Y
+ \6 u: ]: L, N/ x9 V
> T[3]:='T[3]';: b- k( s9 B, k
6 w' X1 L+ R. s* ~" D
> eval(T);& ^. Q0 q3 ^; p
  b4 w5 y8 ]4 A# f% E7 o0 [
4.4 其他数据结构
6 Q( Z3 k# L1 {! l. _1 y4 T串在Maple中是很重要的, 他们主要用于取名字和显示信息. 一个Maple的串可以作为变量名, 它们中的大多数是简单的、不需要加引号的串, 但是如果变量名中包含/. 例如“diff/T”则必须把变量名用引号括起来. $ l+ {" s& }4 @6 }1 g6 N7 r
索引名是像Database[1,2,drawer]或A[3]这样的对象, 在使用索引前不需要直接建立表, 如果不得不做, Maple会自动建立表. 索引名通常被用于矩阵和向量. 为了保证Maple建立表的正确次序, 建议在赋值前直接建立. 6 U' Q' q" m* w4 v4 J' U
> x:=T[3];
" n. \: S( l% F9 u7 L ; y! E+ y) b7 U
> eval(T);
0 |/ ?( ?$ @( t' x6 p 1 ?) P# u8 i1 ^' R
> T[5]:=y;
7 K) `% g" }0 f; z* |# m7 B 2 z& R/ ~, T- E
> eval(T);
# f+ p# H* p6 T9 U. j: A: T
1 Q9 E: Q, F- C0 d; B由此可见, Maple并不直接建立T的表, 直到给T[5]赋了值.     4 p2 _) p: e1 c) ]% Y; A0 K
数值数据结构(整数、分数、有理数、浮点数、硬件浮点数和复数等)在它们的使用中是大量透明的. 浮点数是有传染性的, 这意味着如果数值结构中有一个是浮点数, 则整个结构自动转换为浮点数.
8 e- v* u$ m( t' B4 x* w4.5 数据类型转换和合并; A% Y- Y: R- A
convert是一个功能强大的类型转换函数, 它可以实现列表和数组的类型转换:   3 T% {: ]$ z1 e
> L:=[1,2,3,4];& f2 D3 e- [5 T6 j6 \; Z
8 Z1 m' l3 M6 p' P1 `4 a7 N* @
> type(L,list);2 ^0 U" ?& p$ j

3 e4 s3 q& ^2 y5 @, w) v6 g' D> A:=convert(L,array);
8 M6 C% |/ U8 H% Z* Y7 i2 j4 V + y7 E$ a% ?2 T1 |/ u
> type(A,list);
: d: M1 `+ _6 T+ y7 [' F
* I- S' \$ A! ]" m* o2 v# F8 z5 R> type(A,array);; T) Y+ f; ^  q

  X% d4 B9 G. f6 [7 B  c8 e另一个有用的函数zip则可把两个列表或向量合并:   
7 |  W7 E- O+ O- A1 _4 [3 w>L:=[seq(i,i=1..10)];
( g8 ^  M1 G; X8 \- _5 ?5 i
3 \7 V' q/ [! R" k# O/ h, L> Sqr:=(x)->x^2;
$ N, r( |# {7 E( {$ f
$ N) x* @' g5 w; A1 O> M:=map(sqr,L);
  b( c8 _5 H  b6 ? 1 t% D7 p0 h3 a5 }
> LM:=zip((x,y)->[x,y],L,M);8 L% v/ s0 _5 \! R6 J
6 e; a9 M' ^7 r# D: c
> map(op,LM);
1 L# ?  q5 p" h
# W3 ~0 ]' w1 ^5 a6 P5 Maple高级输入与输出操作
  s3 X- V; g+ s$ K; O" sMaple提供了良好的接口来编辑与计算数学式. 许多时候, 我们可能需要把Maple的运算结果输出到一个文件中, 或者在一个文本编辑器里先编好一个较大的Maple程序, 再将它加载到Maple的环境里.
" q5 J: d6 m3 i! m) H5.1 写入文件
$ D  o) [/ z9 o' u7 _! V5.1.1 将数值数据写入到一个文件
( T- |9 X0 v* E# B! r如果Maple的计算结果是一长串的数值串行或数组, 而想把它写到一个文件时, 用writedata命令. " o/ ]9 l: B- S, P9 \
若Maple的计算结果data为集合、矩阵、列表、向量等形式时, 将其写入名为filename的文件时命令格式为: writedata("filename", data);
8 O" K7 p  m6 U4 {8 o> with(linalg):8 @- [' _' v$ {9 a  n5 y0 Y
> M:=matrix(3,3,[1,2,3,4,5,6,7,8,9]);
( D. B' c' F8 k2 r/ e ; z7 m; l: g1 Z
> writedata("e:\\filename.txt",M);1 u3 A# a. y- M) y* B
而将结果附加在一个已存在的文件后时,使用命令: writedata[APPEND]("filename", data);
: B# Y/ ?* p; B> W:=matrix(2,2,[1,2,3,4]);
" w: [9 ?1 I3 f( n/ J
3 A- V7 B# R& o3 o% e. X. }> writedata[APPEND]("e:\\filename.txt",W);
( U/ x- m; c) H* j需要注意的是, 这里的APPEND是必需的, 否则W结果将会覆盖M结果.& C& Z( G, L# T: z) O
另外, 若想将结果显示在屏幕上时, 用命令: writedata('terminal', data);1 L  x* r0 }. ~5 J' _
> writedata[APPEND]("e:\\filename.txt",W); 3 c2 w$ B' k! J7 S5 D# N
> writedata('terminal',M);
- R+ N; \/ w/ X5 x! v1 d1                   2                   3           2 ^, F2 j3 ?9 S! x5 ~2 U6 ]) }
4                   5                   6           
- E' S: a/ T( C' q5 h+ x, |( W& x7                   8                   9   
  W" H: y) j  Z0 l6 a5.1.2 将Maple语句写入一个文件
+ `  e- x  u, J# r3 L如果所要写入文件的是表达式、函数的定义或者是一个完整的程序, 则使用命令save, 写入一个或多个语句的命令格式分别如下:
. B- b" `5 C: T6 {save name, "filename";
& C. F& g; n3 E$ Wsave name1, name2, …, "filename";
( N5 ?8 B3 X$ k, O若filename的扩展名为.m, 则Maple会以内定的格式储存, 若扩展名为.txt, 则以纯文本文件储存. 以内定的格式储存的文件作纯文本编辑器无法读取, 但在大多数情况下, 它会比纯文本文件的加载速度更快, 且文件容量小., Z' @- d6 T5 S5 @9 Y% {% J
> myfunc:=(k,n)->sum(x^k/k!,x=1..n);, l- n4 Z* ~. a9 L

* _5 D( j( P( ~$ j5 d1 a> myresult:=myfunc(6,8);
7 l! J8 Z) i6 Q  d
, ?( w5 g* o2 w% n3 o# s" G> save myfunc,myresult,"e:\\test.m";$ e. s. F, C* E) q9 [1 H
调用已存m文件用命令read. 试看下述实验:0 [  d0 ?" \/ P2 Q( a: [
> restart:
; d' X, M0 D, b  {  X, ?7 c# Y> myfunc(6,8);
9 d% Q; C1 G+ Y) \9 T 0 G' g7 h8 J; R! f, [4 B: Z3 c
> read "e:\\test.m";: s  X% y$ c; k/ L# i! _# I
> myfunc(6,8);
6 R3 s. L2 N3 N& D+ v. f0 Z : z/ h  w, V  V( p
> myresult;
  T' f% E. j4 t: ^2 {- c * {7 n0 B$ I% T' h' `: [2 s# h
    而存为txt文件时则将整个语句存为一个文件:
8 B/ ~0 j, I- Y% d/ O* p1 n0 _) m> save myfunc,myresult,"e:\\test.txt";
8 v. |2 ^  K* q" _4 o3 p> restart: read"e:\\test.txt";0 r% }. |. @3 f

% G  R- _# \3 k7 K( ]8 @, @ 8 p( i- J! |8 \% k
5.2 读取文件# f5 s3 W" Z7 P8 e
在Maple里最常用的两个读取文件的命令, 一个是读取数值数据, 另一个是是读取Maple的指令.2 A# g8 l$ ?" J/ v. Z$ l: p0 M
5.2.1 读取数值数据: Y% Q5 n: W& @" ?! j# w
如果想把大量的数据导入Maple里进行进一步的运算或者要运用大量的实验数据在Maple环境绘图时, 可以用readdata( )命令完成.2 X! T; x7 }$ M2 b2 w( @
从filename文件里读取n行数据时使用命令: readdata("filename",n);
$ Q5 Z9 v! P$ ^/ H以指定的格式读取数据时使用命令: readdata("filename",[tyep1,type2,…]);! o* Y# i) d7 z4 P
> readdata("e:\\filename.txt",3);
; M8 H7 X. C) w! Q ' F7 ]# J$ q6 G3 K2 A7 y
    读取filename的前三列, 第一列为整数形式, 第二、三列为浮点数形式:/ f* @8 ]: l& ]8 H
> readdata("e:\\filename.txt",[integer,float,float]);
+ L# P. O9 V1 i( Z 4 O6 T) A! S' j3 D: Z, ~4 M" l
下面再看一个运用大量的实验数据在Maple环境绘图的实验:
5 E8 d* }7 F0 M> mypts:=[seq([x/1000,cos(x^2/100000)],x=1..1000)]:" e4 J7 W- N& t% b' h; x
> writedata("e:\\data.txt",evalf(mypts));
5 G/ `; K9 b/ M  s& l/ q, A' f> dots:=readdata("e:\\data.txt",100):9 x# U/ Z9 R" J2 H# U: Y. s
> nops(dots);
/ J/ k. @5 B' x$ ]   A- Z! E3 b- o& V6 p2 B" d
> dots[1..4];
3 }6 ?' v7 X7 O & M2 N) L0 P4 S7 W- E( F: r4 C* A
> plot(dots,style=line);) @  j% _! @% x' Y: E+ b1 ]

. T5 A# g  o4 U! C6 Q: L. O# C5.2.2 读取Maple的指令- [( d: y" S0 |; h  u2 L# E
在编写程序时, 在普通软件中先编好程序再将其读入Maple环境中常常比直接在Maple中编写更为方便. 如果要将程序代码或Maple指令加载用read命令:7 Y3 s' |( H3 k- F/ w/ E6 U
read "filename";
( n. D8 _& m+ ~& n+ k如下例:
5 Q' m7 x6 a, Z3 x: o0 |# a> reatart:
( J5 f$ R' U/ N> myfunc:=(a::list)->add(i,i=a);
" H2 c) j0 z# G8 i) l# s 8 i: Y6 u# Z$ g- [! w1 Z% J( ~3 \/ t, c
> avg:=(a::list)->myfunc(a)/nops(a);4 D7 A! g- w9 ^9 G2 l3 I8 o3 J
( f- x( ~) J  E3 t# w0 h9 D( l
> save myfunc,avg,"e:\\function.m";
6 P( c8 I( |, D( E2 a0 h; q> restart:( p0 c1 \* m% m2 p6 \
> read "e:\\function.m";
2 u$ L! V' \. q" u3 P7 M/ g) Y> myfunc([1,2,3,4,5,6,7,8,9]);6 N; S; y) {$ [5 x. d6 Q/ y

3 ~" j# Y. O  w: f> avg([1,2,3,4,5,6,7,8,9]);* O8 V8 m( U+ t! R% n0 W
, m6 {4 {( n5 H, J: t' ~
5.3 与其它程序语言的连接- Q" Q0 D  I+ c6 r5 x- Z# r
5.3.1 转换成FORTRAN或C语言
& l8 F' w) x6 ]5 `* Z0 V调用codegen程序包中的fortran命令可以把Maple的结果转换成FORTRAN语言:
' n2 S$ ]% Q- V. F- U& l> with(codegen,fortran):
# ~2 j; H* D5 v: cf:= 1-2*x+3*x^2-2*x^3+x^4;
7 C+ x2 y% M0 N4 _" g 8 b9 z$ E1 X  |* p
> fortran(%);; P# p  U9 M+ V0 n- L3 X. [3 A) D
      t0 = 1-2*x+3*x**2-2*x**3+x**4* M! o6 m6 p# K, r' y
> fortran(f,optimized);" T# X% i( w$ }2 |0 M5 |7 \
      t2 = x**2$ J6 b- ~' Z3 N
      t6 = t2**2! Y/ }( a+ g2 H3 k- W1 g
      t7 = 1-2*x+3*t2-2*t2*x+t67 d6 D) l/ t( y0 ^
> fortran(convert(f,horner,x));  c7 j6 W0 w# G. X4 q( p! t9 W, L
      t0 = 1+(-2+(3+(-2+x)*x)*x)*x9 J. f5 i% y- |) B& K2 f5 w3 {+ S
而codegen程序包中的C命令可以把Maple结果转换成C语言格式:
2 w  y: D- a7 |$ `  E> with(codegen,C):
6 r) }7 @2 T  @8 J# Of:=1-x/2+3*x^2-x^3+x^4;' M# h& m$ `+ [
! ]* z3 ~/ a3 z2 X1 J* z& T
> C(f);0 P! n4 K4 u0 x. w7 i6 }
      t0 = 1.0-x/2.0+3.0*x*x-x*x*x+x*x*x*x;$ _2 k" d- w" y8 P* @
> C(f,optimized);
1 q! L  j5 Q  |* l      t2 = x*x;
9 y0 C. J; G# R' M      t5 = t2*t2;
- k8 t0 t$ T0 ?      t6 = 1.0-x/2.0+3.0*t2-t2*x+t5;5 X" A3 q) F9 ]2 C/ Z
optimized命令表示要对转换的表达式进行优化, 如果不加此可选参数, 则直接对表达式进行一一对应的转换.
9 |$ a$ x6 n: D8 W5.3.2 生成LATEX$ \0 W' U, M& {) Q
Maple可以把它的表达式转换成LATEX, 使用latex命令即可:
4 ?* S3 G; Y# v4 Y; v> latex(x^2+y^2=z^2);
, v- y4 j" t& ^) _{x}^{2}+{y}^{2}={z}^{2}
2 e+ @7 k$ p7 I& j( Z* v4 j    还可以将转换结果存为一个文件(LatexFile):
- k2 n% G! T9 {0 i; _( U> latex(x^2 + y^2 = z^2, LatexFile);, S( c: i+ X. q* L
    再如下例:
/ n  D8 g" \* C3 u* m! `> latex(Int(1/(x^2+1),x)=int(1/(x^2+1),x));
% g" e# p* m) U* M( F3 ~6 G\int \! \left( {x}^{2}+1 \right) ^{-1}{dx}=\arctan\left( x \right)
* w9 Q+ }2 p% G! i, x
2 E5 j9 T0 z; S* o* o) h; q; r
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年!) [6 Q, K8 n9 @4 F% R
    8 [+ O$ A) }, f" J( B7 T: {' u
    ' g5 l. T& K/ i; n% D  p
    回复

    使用道具 举报

    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, 2025-11-2 15:59 , Processed in 0.733543 second(s), 99 queries .

    回顶部