数学建模社区-数学中国

标题: maple基础 [打印本页]

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

; J! Q# `% U- I5 `# [8 F
, |. o4 v# W% t# v 2 [9 d/ ^/ I* q0 q% F
* p8 p4 ~8 D* l/ ?8 y' p, q) X
* L- ]! K! S8 t' Y9 ~

5 `8 _" `2 X4 N ' ?! x0 o: e+ O

! u. }! l" |: f: s2 N1 E ( I" K! u+ V4 ~! x
7 q2 W( O% s, e" O: I& g2 M
% y$ M8 k" p- @! z
alpha        beta        gamma        delta        epsilon        zeta        eta        theta        iota        kappa        lambda        mu) l  Z6 v; z# Q+ W8 O0 T% y- A

7 m6 G4 ]! {6 }; m7 n
2 f) ]( {  ~/ j* o* Z0 p) h$ J' K4 m
5 i& f% E, @( P) F* I) B4 ~" O
4 D: s. [! A1 }2 [8 G- O! c ) Y+ C9 A+ y, j+ \4 m
# c7 p/ e1 H, v5 l& U

- R& O3 y: K2 ]+ {: D + ^6 E: r4 M# X6 ?$ l! g
2 ^% q) j7 ]) a* M; g1 [; K# ~
; y8 z) `  N- H. S! T
: z* e) d# S# Y( e( k! E$ O7 ?, f" W
: U+ T3 {* S1 A9 O& ?9 Q; W& ~( q. z
/ M5 q8 G2 L# i$ ?+ E4 s7 R, i  j) E
nu        xi        omicron        pi        rho        sigma        tau        upsilon        phi        chi        psi        omega0 g  ?/ e. c2 U! j6 ^' r
有时候为了美观或特殊需要,可以采用Maple中的函数或程序设计方式控制其输出方式,如下例:
# [' A" L5 J0 t> for i to 10 do
4 k& r3 f; I7 O$ P  ~" o5 T9 [/ Uprintf("i=%+2d and i^(1/2)=%+6.3f", i, eval(sqrt(i)));& u1 N: A, B( r, @- `, T, M$ t
od;8 P! ^# g/ p7 n' j% N8 p
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.1620 J# l/ J, f' P  [' M2 G! s
+2d的含义是带符号的十进位整数,域宽为2. 显然,这种输出方式不是我们想要的,为了得到更美观的输出效果,在语句中加入换行控制符“\n”即可:  ]: m# \- O6 b* W, h6 W3 K: p
> for i to 10 do # k6 p. Q6 V0 P; D/ U% C: k" L2 C3 R( d
printf("i=%+2d and i^(1/2)=%+6.3f\n", i, eval(sqrt(i)));" B7 |2 ]& w0 j1 p1 D
od;
: U: {5 G0 ~/ f. i2 [i=+1 and i^(1/2)=+1.000
$ @% o% ?( w0 K( `5 }' ~1 ni=+2 and i^(1/2)=+1.414
- k, U( T5 r1 V. @( Xi=+3 and i^(1/2)=+1.732% s& `, K& y6 V- U. w% y8 h! z
i=+4 and i^(1/2)=+2.000
: \6 {: Y  F/ ~3 `0 zi=+5 and i^(1/2)=+2.236" \! o3 t! j. d$ h5 W
i=+6 and i^(1/2)=+2.449
* v( E: o( {& e% i7 qi=+7 and i^(1/2)=+2.6468 i* F$ t3 t1 U! C
i=+8 and i^(1/2)=+2.828; x: [, ~# e( p3 d. i$ i& y: b# E
i=+9 and i^(1/2)=+3.000- O) |$ G  p$ p' ^" k% i
i=+10 and i^(1/2)=+3.162" j: c% @6 l$ |* S- W
再看下例:将输入的两个数字用特殊形式打印:2 {" I% T* v# C, }  S; l
> niceP:=proc(x,y)
  d+ R$ g+ b1 z/ ^1 i- dprintf("value of x=%6.4f, value of y=%6.4f",x,y);
: d5 q( ^! r# xend proc;1 q+ Q- M: ^% f! ?" K

8 j: l' @+ N9 V' w* U4 A4 C8 r3 z> niceP(2.4,2002.204);7 |* U5 O7 e$ X9 p" y# o. j
value of x=2.4000, value of y=2002.20401 g9 u! A# \0 W9 ?, }
1.4 Maple联机帮助
2 z  Y4 B7 Q  ?" Y1 V# V学会寻求联机帮助是掌握一个软件的钥匙. Maple有一个非常好的联机帮助系统, 它包含了90%以上命令的使用说明. 要了解Maple的功能可用菜单帮助“Help”, 它给出Maple内容的浏览表, 这是一种树结构的目录表, 跟有…的词条说明其后还有子目录, 点击这样的词条后子目录就会出现(也可以用Tab键和up, down选定). 可以从底栏中看到函数命令全称, 例如, 我们选graphics…, 出现该条的子目录, 从中选2D…, 再选plot就可得到作函数图象的命令plot的完整帮助信息. 一般帮助信息都有实例, 我们可以将实例中的命令部分拷贝到作业面进行计算、演示, 由此可了解该命令的作用. . o2 u* B% [! W/ {7 W9 }
在使用过程中, 如果对一个命令把握不准, 可用键盘命令对某个命令进行查询. 例如, 在命令区输入命令“?plot”(或help(plot);), 然后回车将给出plot命令的帮助信息, 或者将鼠标放在选定的要查询的命令的任何位置再点击菜单中的“Help”即可.
! ?8 i" r# M1 K; b3 E+ H2  Maple的基本运算  ~$ L7 s. j6 Q, x* c+ W2 A
2.1 数值计算问题+ J9 m% R) ?' a( D
算术是数学中最古老、最基础和最初等的一个分支, 它研究数的性质及其运算, 主要包括自然数、分数、小数的性质以及他们的加、减、乘、除四则运算. 在应用Maple做算术运算时, 只需将Maple当作一个“计算器”使用, 所不同的是命令结束时需加“;”或“:”. 7 k5 v4 G" f/ s( j
在Maple中, 主要的算术运算符有“+”(加)、“–”(减)、“*”(乘)、“/”(除)以及“^”(乘方或幂,或记为**), 算术运算符与数字或字母一起组成任意表达式, 但其中“+”、“*”是最基本的运算, 其余运算均可归诸于求和或乘积形式. 算述表达式运算的次序为: 从左到右, 圆括号最先, 幂运算优先, 其次是乘除,最后是加减. 值得注意的是, “^”的表达式只能有两个操作数, 换言之,  是错误的, 而“+”或“*”的任意表达式可以有两个或者两个以上的操作数.
  I; z5 Z# B# X5 ]Maple有能力精确计算任意位的整数、有理数或者实数、复数的四则运算, 以及模算术、硬件浮点数和任意精度的浮点数甚至于矩阵的计算等等. 总之, Maple可以进行任意数值计算.
7 p) c4 t: t7 a/ k7 @) [但是, 任何软件或程序毕竟只是人们进行科学研究的一种必要的辅助, 即便它有很多优点, 但也有它的局限性, 为了客观地认识数学软件、认识Maple, 下面通过两个简单例子予以说明.
+ s' u+ y% M: f3 a% A7 ?3 \; M第一个简单的数值计算实例想说明Maple数值计算的答案的正确性:   
3 Z+ ^, W% V% t+ o> 3!!!;# [+ D" z/ Q2 o# I4 C2 L
2601218943565795100204903227081043611191521875016945785727541837850835631156947382240678577958130457082619920575892247259536641565162052015873791984587740832529105244690388811884123764341191951045505346658616243271940197113909845536727278537099345629855586719369774070003700430783758997420676784016967207846280629229032107161669867260548988445514257193985499448939594496064045132362140265986193073249369770477606067680670176491669403034819961881455625195592566918830825514942947596537274845624628824234526597789737740896466553992435928786212515967483220976029505696699927284670563747137533019248313587076125412683415860129447566011455420749589952563543068288634631084965650682771552996256790845235702552186222358130016700834523443236821935793184701956510729781804354173890560727428048583995919729021726612291298420516067579036232337699453964191475175567557695392233803056825308599977441675784352815913461340394604901269542028838347101363733824484506660093348484440711931292537694657354337375724772230181534032647177531984537341478674327048457983786618703257405938924215709695994630557521063203263493209220738320923356309923267504401701760572026010829288042335606643089888710297380797578013056049576342838683057190662205291174822510536697756603029574043387983471518552602805333866357139101046336419769097397432285994219837046979109956303389604675889865795711176566670039156748153115943980043625399399731203066490601325311304719028898491856203766669164468791125249193754425845895000311561682974304641142538074897281723375955380661719801404677935614793635266265683339509760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" N8 F$ {% B, ~
上述运算结果在IBM PC机(1G, 128M)上计算只需要0.01秒, 得到如此复杂的结果(1747位), 一个自然的问题是: 答案正确吗?
  C& f4 W, ^1 w) G# d为了回答这个问题, 我们借助于数值分析方法, 由Stiring公式
" j' B! \4 c- w! F
5 k( d! m& x' k# K2 v. L' f5 K8 H# l1 S可得:  , 前三位数字与Maple输出结果相同, 且两者结果均为1747位. 另外, 在720!的计算中, 5的因子的个数为:   / {  M  J; x4 _& O1 V. ^0 l
* J. d- f$ W( h; ?
这些5与足够多的2相乘将得到178个0, 而Maple的输出结果中最后178位数为零. 由此, 可以相信Maple结果的正确性.
) \2 W+ M% V. c2 A. _另一个例子则想说明Maple计算的局限性:   
* X2 X4 j. N" Q$ O* H" T  ) b3 u  A4 J; _) {' N5 q8 ]( Z
Maple在处理问题时, 为了避免失根, 从不求算术式的近似值, 分数则化简为既约分数. 因此, 在Maple中很容易得到:   
% }- u6 M. F9 O6 d, {- d: x# D 7 G9 f% X. ]: ]1 e5 _0 _5 I+ X; h5 n
显然这是错误的. 这一点可以从代数的角度予以分析. % a2 R0 T. s( M+ X1 h) b) I2 L% X5 q
不妨设 , 则 , 即 , 显然 有3个结果, -2是其实数结果. 4 K- }/ B. v% S8 Q4 s. @, w. o$ h
另一方面, 设 , 则 , 即:
3 n7 Y6 H$ [4 o& v, K( Q
9 g2 w7 g7 u" Z' `7 s3 g, N0 V4 A显然 有6个结果, -2、2是其实数结果.
3 l+ g% v3 g' _& t& j这个简单的例子说明了Maple在数值计算方面绝对不是万能的, 其计算结果也不是完全正确的, 但是, 通过更多的实验可以发现: Maple只可能丢失部分结果, 而不会增加或很少给出完全错误的结果(如上例中Maple的浮点数结果皆为 ). 这一点提醒我们, 在利用Maple或其他任何数学软件或应用程序进行科学计算时, 必须运用相关数学基础知识校验结果的正确性. * h7 t8 Q3 Z1 X. w
尽管Maple存在缺陷(实际上, 任何一个数学软件或程序都存在缺陷), 但无数的事实说明Maple仍然不失为一个具有强大科学计算功能的计算机代数系统. 事实上, Maple同其他数学软件或程序一样只是科学计算的一个辅助工具, 数学基础才是数学科学中最重要的.
% A: O" B, z( ^2 p5 E% R2.1.1 有理数运算
1 r. V/ G, Q% H$ ~2 O. a( ~7 v0 K作为一个符号代数系统, Maple可以绝对避免算术运算的舍入误差. 与计算器不同, Maple从来不自作主张把算术式近似成浮点数, 而只是把两个有公因数的整数的商作化简处理. 如果要求出两个整数运算的近似值时, 只需在任意一个整数后加“.”(或“.0”), 或者利用“evalf”命令把表达式转换成浮点形式, 默认浮点数位是10 (即: Digits:=10, 据此可任意改变浮点数位, 如Digits:=20).
( b2 F3 |  [- {% m4 A2 H> 12!+(7*8^2)-12345/125;
. ~* M; n. u% i: x: I5 I
7 c$ x4 B3 _2 u7 P& J+ L! q> 123456789/987654321;
' K7 `- m9 }2 e$ P- X% ]- |. N " t5 r: p; n8 W/ W' y; {+ G
> evalf(%);
# y, A" q" @$ o. I3 p
4 m! I8 J: D7 j* Z4 h: F+ }> 10!; 100*100+1000+10+1; (100+100)*100-9;- p% s- N: }1 Z5 ]: v
0 F/ D3 g+ Q  M: R; V
( U5 ]/ P: M3 g6 l3 a

3 T& k: Q# _/ e3 s, U; T> big_number:=3^(3^3);
: C8 ~+ [8 D. ~6 o1 w+ Y 4 R1 ]4 h( p& u4 c, [  @2 b
> length(%);
  g) v, V( s% V: R4 ]
5 m/ _/ O, Z8 O; c: ?6 ?+ U上述实验中使用了一个变量“big_number”并用“:=”对其赋值, 与Pascal语言一样为一个变量赋值用的是“:=”. 而另一个函数“length”作用在整数上时是整数的十进制位数即数字的长度. “%”是一个非常有用的简写形式, 表示最后一次执行结果, 在本例中是上一行输出结果. 再看下面数值计算例子:   
: t- `/ h/ L- ?0 s0 H! i    1)整数的余(irem)/商(iquo)3 U: \; V5 b/ x! Y. Y: |0 ~
命令格式:   ) R6 O/ C! f" |: H8 S% Y
irem(m,n);        #求m除以n的余数1 f. Q5 d; V9 s4 C1 K4 j
irem(m,n,'q');    #求m除以n的余数, 并将商赋给q# ^8 d& x4 Z, h1 D" [" z3 O
iquo(m,n);        #求m除以n的商数
6 H6 T$ o' i8 v: Z$ Z; Q5 ^: x1 liquo(m,n,'r');    #求m除以n的商数, 并将余数赋给r5 Z1 A9 F, @+ }. n& w& k! k7 y' T
其中, m, n是整数或整数函数, 也可以是代数值, 此时, irem保留为未求值. 7 ^5 F9 n1 b' U
> irem(2002,101,'q'); # 求2002除以101的余数, 将商赋给q( B  C2 X; A, K! v
  J* ^- _( O9 l1 H3 [
> q; #显示q& G; n6 j) L" n
; d/ n: {/ A$ g$ \5 `$ \0 r' V
> iquo(2002,101,'r'); # 求2002除以101的商, 将余数赋给r
4 g6 W! v7 j+ L9 `
" _) \( V5 b, e4 n0 ~# ^7 }3 _6 K> r; #显示r
0 W  d& q* x3 C4 ~3 W. [
, q6 Z/ w+ T  _3 j) i9 j> irem(x,3);
; K7 h" Y$ w  U) u% Q0 @
& {5 o& i7 j4 Q1 j; G$ V5 u; Y# A2)素数判别(isprime): ?: P0 {; o* W. C2 l
素数判别一直是初等数论的一个难点, 也是整数分解问题的基础. Maple提供的isprime命令可以判定一个整数n是否为素数. 命令格式: isprime(n);
' C% E) c. C: e! M    如果判定n可分解, 则返回false, 如果返回true, 则n“很可能”是素数. : I6 d. N' h+ j8 m' {( U, W
> isprime(2^(2^4)+1);
4 {! {; g) |$ s  h
0 e; L3 ?. |% T5 P0 g" z> isprime(2^(2^5)+1);$ p& B' A/ x) ]$ C+ i- I- |

( U1 r9 l8 I. u上述两个例子是一个有趣的数论难题。形如 的数称为Fermat数, 其中的素数称为Fermat素数, 显然, F0=3、F1=5、F2=17、F3=257、F4=65537都是素数. Fermat曾经猜想所有的Fn都是素数, 但是Euler在1732年证明了F5=641•6700417不是素数. 目前, 这仍是一个未解决的问题, 人们不知道还有没有Fermat素数, 更不知道这样的素数是否有无穷多. " q7 f5 J0 H) R" j- H
3) 确定第i个素数(ithprime)# m- v) W& Z- i# h$ O
若记第1个素数为2,判断第i个素数的命令格式: ithprime(i);   
' e, S" q* v$ x" |0 O> ithprime(2002);/ z, `, X8 y9 f! A. N3 z

2 L+ S0 U9 S: Y& v9 F> ithprime(10000);8 x  l  j+ c5 R; t2 J
1 J+ b& C0 v; ^
4) 确定下一个较大(nextprime)/较小(prevprime)素数
* k' L1 y+ e- W当n为整数时,判断比n稍大或稍小的素数的命令格式为:   , p! S0 d: h" c
nextprime(n);  
0 d8 u: E3 a$ Y3 [1 ]prevprime(n); , R& G0 c* c; `# t/ @
> nextprime(2002);
" D6 L; r, F+ [, z; T/ o' v
4 k- V8 _1 P- J7 e. }; y: \  H> prevprime(2002);2 b) B9 U  \4 U0 ^0 i. q
: a% Y, F! n) v4 t: a' a$ {
5) 一组数的最大值(max)/最小值(min)1 _- i! U2 I! a5 L+ T1 ?
命令格式: max(x1,x2,…,xn);   #求x1,x2,…,xn中的最大值5 P  t& J& |( t
             min(x1,x2,…,xn);   #求x1,x2,…,xn中的最小值
4 b. Y  k  T, b3 S/ d> max(1/5,ln(3),9/17,-infinity);
  N7 s- h3 S2 ~, G' w% y 5 ~; x, L4 Y, R! {% A' A  f
> min(x+1,x+2,y);! T) X3 j. M- ^
1 ]+ @4 x" r8 Z6 n6 L$ G# S
6)模运算(mod/modp/mods)3 q' R4 V3 _( O7 {2 J9 E$ {$ o
命令格式:  e mod m;    # 表达式e对m的整数的模运算
  e* f# J3 S5 E5 R# d, h7 `modp(e,m);  # e对正数m的模运算
* n2 e; h( _) g/ v6 A1 o+ ]mods(e,m);  # e对m负对称数(即 -m)的模运算
; t1 H6 }9 n* q`mod`(e,m);  # 表达式e对m的整数的模运算, 与e mod m等价
3 |. e+ O1 R# }7 o值得注意的是, 要计算i^n mod m(其中i是一整数), 使用这种“明显的”语法是不必要的, 因为在计算模m之前, 指数要先在整数(可能导致一个非常大的整数)上计算. 更适合的是使用惰性运算符“&^”即: i &^n mod m, 此时, 指数运算将由mod运算符智能地处理. 另一方面, mod运算符的左面优先比其他运算符低, 而右面优先高于+和-, 但低于*和/. 8 C1 N* d, H& I( B: I
> 2002 mod 101;
; v! y: P5 a0 q3 u; s9 U4 y  t. }" D ) f7 a. o$ x( z9 k: @4 f
> modp(2002,101);) x0 ~9 ]# M7 F( m% }

/ A6 q  Y! w$ n/ ^> mods(49,100);! a( G& ]) o& _: k
/ F& z, T- R) i# b0 v; G# X
> mods(51,100);5 u8 M4 f4 E2 A7 |

$ ~5 H# X. ^6 h% n3 M4 k> 2^101 mod 2002;  # 同 2 &^101 mod 2002;
0 z. J, c! P7 y
. J. i# Z- O: b$ J! n" k7)随机数生成器(rand)6 l/ ~% Q" c* R1 r
命令格式:   + V# {4 w+ h" ^6 M
rand( );    #随机返回一个12位数字的非负整数
( k( C) \: W! ^rand(a..b);  #调用rand(a..b)返回一个程序, 它在调用时生成一个在范围[a, b]内的随机数0 e! l6 B% p0 E5 p
> rand();& [4 ?( L  `) ?* o4 F7 N

3 H! a/ |# t) ^9 ]9 E8 i> myproc:=rand(1..2002):
5 h: p* D: q( r> myproc();' S( }4 d0 Y" i. P, i2 U; t  @
$ ]9 a( p% c- d
> myproc();/ [  h0 q6 j5 a( y1 o3 @2 {2 X' d

2 _( n4 U; C3 A/ N5 v# X- r3 [3 Y    注意, rand(n)是rand(0..n-1)的简写形式.
: b1 P$ j  l3 ?, G5 L, o) S2.1.2 复数运算0 s- U. ]6 i0 N  x
复数是Maple中的基本数据类型. 虚数单位i在Maple中用I表示. 在运算中, 数值类型转化成复数类型是自动的, 所有的算术运算符对复数类型均适用. 另外还可以用Re( )、Im( )、conjugate( )和argument( )等函数分别计算实数的实部、虚部、共轭复数和幅角主值等运算. 试作如下实验:   
1 O! g! ~  N6 E$ o: Q& F, l) f: \! _> complex_number:=(1+2*I)*(3+4*I);( [2 `3 E) o* o

4 r+ k5 j* {2 J6 o" j2 F0 W5 Q> Re(%);Im(%%);conjugate(%%%);argument(complex_number);3 a! l- z! p) ?

0 t6 u; Q8 m/ I/ X7 s
* A2 s/ s0 n0 u: G' S: y3 n) F5 D8 C- d/ q 2 A9 J4 Q: K) A* s/ i2 x
- M1 K/ C) H5 {, t
值得注意的是上行命令中均以“;”结束, 因此不能将命令中的2个%或3个%(最多只能用3个%)改为1个%, 因为%表示上一次输出结果, 若上行命令改为“,”结束, 则均可用1个%.
3 M% q  @; k" P" b为了在符号表达式中进行复数运算, 可以用函数evalc( ), 函数evalc把表达式中所有的符号变量都当成实数, 也就是认为所有的复变量都写成 的形式, 其中a、b都是实变量. 另外还有一些实用命令, 分述如下:   . r3 W  K2 ?+ d2 }$ t9 j6 y: m
1) 绝对值函数
- `" O+ }$ j7 @8 {/ ]1 z命令格式: abs(expr);  " ]6 m/ O# I7 h( a
当expr为实数时,返回其绝对值,当expr为复数时,返回复数的模.
/ T% `; ]) l6 E3 l) `4 o- \% v> abs(-2002);    #常数的绝对值7 A* G, K  _2 R( {- K' Q( s
. f3 U: H! d% v$ L
> abs(1+2*I);   #复数的模( ^# l0 \2 X5 ^3 N5 ~: G! ~
1 ~/ }  Q( Y( p2 ^7 O+ k
> abs(sqrt(3)*I*u^2*v);  #复数表达式的绝对值/ E1 ?2 a; h5 j* K+ U, G% d- @

$ F. A/ d! _. P4 [$ ?4 \; Y# F> abs(2*x-5);   #函数表达式的绝对值) [! J7 s* @7 H

8 y$ i1 O5 a/ x$ y2)复数的幅角函数9 `5 x" [1 Q5 l
命令格式:   argument(x);  #返回复数x的幅角的主值
# T5 u- l1 T; G9 F& B7 t. x> argument(6+11*I);4 H' y) e5 G" t. r2 L5 b5 d

  O0 K7 r0 r; K> argument(exp(4*Pi/3*I));
$ ?5 f* N1 h' b5 x  G! Q ' W9 d. N4 q8 J9 t3 n
3)共轭复数
, e( _1 Y1 u% o9 P  o命令格式:   conjugate(x);  #返回x的共轭复数0 c. P2 I2 S+ w) ?
> conjugate(6+8*I);
* S$ l5 L. V* q 1 b6 H% }6 I; L0 ~2 u8 W
> conjugate(exp(4*Pi/3*I));
. B5 [' P# b; X  S  U
2 u5 a9 o0 B. C& _; f+ H3 b0 _2.1.3 数的进制转换. I4 @% |- ]& g0 T; s
数的进制是数值运算中的一个重要问题. 而在Maple中数的进制转换非常容易, 使用convert命令即可.
! z" D6 l+ s- `0 ~. E- {8 g命令格式:   convert(expr, form, arg3, ...);   
) I7 i7 Z% r+ R  }9 ?其中, expr为任意表达式, form为一名称, arg3, ... 可选项.
# z9 A* a1 u& V. Y( }* p/ x下面对其中常用数的转换予以概述. 而convert的其它功能将在后叙章节详述. , M' g, n" S: L( [/ Q8 r- K4 ~1 K
    1)基数之间的转换/ _' T# W  N$ ~, \
命令格式:   , j  N9 q! |1 q6 \5 X/ i/ A
convert(n, base, beta);      #将基数为10的数n转换为基数为beta的数
% l3 t+ S2 `$ H& e" Y* y2 y    convert(n, base, alpha, beta);#将基数为alpha的数字n转换为基数为beta的数; b& F9 r! P) [& l4 v$ n0 R
> convert(2003,base,7); #将10进制数2002转换为7进制数, 结果为: (5561)7( Y6 i. x6 v" |& F9 U
0 B) ?+ A3 e. Y
> convert([1,6,5,5],base,7,10); #将7进制数5561转换为10进制数+ A! I) M) D* K+ W; N( m

! U! p5 w! V& D) A  b> convert(2002,base,60);       #将十进制数2002转换为60进制数, 得33(分钟)22(秒)
. W  _4 J, g6 t; m2 R3 l, B- O # c' _0 w5 ]& ]# r
    2)转换为二进制形式5 b4 `) K6 W7 W
命令格式: convert(n, binary);
! B" ^# g. l1 i+ ?8 U3 M' c/ ?4 G其功能是将十进制数n转换为2进制数. 值得注意的是, 数可以是正的, 也可以是负的, 或者是整数, 或者是浮点数, 是浮点数时情况较为复杂. ) w- U: u" o8 C* \- h8 n* T
> convert(2002,binary);   7 z" C4 s9 X( G! W* i7 t

" z/ I: A$ ]7 f" q> convert(-1999,binary);
: W) A" A9 l7 I, m  J 4 g1 F1 d4 X+ J
> convert(1999.7,binary); , J1 s5 |5 \5 r+ S

6 u2 T) [+ f) S3 q6 X' D3)转换为十进制形式) @$ ]9 z* v+ Y7 P- N
其它数值转换为十进制的命令格式为:   
, |4 X% [! ]" v* j! u. gconvert(n, decimal, binary);   #将一个2进制数n转换为10进制数
1 K, O8 g, j! }4 h" R! c' ?    convert(n, decimal, octal);    #将一个8进制数n转换为10进制数' b# z4 D1 [# R: o" A( v
    convert(string, decimal, hex);  #将一个16进制字符串string转换为10进制数
4 n4 ?0 u0 y5 m7 K4 r> convert(11111010010, decimal, binary);   
7 t6 e3 n0 ?" C$ K+ C' I& a
8 h# u" y9 X9 o. O> convert(-1234, decimal, octal);           
6 q; p2 l& v& z3 R8 {0 d 9 x+ `, f$ I% m# t, T: R
> convert("2A.C", decimal, hex);         
7 K2 {3 M9 A3 L( r" I' K
. l5 E6 u* |9 T% k$ K* t$ s4) 转换为16进制数
/ y/ @2 D' \8 \( E3 d. D将自然数n转换为16进制数的命令格式为: convert(n, hex);   
/ d* P- p# p8 Q2 G  @- K  a- c$ E> convert(2002,hex);  convert(1999,hex);" |( T7 m4 E4 O6 i

) \/ d% T* ^" a3 u
& u) G4 N8 Z" k. }: ?- L! U3 p# I5)转换为浮点数" ?/ R- W7 x$ K0 ]5 r" K1 r
命令格式: convert(expr, float);2 Y) x; C, n; g8 c
注意, convert/float命令将任意表达式转换为精度为全局变量Digits的浮点数, 且仅是对evalf的调用. 3 _5 B  ]0 T. \! l$ N5 _% d/ p' t
> convert(1999/2002,float);
: Y6 a/ E5 i4 ^: o" V 5 Q' E. z0 O9 F6 ?& N
> convert(Pi,float);
6 y/ B4 |3 U9 z  d: Z  B 2 q& @2 R" z* p9 q# \
2.2 初等数学
9 W" ?. E- z$ z, r) K% i5 L    初等数学是数学的基础之一, 也是数学中最有魅力的一部分内容. 通过下面的内容我们可以领略Maple对初等数学的驾驭能力, 也可以通过这些实验对Maple产生一些感性认识. " j7 `; f! k) E
2.2.1 常用函数
4 Q& M5 n$ X) h8 x作为一个数学工具, 基本的数学函数是必不可少的, Maple中的数学函数很多, 现例举一二如下:   5 Z  J& {4 A  x) \' u+ r
指数函数: exp6 i0 [3 a! q- B' G  K, x) @& a: A
一般对数: log[a]
2 A1 b8 u, d% z* x自然函数: ln* \4 h" P+ Y$ T% N& O) B. y* k/ w
常用对数: log10
5 F# P. X( i: H: j: E平方根: sqrt
" B. \: T2 z$ s- ^绝对值: abs) _, ?. W3 ?1 i( o6 [
三角函数: sin、cos、tan、sec、csc、cot: l5 ^, k" r& ]- \8 k
反三角函数: arcsin、arccos、arctan、arcsec、arccsc、arccot* g9 v- k. x' f: _( S. B3 d
双曲函数: sinh、cosh、tanh、sech、csch、coth" c, ~! }0 k# K( s& p
反双曲函数: arcsinh、arccosh、arctanh、arcsech、arccsch、arccoth
! m: ?; G) q: {4 z6 T贝赛尔函数: BesselI、BesselJ、BesselK、BesselY+ y; Y  `. h5 W! s# ]6 S1 B
Gamma函数: GAMMA
' j( A# Q% T! n误差函数: erf
1 C7 r3 Y) @! i/ J/ |2 u; X( f3 N函数是数学研究与应用的基础之一, 现通过一些实验说明Maple中的函数的用法及功能. $ Z2 B8 X- c! w$ S# j# o) [/ K9 U
1) 确定乘积和不确定乘积$ k% i) w8 @4 Y- P' C
命令格式: product(f,k);  
* x- D9 p- V( ~% G* Hproduct(f,k=m..n);  $ K: b8 L3 A5 W9 \+ w+ V
product(f,k=alpha);
% E3 u# g9 L) m2 d! Pproduct(f,k=expr);
6 @9 {% `8 a  }3 }& o/ A其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—包含k的任意表达式.
8 ^. O  P3 ~# e; W$ `) G> product(k^2,k=1..10);   #计算 关于1..10的连乘
3 H0 z' `) e7 Z: Y( X
" `2 `1 ~- E; W; q" u- y. ~> product(k^2,k);         #计算 的不确定乘积! F8 _) n& z- c+ w

) ]8 M! R+ }3 s% ?. u# P> product(a[k],k=0..5);    #计算ai(i=0..5)的连乘- U! A+ Z0 j  v& q. I0 H5 V! l

" c9 b6 c! K/ e9 B2 S6 U> product(a[k],k=0..n);    #计算ai(i=0..n)的连乘" x& _) x9 u7 F6 e7 W5 V# C. X
- s# _0 u/ K+ D
> Product(n+k,k=0..m)=product(n+k,k=0..m);   #计算(n+k)的连乘, 并写出其惰性表达式
; D3 _/ A6 T8 w1 B% n* J' S+ I( x 2 e9 q' N3 g5 A0 W; F2 U5 g4 O' y
> product(k,k=RootOf(x^3-2));     #计算 的三个根的乘积
" y" t  Y- {3 F. K6 n
! L" ^  [* _1 Y1 K    product命令计算符号乘积, 常常用来计算一个公式的确实或不确实的乘积. 如果这个公式不能求值计算, Maple返回 函数. 典型的例子是:   
  o6 u& b/ P( ^3 Y' R> product(x+k,k=0..n-1);
- s0 B" r5 S4 L1 b ; R- P5 {7 F7 A4 B' {
如果求一个有限序列值的乘积而不是计算一个公式, 则用mul命令. 如:   
$ Q) I0 `' z& ~* Q# `' [+ j> mul(x+k,k=0..3);5 E, v* K. c, a7 p& c4 Q0 X: W
+ g1 {9 M& |- Y3 B) o3 T5 J( r. T
2)指数函数
* H! Z& U) g+ Y9 {. G计算指数函数exp关于x的表达式的命令格式为: exp(x);
* }$ ~. [$ U: ^: L5 i: ^( F> exp(1);; @% n+ g1 a' Q7 ]* e$ M( O
0 T0 P# g- \) P# i
> evalf(%);
% E; l  V. E; S   O/ r* A0 _8 A0 b* H
> exp(1.29+2*I);' [' d  G- w6 j! s

: y# t$ Z9 H% s: ?> evalc(exp(x+I*y));) {- X! V; z: J# ~  x+ l4 ^9 n

* E- E$ o" n3 [* m2 x7 F3)确定求和与不确定求和sum+ M' {9 a; a+ i$ c4 m; B
命令格式: sum(f,k);  
  V, o7 L; E3 f3 F# p: zsum(f,k=m..n);  
( W+ y( F' m" A# _! y+ f+ O' `sum(f,k=alpha); + q/ A; n9 V, r4 N- |2 X( M$ r
sum(f,k=expr);$ M" _0 }6 I. g; `& f
其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—不含k的表达式.
. M/ {% v. ~3 _9 p- }> Sum(k^2,k=1..n)=sum(k^2,k=1..n);7 K) N/ E3 i3 m& M  T3 B' h' O$ `
. c: k9 G- C9 h# r2 Q' j" t9 A
> Sum(k^3,k=1..n)=sum(k^3,k=1..n);
# ^3 B# I! W! B9 _
+ b( L8 x2 @6 s  x& ], \2 N> Sum(k^4,k=1..n)=sum(k^4,k=1..n);5 Z3 Q' H  [( F4 T8 ?$ u* Q
6 A: {! v' S# Y! y9 x( M& j$ n
> Sum(1/k!,k=0..infinity)=sum(1/k!,k=0..infinity);
) p$ U) O( y3 X  h/ i
# W& v* e) z7 Z( J> sum(a[k]*x[k],k=0..n);
: s* k* K. K; @' H0 ^5 D  L4 Z
0 T% w. h& l9 z, S0 C3 N) a> Sum(k/(k+1),k)=sum(k/(k+1),k);
3 t6 N1 E) H' S' z- ?& _( h. l  D 0 K" l8 @6 P( v8 J
> sum(k/(k+1),k=RootOf(x^2-3));( c! l$ `& }2 C) }: v3 @

% P8 I' r, o; u) c0 W/ csum函数可计算一个公式的确定和与不确定和, 如果Maple无法计算封闭形式, 则返回未求值的结果. 值得注意的是, 在sum命令中将f和k用单引号括起来, 可避免过早求值. 这一点在某些情况下是必需的.
+ e+ z# w. e: y/ m# n> Sum('k','k'=0..n)=sum('k','k'=0..n);
& n  L5 R' V. Z, P 6 y% g8 B+ F9 n9 i
如果计算一个有限序列的值, 而不是计算一个公式, 可用add命令. 如:   
, ?' S# m, x+ T, S> add(k,k=1..100);
2 Y! a6 ^, i1 d0 _( j1 E0 w! z3 g% W ) o+ j9 p- o; Y7 E$ P
尽管sum命令常常用于计算显式求和, 但在程序设计中计算一个显式和应该使用add命令. , l; b( x9 D) e0 J/ ]4 \9 j/ v
另外, sum知道各种求和方法, 并会对各类发散的求和给出正确的结果, 如果要将求和限制为收敛求和, 就必须检查显式的收敛性.
, h9 P$ p6 _, ~/ d6 G* W+ @8 m: o; |3)三角函数/双曲函数: a5 ]5 Q9 f9 `
命令格式:   sin(x);   cos(x);   tan(x);   cot(x);   sec(x);   csc(x);  z% C, p9 ^* c
          sinh(x);  cosh(x);  tanh(x);  coth(x);  sech(x);  csch(x);- [3 w! ?. J6 V# K% D
其中, x为任意表达式. 2 P& V+ [" X1 O- X  t$ c
值得注意的是三角函数/双曲函数的参数以弧度为单位. Maple提供了利用常见三角函数/双曲函数恒等式进行化简和展开的程序, 也有将其转化为其它函数的命令convert.# e3 U( D1 Y7 b' d4 F7 D
> Sin(Pi)=sin(Pi);( D. R2 k9 h4 i7 D3 i

+ C1 f0 t$ z+ y> coth(1.9+2.1*I);
# _. ~$ D  _" d' B1 q* d2 \/ K . ~1 @/ f. r8 t4 }/ t
> expand(sin(x+y));     #展开表达式
* Z9 N0 U* R7 R: P' G 7 l  j: p, ~7 z& o- f: ^
> combine(%);        #合并表达式1 D4 ~( q( {" o4 E
" \+ T) N: X1 j
> convert(sin(7*Pi/60),'radical');& x6 u9 }: {, w8 X

& H3 Z0 }0 y' e7 s2 {> evalf(%);
1 M4 \% S2 g* `, p4 F
$ r' }9 l! \- q9 Q4 N但有趣的是, combine只对sin, cos有效, 对tan, cot竟无能为力.9 x: d9 h3 @; \: H/ t& X( M: i
4)反三角函数/反双曲函数1 ^8 z6 W9 R) {- r* ?3 T7 ^
命令格式: arcsin(x);   arccos(x);   arctan(x);   arccot(x);   arcsec(x);   arccsc(x);
5 K5 A6 v1 m5 B     arcsinh(x);  arccosh(x);  arctanh(x);  arccoth(x);  arcsech(x);  arccsch(x);   & d( G7 y! ^; Y; i2 ^; g/ Q
arctan(y,x);
, K9 V* P8 g! G1 K其中, x, y为表达式. 反三角函数/反双曲函数的参数必须按弧度计算. 8 ]; X5 E# |0 P" f" P+ u8 ^
算子记法可用于对于反三角函数和反双曲函数. 例如, sin@@(-1)求值为arcsin.  V+ }0 D, x0 E" o  \
> arcsinh(1);6 o2 C: @9 \; v0 f2 @
2 t3 x- w$ ^" q# X
> cos(arcsin(x));, {& O8 V4 \+ b9 r, W) `: F

3 p; v7 t1 _) h' a9 p> arcsin(1.9+2.1*I);
. D6 K0 B$ e5 N& X- f; M & w. u, z8 H3 k3 g0 m, m- c* g
5)对数函数
3 P; Q- F( G$ G命令格式: ln(x);           #自然对数
1 A2 [: H, f" V; g" Slog[a](x);        #一般对数
/ p( m% E' L6 n5 ]: l! Nlog10(x);        #常用对数
+ E5 d# x, k& W一般地, 在ln(x)中要求x>0. 但对于复数型表达式x, 有:   9 _# c6 S* c, h' u8 Z5 w& I" C3 k
  (其中,  )& B& t" R5 \1 V, `
> ln(2002.0);
' p+ a7 k7 B3 z5 T  V" X4 | 7 k3 R. t. h% R0 {# M. s
> ln(3+4*I);% _) S1 c# R) l1 H9 ]
) ^& x$ f, V- J9 j' Z8 F( A& d; ^
> evalc(%);    # 求出上式的实部、虚部
# B* ~# ?! A9 A  w) V . T; y8 P- X( `3 L
> log10(1000000);
% T: n& b0 |: A  v, e+ _4 }  \; y4 ]3 T 1 Y4 V5 s2 j) E" b) ^) t
> simplify(%);   #化简上式
$ l- d7 u2 F$ f/ l! T' [) X 9 f6 V$ G3 u# b0 M5 c0 Z/ ?
2.2.2 函数的定义
5 W  X7 v0 k8 @% m( g& [Maple是一个计算机代数系统, 带未知或者已知字母变量的表达式是它的基本数据形式. 一个简单的问题是, 既然表达式中可以包含未知变量, 那么它是不是函数呢?试看下面一个例子:   
$ l* |7 d& b' Y4 B- |) E> f(x):=a*x^2+b*x+c;. V( K  ?: d0 J$ @  b; c: T- m

% |4 Z' n* E: m# p8 i; Z可以看出, Maple接受了这样的赋值语句, 但f(x)是不是一个函数呢?要回答这个问题,一个简单的方法是求函数值:   
7 Q% ^+ K$ p: t, c4 ~- l> f(x),f(0),f(1/a);
. M" P1 {& r& \4 b# \+ o, ^1 s2 U
" k  t% N, ]6 K1 l由上述结果可以看出, 用赋值方法定义的f(x)是一个表达式而不是一个函数, 因为f(x)不能把所定义的“自变量”或者“参数”转换成别的变量或表达式. 但从赋值“过程”可以看出, f(x)虽然也算是一个“函数”, 但却是一个没有具体定义的函数:   % E4 S3 C( [9 `  A" _( `
> print(f);
$ d8 t2 o; ?2 c 8 a7 R6 K9 L2 ~& `; y2 P
事实上, 我们所做的赋值运算, 只不过是在函数f的记忆表(remember table)中加入了f(x)在x上的值, 当我们把自变量换作0或1/a时, f(x)的记忆表中没有对应的表项, 所以输出结果就是抽象的表达式. , c7 z* ~8 u" l. t1 v9 K  H+ h; {
在Maple中, 要真正完成一个函数的定义, 需要用算子(也称箭头操作符):   ( t* ^3 c- o8 B
> f:=x->a*x^2+b*x+c;
' ?; g+ [. r3 G4 l+ z/ L9 J& J $ d: w1 e7 |0 c
> f(x),f(0),f(1/a);3 s. d# A# A4 G
( j& c" C' _! j' m
多变量的函数也可以用同样的方法予以定义, 只不过要把所有的自变量定成一个序列, 并用一个括号“()”将它们括起来(这个括号是必须的, 因为括号运算优先于分隔符“,”). ! h/ x: E! b- R# ]5 {2 I( j0 c4 S
> f:=(x,y)->x^2+y^2;. k3 D8 T3 A. ^5 \

+ E  t+ b0 u  y+ v, L* @> f(1,2);" o8 y* }. N1 f
3 m, K3 g) z' Z" P9 Z& c
> f:=(x,y)->a*x*y*exp(x^2+y^2);" S1 r. T' x9 u

& m& s" W; ^8 T综上所述, 箭头操作符定义函数的方式一般为:   
" B7 A4 q$ O# M4 Q5 V3 k一元函数: 参数->函数表达式
4 _+ d  R# z4 L% r5 b多多函数: (参数序列)->函数表达式
, }3 Y5 B: h. n8 ?% Z/ X$ a# M无参数函数也许不好理解, 但可以用来定义常函数:   ; D$ x9 S% X4 J
> E:=()->exp(1);
$ W$ \+ v8 M& c0 N! V: n
$ }% h9 p2 d/ y; S: e2 F" e. N> E();
/ Q; U6 l! ]' U# h; i
+ ^4 S/ f6 a; N2 d: l6 q, C6 Q> E(x);  T2 S# f4 o, l* q* f- k

3 T2 f. ~$ J; `" @) j另一个定义函数的命令是unapply,其作用是从一个表达式建立一个算子或函数.
+ T' o/ m1 `% ?定义一个表达式为expr的关于x的函数f的命令格式为:  f:=unapply(expr, x);         
( v5 |. C. N' o9 B3 d9 ~定义一个表达式为expr的关于x,y,…的多元函数f的命令格式为:  f:=unapply(expr, x, y, …);     
1 M6 v; t4 i3 V- Q4 n> f:=unapply(x^4+x^3+x^2+x+1,x);3 l% v% }  t/ v1 x( w7 r

" a. _3 ~( L% z9 R4 o) h> f(4);5 S( U0 \  ~- x3 B( L

6 k. O2 z9 w# P7 |  K3 X> f:=unapply(x*y/(x^2+y^2),x,y);
8 ^# u/ l  M/ B% ?, m
8 _, m  G4 @- M( n- W8 g1 N* R- _> f(1,1);
- B- \" _* ~5 H5 |, Y + d! Y# S0 t% a* d7 a
借助函数piecewise可以生成简单分段函数:
* x" {+ X3 D3 O. N> abs(x)=piecewise(x>0,x,x=0,0,x<0,-x);8 w, w$ B6 A, j0 H# _. l3 D/ n

  y4 Y! x( h3 y9 a% ~1 h6 z清除函数的定义用命令unassign. + c3 t7 |, s: z, y2 d
> unassign(f);. Y4 w! R  y1 m9 k' ]1 Z3 X
> f(1,1);
$ s# `: r& b! }, Q9 R+ t; R' k
- f' K' U6 _" n! j除此之外, 还可以通过程序设计方式定义函数(参见第6章). 5 j9 p# ~8 M/ U) J3 D* ~
定义了一个函数后, 就可以使用op或nops指令查看有关函数中操作数的信息. nops(expr)返回操作数的个数, 函数op的主要功能是获取表达式的操作数,其命令格式为:, T6 p7 z7 T. A" L0 E! Z
op(expr);         
4 ~9 [  c7 x7 s/ Gop(i, expr);         
: ~1 v. k5 y, \0 W. Y# _op(i .. j, expr);      ; K8 y' @( Z2 m( [  ?
nops(expr);
1 c5 U1 S! }8 K' I2 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的类型. / y* Z/ q4 h) [/ ~2 y
命令op(i .. j, expr); 执行的结果是expr的第i到第j个操作数, i..j中含负整数时的情形同上.
+ i" `: P: F& h' }4 I7 f& ?# L命令op(expr); 等价于op(1..nops(expr), expr); 2 B5 @( Y5 i3 e3 v/ G
特别地, 当op函数中i为列表[a1, a2, ..., an], 则op([a1, a2, ..., an], expr); 等价于op(an, op(..., op(a2, op(a1, e))...)); 7 V9 v& ]8 n" l2 F2 c
而当expr为一般表达式时,nops(expr)命令返回的是表达式的项数, 当expr是级数时返回级数每一项的系数和指数的总和. 0 q% [9 {) N# U: I6 ^
> expr:=6+cos(x)+sin(x)*cos(x)^2;
& a5 n. C, S  ~1 Q0 n2 g$ c8 \, _1 b . ^  T, H) }9 x" o5 c
> op(expr);9 O0 d5 M$ @$ @) a
% l0 f1 M" t  @$ X4 k! D
> nops(expr);: d& P5 N3 L: y7 ]
1 j' N, d( p8 `9 J& @
> p:=x^2*y+3*x^3*z+2;+ v1 K, z6 J" _  A

* L; O! c' B, i) z/ S; s> op(1,p);
6 ]! \2 H! X, l& t
. O* l* k; a/ C/ D$ R2 t> op(1..nops(p),p);8 q) X6 F1 P4 n4 L8 w4 j# F9 S  h
! a8 Q8 @- E) M0 A3 }
> op(op(2,p));5 E5 ?  J5 j$ o/ o
" y  _' a9 f+ A7 P6 w
> u:=[1,4,9];
+ h6 q# w% M5 ~0 ?' }$ K2 g ) Y! Y" D' E+ `4 T. w
> op(0,u);2 O8 S* e  F) L

- H0 J) X2 `/ x> s:=series(sin(x),x=1,3);
8 v4 `: d$ Q$ C6 z/ E , K3 {, P* n* q% {  z) V( U
> op(0,s);" ^3 y0 X4 F0 G
        - Y/ m9 @1 X; w+ z0 M1 e4 O, s2 w
> nops(s);5 _* i0 b- A" J3 G# j
, V9 h# f9 J' r) A
下面一个有趣的例子说明了Maple在处理算术运算时的“个性”:
, H- b2 r7 c$ J> op(x*y*z);
" ?8 e$ d8 K% h+ w( a
: Y. V6 {3 A: C2 ^3 P8 v- j> op(x*y*z+1);
# q4 e" z7 v$ @; N$ A9 B
; L. l: V1 F* b) w& w& h. Y. L2.2.3 Maple中的常量与变量名
. K! D2 A) f5 X! J: P+ B9 D: i0 I  j为了解决数学问题, 一些常用的数学常数是必要的. Maple系统中已经存储了一些数学常数在表达式序列constants中:   
; |6 N' h$ M& \" v& ~> constants;
* e7 p$ v& X* c& {. r* h5 w! d4 q) P 4 C/ m: K6 K" H
为了方便使用, 现将上述常数的具体含义列示如下:   + B8 c' g: s6 k3 x" V/ L
常    数        名 称        近似值# l# M& f0 c& C4 g6 V# t
圆周率
, o' S7 N- u6 X/ T/ vPi        3.1415926535& X; R" m) \1 Z; ~
Catalan常数
! d: x9 M% o3 Z3 Q2 v! F! f% h5 ^Catalan        0.9159655942& z: Z% G: P; l! t
Euler-Mascheroni常数 8 R7 C" e1 F0 Q9 s, J  H7 d5 Q1 T1 b# L
gamma        0.5772156649. [" r1 V/ K. \8 }0 g3 G5 `, q" b

" Q! i$ D% u/ p) uinfinity       
+ Y- Q$ K( `4 y# E% v# h* d7 P" d( Y" _# o4 {. ?6 d, Z0 n. P
需要注意的是, 自然对数的底数e未作为一个常数出现, 但这个常数是存在的, 可以通过exp(1)来获取. + n, ?/ F% Y. {! G1 T2 n
在Maple中, 最简单的变量名是字符串, 变量名是由字母、数码或下划线组成的序列, 其中第一个字符必须是字母或是下划线. 名字的长度限制是499个字符. 在定义变量名时常用连接符“.”将两个字符串连接成一个名. 主要有三种形式: “名.自然数”、“名.字符串”、“名.表达式”.
; q; A* C' Z. x9 \. @* W5 V% p值得注意的是, 在Maple中是区分字母大小写的. 在使用变量、常量和函数时应记住这一点. 数学常量 用Pi表示, 而pi则仅为符号 无任何意义. 如g, G, new_term, New_Team, x13a, x13A都是不同的变量名. # U  e1 @" `) |5 m1 C; b0 u+ ^8 t
在Maple中有一些保留字不可以被用作变量名:   
7 i4 `9 v1 G2 x, }) }# s' D5 Hby      do      done     elif     else     end        fi        for      : [8 A& E8 s3 P4 G
from    if       in       local     od     option    options     proc         & `- n$ \+ ?' r: E/ S
quit    read     save     stop     then     to        while      D
5 V( f- G- G/ ^5 f" fMaple中的内部函数如sin, cos, exp, sqrt, ……等也不可以作变量名. $ H  ^5 _( ^( r0 E; U  h
另外一个值得注意的是在Maple中三种类型引号的不同作用:   : ^0 K( l& F+ B. m# e
`  `:   界定一个包含特殊字符的符号, 是为了输入特殊字符串用的;    9 [& j. C6 p+ X. X) r
'  ':   界定一个暂时不求值的表达式;    5 V( V2 ~( J" S1 S6 f
"  ":   界定一个字符串, 它不能被赋值. ( F8 e/ m! ^. _& j
2.2.4 函数类型转换           
; k4 s) f$ H1 J. B8 }函数类型转换是数学应用中一个重要问题, 譬如, 将三角函数转换成指数函数, 双曲函数转换成指数函数, 等等. 在Maple中, 实现函数类型转换的命令是convert. 命令格式:  
$ e; o& S6 a5 X* p" n. r# b    convert(expr, form);        #把数学式expr转换成form的形式
5 w; N& j  u6 C2 X0 Tconvert(expr, form, x);      #指定变量x, 此时form只适于exp、sin、cos& J, }  X9 |4 ^7 g9 J3 U, r" v' N
convert指令所提供的三角函数、指数与函数的转换共有exp等7种:   ( z) F% S- z" R9 d7 Z
(1) exp: 将三角函数转换成指数
5 Q$ D! x1 a7 R, T7 p! C(2) expln: 把数学式转换成指数与对数
( ]" @& x; a8 a* s8 y7 ~( f0 M(3) expsincos: 分别把三角函数与双曲函数转换成sin、cos与指数的形式
2 N7 L6 ]$ l+ y(4) ln: 将反三角函数转换成对数
) N3 ]5 [* c# Z(5) sincos: 将三角函数转换成sin与cos的形式, 而把双曲函数转换成sinh与cosh的形式: f" M" ~/ X/ R8 x
(6) tan: 将三角函数转换成tan的形式
! v  @' c2 W+ C1 V, ~/ ]  L(7) trig: 将指数函数转换成三角函数与对数函数
  x, }& J- ?. {; Y> convert(sinh(x),exp);   #将sinh(x)转换成exp类型, u8 ?: o6 r2 T, d

- b5 k% L  p& G4 o. }) d8 M> convert(cos(x)*sinh(y),exp);2 L" v5 c$ E3 o! `# T
: A$ x( X. P0 W3 V. |4 {- I7 {! j
> convert(cos(x)*sinh(y),exp,y);
, {- H; K, n$ N- f8 Q/ H+ T
0 e6 w! G1 n2 k5 d> convert(exp(x)*exp(x^(-2)),trig);: p1 _* a9 q' p' M3 \, F: b) j
% v1 H2 F3 [* c
> convert(arcsinh(x)*cos(x),expln);' j# X2 Q1 ?2 B5 b, c/ }
! K4 a( b  X1 o/ v! J+ }( h9 o
> convert(cot(x)+sinh(x),expsincos);
( G( E7 f7 \  Y" X' i# h
) @) \1 Q# ~/ _/ `& W  }> convert(arctanh(x),ln);- W& R+ S/ G+ a, Y, G/ x

- n" n! R7 [  n' {( d, sconvert在有理式的转换中也起着重要的作用. 在有关多项式运算的过程中, 利用秦九韶算法可以减少多项式求值的计算量. 在Maple中, 可以用函数convert将多项式转换为这种形式, 而cost则可以获取求值所需的计算量. 注意: cost命令是一个库函数, 第一次调用时需要使用with(codegen)加载. 例举如下:   
* U; j7 g  W" A# [; f$ f, c> with(codegen):& P- L) [: }. @# _
> p:=4*x^4+3*x^3+2*x^2-x;0 `; V  I+ U- L

- m( f: M5 q% s> cost(p);
3 z% s4 f8 Y. K; o+ p  I
9 t# a! C; \8 u, e: b2 U> convert(p,'horner');  #将展开的表达式转换成嵌套形式
6 K' k- d! k  X! y/ Z; l2 l6 `5 k ' I% @2 S, `0 W3 l  d& e" t
> cost(%);
2 k2 _& G) f! g0 c9 F5 Q ; {3 J9 p  I0 b! O0 `3 u$ i& P
同样, 把分式化成连分式(continued fraction)形式也可以降低求值所需的计算量.
: M8 ~$ }! ]7 i8 {; K> (1+x+x^2+x^3)/p;
3 k" X9 p- E8 Q7 I( v# C) t; z
' f& c) g- u+ |" q> cost(%);
* q# c. X' E9 Y% B, o . Y1 ~8 c! X  \1 T
> convert(%%,'confrac',x);: H' }% A# a) u  {8 _( @2 i: x

3 ^% _. ]6 b3 K* u$ ~> cost(%);' S2 X) _1 A% D2 l

' W4 u/ C. p0 ~3 B7 u; X! b在某些场合下(比如求微分、积分时), 把分式化成部分分式(partial fraction)也就是几个最简分式的和式的形式也可以简化运算, 但简化程度不及连分数形式. : G' U" ~# s# I& t/ e6 F
> convert(%%, 'parfrac',x);4 d% w4 _: @; u* f" ^
4 U/ V0 E$ o# y9 e4 B/ b+ a
> cost(%);
& K% j4 `% o, N$ O4 ^" z0 y   x0 E8 M  |4 k8 d9 E
而把分数转换成连分数的方法为:5 O; I0 }! W% M, i
> with(numtheory):0 f( A+ m  j2 O' g6 ]- c
> cfrac(339/284);
. d" U& N- L% U& }: y- i6 J 4 e& J/ n' f/ T/ b" a
2.2.5 函数的映射—map指令$ J# a  @4 Z3 ]. y0 V4 M
在符号运算的世界里, 映射指令map可以说是相当重要的一个指令, 它可以把函数或指令映射到这些结构里的元素, 而不破坏整个结构的完整性. 命令格式为:/ |4 S; e) F; F  D- y& ^; w, R
map(f, expr);      #将函数f映射到expr的每个操作数) }# l' S- J1 G4 c
map(f, expr, a);    #将函数f映射到expr的每个操作数, 并取出a为f的第2个自变量7 p9 B! i6 x2 T
map(f, expr, a1, a2,…, an); #将函数f映射到expr的每个操作数, 并取a1~an为f的第2~n+1个自变量+ @. `1 b& Y1 `3 |: R* O8 N3 ]& a
map2(f, a1, expr, a2, …, an);    #以a1为第1个自变量, expr的操作数为第2个自变量, a2为" ^, C6 g+ G8 d$ B& w3 O
第3个自变量…, an为第n+1个自变量来映射函数f  q2 }' y  k. o1 h% e0 i
> map(f,x1+x2+x3+x4,a1,a2,a3,a4);  e  Z" @: [8 M" o
7 H1 f: r9 r% @% t
> f:=x->sqrt(x)+x^2;" `, x* ^" l* s7 N

; {) p1 J  {# L7 B> map(f,[a,b,c]);& z) h4 E& ?3 b5 I/ }

: u' Y6 C. ~! q7 i5 j> map(h, [a,b,c],x,y);
. Q5 h$ s& @; i- r& m& u 3 k3 ?6 ]3 ~# ]: _! L3 d0 H2 T0 p+ p
> map(convert,[arcsinh(x/2),arccosh(x/2)],ln);
- M  C$ `: ?$ X5 S
1 V8 K# E. p, M0 t" m> map(x->convert(x,exp),[sin(x),cos(x)]);
/ Y8 @1 Z* X/ R' ~
3 Y, q% G4 M9 s- H, W3 x上式的映射关系可通过下式理解:
7 j9 M' ?1 ]# |) L1 f8 [> [convert(sin(x),exp),convert(cos(x),exp)];
& A: {& A5 O0 t9 A : ]/ K. |# y9 K; Q7 \6 e
> restart: - C3 x. C9 |) U7 u
map2(f,a1,x1+x2+x3+x4,a2,a3,a4);: Y, O/ b4 K' Q: W7 V4 r( d

- i; O: I7 o, f/ k1 P> map2(max,k,[a,b,c,d]); # G6 H2 j) ]# v' b% C8 o0 j9 ^

0 A# d" z' ~3 s1 w5 X. f  ^再看下面示例:   ( `$ g+ x: Y1 J
> L:=[seq(i,i=1..10)];
( G6 |$ O+ f, B+ L" z( A4 E
, h4 u4 q. w) F( G/ D, _> nops(L);% T* j+ C' _; ^
; f9 D1 X* Y8 _: c! o! a) k
> sqr:=(x)->x^2;
( [' `7 U/ |$ x7 a- P
: G" p: p! z+ L. p' `7 @> map(sqr,L);
* B( I3 d* }5 G/ v+ W9 O  t. U
" g3 k1 F1 c5 V7 b" ]> map((x)->x+1,L);
0 S1 {' }$ t9 Z! {/ l; o5 [
& w& X; m7 U( F! y> map(f,L);
* `7 l+ x+ Y( P3 h0 _, g / M. q" `3 D: s
> map(f,{a,b,c});$ ~0 t* b2 g+ S" {, J

5 F5 }' S5 B. Z0 \> map(sqr,x+y*z);: b& h0 k2 b. c3 a) T  H
2 L0 W7 V. e* X; Q8 S
> M:=linalg[matrix](3,3,(i,j)->i+j);
. s8 Z- s) T1 X! s) W3 J5 m5 L' @
" v* ~% k) N, y$ s( I. S> map((x)->1/x,M);
2 |3 A" N! C& B8 e% A: [2 A% x
8 A( i; O, `/ [" L3 求 值3 m% \& ~5 d" p
3.1 赋值4 R8 G. r' _; V, x! c: p1 y
在Maple中, 不需要申明变量的类型, 甚至在使用变量前不需要将它赋值, 这是Maple与其它高级程序设计语言不同的一点, 也正是Maple符号演算的魅力所在, 这个特性是由Maple与众不同的赋值方法决定的. 为了理解其赋值机制, 先看下面的例子. / \4 j& c. Y2 U: q
> p:=9*x^3-37*x^2+47*x-19;. u; e: \9 u/ T: l1 W' U6 V

, x& b! h" V( e> roots(p);7 A' O- ?# O4 ]  O
  X1 T: f4 n' |6 x2 n
> subs(x=19/9,p);
9 x% o+ u* j" `/ I: I4 C
0 y( l) s$ d4 J1 h" ^在这个例子中, 第一条语句是一个赋值语句, 它的作用是把变量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;”这样的简单语句即可验证. ' L+ w2 c8 H- D" G
3.2 变量代换9 E( r: w7 o6 y# q: n1 `% R9 i; R% \
在表达式化简中, 变量代换是一个得力工具. 我们可以利用函数subs根据自己的意愿进行变量代换, 最简单的调用这个函数的形式是这样的:   ) N% p3 S- T* C
subs ( var = repacedment, expression);3 {! g/ S1 C0 k) F. A1 E
调用的结果是将表达式expression中所有变量var出现的地方替换成 replacement. . Z& ?" w# _' U9 ]# Q7 l
> f:=x^2+exp(x^3)-8;2 ]$ c: m& o* Z# d

. A/ o  V! o# `/ }9 X  N! ~' `> subs(x=1,f);* X- B7 Z1 ], I; M/ d
4 n0 |$ v0 R8 H0 a( W3 h
> subs(x=0,cos(x)*(sin(x)+x^2+5));
2 z& |9 E4 t5 x/ Q4 u; S* | 8 A+ G$ F2 N. z' q  k: G. K/ o6 z
    由此可见, 变量替换只得到替换后的结果, 而不改变表达式的内容, 而且Maple只对替换的结果进行化简而不求值计算, 如果需要计算, 必须调用求值函数evalf. 如:   2 @; a1 W! w- y3 R6 I0 ]
> evalf(%);" ?8 r( q1 M; o. A

+ V4 H" B3 X3 r: ~变量替换函数subs也可以进行多重的变量替换, 以两重代换为例:     O3 E' e7 [+ K& b( C
subs (var1 = repacedment1, var2 = repacedment2, expression)9 l+ r9 |5 y. |% g
调用的结果和按从左到右的顺序连续两次调用是一样的, 也就是先将expression中的var1替换成replacement1, 再将其结果中的var2替换成replacement2, 把这种替换称作顺序替换;    与此相对, 还可以进行同步替换, 即同时将expression中的var1替换成replacement1, 而var2替换成replacement2. 同步替换的调用形式为:   
1 q- e1 F2 o" Q2 ?subs ( {var1 = repacedment1, var2 = repacedment2 }, expression)
3 U2 U1 S7 c2 c! ^/ H" Q7 u下面通过例子说明这几种形式的替换.
+ o8 B5 M) w7 ^> subs(x=y,y=z,x^2*y);              (顺序替换)
4 \) H# ^6 g% N1 S- r, S7 o ; k% y0 s: _' s. |0 B+ A! t1 p2 {
> subs({x=y,y=z},x^2*y);            (同步替换)0 D0 z, ^, H" r# g6 y4 X

7 ~7 E' a% U  g" H* Y> subs((a=b,b=c,c=a),a+2*b+3*c);   (顺序替换)3 p# @2 C  Q5 y' K' v
: E) h/ o& L8 }% t: E1 L' ?) W
> subs({a=b,b=c,c=a},a+2*b+3*c);    (轮  换)9 ^; z$ h5 E, u$ Z" E9 Z0 U/ w; ?

8 m) K; s! c1 f. C: x$ T- W> subs({p=q,q=p},f(p,q));             (互  换)
; ?; p" Z+ n1 }8 N! v; q# Y# F( t 5 z! _& X: ~, U8 x6 A
3.3 假设机制
4 \" {) W2 [1 t& Q, Q4 g3 A  gMaple是一种计算机代数语言, 显然, 很多人会尝试用Maple(或其他计算机代数语言)解决分析问题. 但由于分析问题与处理问题的考虑方法不同, 使得问题的解决存在某些困难. 例如考虑方程 的解. 如果k是实数, 结果显然是x=1, 但如果k是 的复根, 为了保证解x=1的正确性, 必需添加附带条件: 也就是当 时x=1. 这是一个对结果进行正确分析的例子. 然而从代数的角度考虑这个问题时就会把k当作不定元, 此时k没有值, 从方程两端去除k的多项式是合法的, 只要这个多项式不是零多项式即可(这一点是可以保证的, 因为其所有系数不全为0). 在此情况下x=1就不需要任何附加条件. 计算机代数系统经常采用这种分析的观点.
$ c/ _- y5 Y/ E0 ^) {' v1 `在Maple中, 采用分析观点解决这类带有一定附加条件的实用工具是函数assume, 其命令格式为: assume(x, prop);# @2 u& `% V4 A. f! |2 W8 Q/ z
函数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);”也不会产生矛盾.
" K6 y% I4 c; q9 {% B> Int(exp(-s*t),t=0..infinity);
1 Y6 Y6 P' q5 S" f2 i$ d' B2 Q2 z
' |. j! v) F+ r% E7 q0 ^5 Q, V> value(%);5 G* j! t  _. z: k7 n; u
Definite integration: Can't determine if the integral is convergent./ v- `6 M6 L0 S, e9 R6 V
Need to know the sign of --> s
( r: i$ D( l- I% JWill now try indefinite integration and then take limits.
/ W$ }4 l* C8 ^1 h/ L5 Q5 {* J , t1 @/ Y, E: U) `; Y0 m
> assume(s>0);
& b8 J) Z3 O/ A> Int(exp(-s*t),t=0..infinity);. s! I. g/ u8 {- y2 b
1 {* u/ a: x; x# O/ I. t
> value(%);# q1 y! F5 t) U  l8 o" }

  N. z3 \9 c% C; |) x3.4 求值规则$ g( g0 L2 K  n+ Q2 G+ Q( i
在多数情况下, Maple的求值规则设计为做用户期望的事情, 但要做到这一点很困难,因为不同的人在相同的情形下会有不同的期望. 在大多数情况下, 全局变量被完全求值, 局部变量被一层求值. 而由符号' '界定一个暂时不求值的表达式, 单步求值仅去掉引号, 不作计算, 这也是允许取消指定名字或清除变量的原因. 如下例:   6 i; F; C/ R7 m, t$ _
> x:=y;
! f( C. E0 B& E, C5 }6 \8 _
/ q* r( t: @* N! K3 a> y:=z;1 K+ V8 e# p1 p1 t+ [& n2 @6 b

, `/ _2 M- q1 C: @9 J- l- U> z:=3;
- A+ `4 D5 A9 n% U0 q   U) n$ b1 i- f" ~* q
> x;
: c# O7 K5 |7 a0 g
( Y0 F: b$ _/ [7 a, `' a9 Q6 @> y;
. Q3 s; {& P3 P, C: g 5 ^+ D( k+ r% j9 s
> x:='x';
- V8 E0 p+ t. R  q% F7 r7 }; v/ L* G " P$ F) N' N6 j
> x;) S( A* z1 E! X* t  a6 x' o

( G" P+ c' _, q' Q' ~: }; Y> y;
5 k3 l. `* P7 C0 J! o
" m! b/ @4 s( b# X) V$ T( o$ B  Z1 A* m对于不同的问题, Maple设计了不同的求值命令. 现分述如下:   " j% v- k* g; U
1) 对表达式求值
6 j, r( s# I6 h" b命令格式: eval(e, x=a);  #求表达式e在x=a处的值
. m, Z4 J! w# {1 w             eval(e, eqns); #对方程或方程组eqns求值
1 _4 h9 Y' o7 W. H1 p4 q             eval(e);      #表达式e求值到上面两层
% z2 K7 X* W  J) O. x; m             eval(x,n);    #给出求值名称的第n层求值
  R6 g3 w' L7 q/ u) j> p:=x^5+x^4+x^3+x^2+x+73;
) T6 f: @) h4 I. w
/ T# d: I! x) [* y  K" B4 H> eval(p,x=7);/ p/ W2 \, H) L% v( i- z
4 Y! A% ^; b" t0 `; F; `
> P:=exp(y)+x*y+exp(x);
4 f# u) J6 w. B" d# ~, z0 B / M) G+ {+ o& q/ I% y
> eval(P,[x=2,y=3]);+ y/ S$ T, _" d! F7 z/ Z+ h$ D

/ m8 A& I! b3 N2 ^7 ^    当表达式在异常点处求值时, eval会给一个错误消息. 如下:   
, f& g( R' a& z$ `  A1 m2 _> eval(sin(x)/x,x=0);7 o( P) o! n; G; J4 X1 o
Error, numeric exception: division by zero
) g$ a6 Y3 W; h    下面再看使用eval进行全层求值或者对名称几层求值的示例:   + S$ g0 f6 `. Q$ B& y6 ]& E
> a:=b: b:=c: c:=x+1:
' f9 J% ?3 F! D" k- u# l' N; w> a;              #默认的全层递归求值
6 u9 m+ j5 T3 j+ M
" s0 l, r- D4 h5 H4 p- L) {  F" N1 W0 T> eval(a);        #强制全层递归求值
+ E3 b3 }% P  {) {+ H! D # e6 K+ m( J+ N1 I0 B6 z7 F( k8 w- B* r
> eval(a,1);       #对a一层求值! [7 A/ r, l6 ^9 i- y

# j+ s: O: R7 Y# P. ?" ]> eval(a,2);       #对a二层求值
" ^. t# ^8 }* c# @7 J3 D4 {$ s. j4 y& @ & }' w# R' b2 D! M. V1 [
> eval(a,3);       #对a三层求值  m$ S# ?, ]5 O. @

2 L2 R* ^- c" i" U9 {9 p> eval(a,4);       #对a四层求值
6 ?9 v* w8 }+ l: L- E' Q3 X
5 D% [) [/ [9 ^( f2 X1 S    2) 在代数数(或者函数)域求值
: ^. S3 _1 d. K命令格式: evala(expr);       # 对表达式或者未求值函数求值
, U5 @, ?: ?. [: L; R* Q             evala(expr,opts);   #求值时可加选项(opts)1 Z0 q, H7 W+ g4 r" X7 c. I% \
所谓代数数(Algebraic number)就是整系数单变量多项式的根, 其范围比有理数大, 真包含于实数域, 也就是说任意实数都是整系数多项式的根(如 就不是任何整系数多项式的根). 另一方面, 代数数也不是都可以表示成为根式的, 如多项式 的根就不能表示成为根式的形式.
; i2 |! v2 W- k; _代数数的计算, 算法复杂, 而且相当费时. 在Maple中, 代数数用函数RootOf()来表示. 如 作为一个代数数, 可以表示为:   
- e9 h) a' v4 a> alpha:=RootOf(x^2-3,x);' D" o1 U& ?' v* [; c9 a% q
7 c) r/ T3 ~( r, A6 Y+ g: B
> simplify(alpha^2);
' {# U) n% \* u: c, B$ j9 _ ! A( @- }. G7 d1 h2 l* r/ Q' Q
在Maple内部, 代数数 不再表示为根式, 而在化简时, 仅仅利用到 这样的事实. 这里, Maple用到一个内部变量_Z. 再看下面一个例子,其中alias是缩写的定义函数,而参数lenstra指lenstra椭圆曲线方法:' P6 D$ B5 B/ D
> alias(alpha=RootOf(x^2-2)):- c6 D4 F; @4 m7 ?+ G' W
> evala(factor(x^2-2,alpha),lenstra);( M  m% |8 q: y) P
: n) |- ~; {% g' s; W0 H* T7 f
> evala(quo(x^2-x+3,x-alpha,x,'r')); # i$ E4 a) B- A: u+ N

  c$ S/ ?- F4 L! j' s* E> r;% v8 D- V3 m! P( T& ~: d+ D
: H! c% }% Z; P
> simplify(%);2 f3 M0 `; _7 ]% j* s; {( |/ p

8 G" d" K3 d  y" f. V- V" {( f3) 在复数域上符号求值  P+ t! X( Z, f+ Z
操纵复数型表达式并将其分离给出expr的实部和虚部的函数为evalc, 命令格式为:
2 A5 e: w9 q- z% C( ^evalc(expr);   , j+ ~+ x; E$ X( B8 D
evalc假定所有变量表示数值, 且实数变量的函数是实数类型. 其输出规范形式为: expr1+I*expr2.
) @: u4 t5 W, N; B' C> evalc(sin(6+8*I));
! W- i) }$ n( m8 G0 q( Z
1 i# k) M1 N, J) u> evalc(f(exp(alpha+x*I)));
9 m% s; Z8 w% e8 X 9 S% p2 w( Y* z2 o- [
> evalc(abs(x+y*I)=cos(u(x)+I*v(y)));$ T, B: t: N2 E$ U# C; g( A

' f  G3 |: C- z2 Y, H5 t( L+ H4) 使用浮点算法求值9 ]  G# k2 A( d+ z
浮点算法是数值计算的一种基本方法,在任何情况下均可以对表达式expr使用evalf命令计算精度为n的浮点数(n=Digits), 如果n缺省, 则取系统默认值, 命令格式为: evalf(expr, n);     
8 {, ]4 ~9 q2 `( O+ m> evalf(Pi,50);    1 z5 g5 K3 r; F, M8 z' u
' ?' p2 x/ o$ J" R4 a! j
> evalf(sin(3+4*I));   
& T' K  v4 R' t! R  v( ?2 V / o" N9 k* {$ s+ A
> evalf(int(sin(x)/x,x=0..1),20);
4 d7 {2 p* g# K% `* e
$ I) w+ i) q  P' @5) 对惰性函数求值9 e4 r/ z/ ]# C% T- v2 K
把只用表达式表示而暂不求值的函数称为惰性函数, 除了第一个字母大写外, Maple中的惰性函数和活性函数的名字是相同的. 惰性函数调用的典型用法是预防对问题的符号求值, 这样可以节省对输入进行符号处理的时间, 而value函数强制对其求值. 对任意代数表达式f求值的命令格式为: value(f);   
$ \3 h+ `; g  G0 d' I> F:=Int(exp(x),x);4 a' R& D: N) `! i" v
, L( ?8 A# U4 R+ l3 G( p: X9 J
> value(%);
( [- V9 A, A* c' ~" n# {2 R& v& g : }5 G4 O2 I' y. ]: B6 J4 |. U
> f:=Limit(sin(x)/x,x=0);
) X4 w# X  i( q4 T3 m5 Z$ O- j ( P7 Q! l" f% K5 D* M
> value(%);- z/ C$ @5 \  c! x) B# o5 |. ^
& X6 `* T4 ^2 E# w
另外, 将惰性函数的大写字母改为小写字母亦即可求值. 如下例:   
8 p! O/ V! v3 n- u: X> Limit(sin(x)/x,x=0)=limit(sin(x)/x,x=0);
# ~: m. u! g! U+ ]. ~; R: S+ p
" z9 l( S3 b; n! _4 @0 R4 数据结构
5 v4 M5 K' o) _7 dMaple中有许多内建的与FORTRAN、C或Pascal不同的数据结构. 主要的数据结构有序列(sequence)、列表(list)、集合(set)、代数数( algebraic number)、未求值或惰性函数调用、表(table)、级数(series)、串(string)、索引名(index)、关系(relation)、过程体(process)以及整数(integer)、分数(fraction)、浮点数(float)、复数(complex number)等数据结构, 而矩阵(matrix)在Maple中表示为阵列, 是一种特殊的表.
7 Y: {; f5 i4 N6 E( F4.1 数据类型查询7 w- o1 [: h8 T& a: z0 h
在Maple中, 用whattype指令来查询某个变量的数据类型或特定类型, 命令格式为: * k9 J- D5 \- K$ w5 b$ Z7 W
whattype(expr)        # 查询expr的数据类型, ]- O$ }/ J! _4 v
type(expr, t)           # 查询expr是否为t类型, 若是则返回true, 否则返回false% i" P3 W5 U# o9 Y" d+ I
> whattype(12);+ \- k  w/ q9 g. u6 `8 Q

# I0 @) z. ?/ v* N> whattype(Pi);
; u  M! J5 W+ t  K# ~! I' c
, S( J/ T( {- h! b9 @> type(1.1,fraction);
. e. S% I  O: t4 C, @' c " z6 i2 y6 d" M0 z' U2 S! _
> whattype(1.1);
6 j! N1 `! [* t/ _2 L; N0 q   l* H! \; u( [
4.2 序列, 列表和集合
5 S9 E1 r. {) B( B* N: u1 S7 x2 w4.2.1 序列
2 D# x: f6 O1 s1 q! g3 W: z所谓序列(Sequence), 就是一组用逗号隔开的表达式列. 如:   
7 v9 J* [( u% p: I" F4 P1 O> s:=1,4,9,16,25;# f" ?+ o  G& t3 l5 D" u: v
6 x# s7 J  P2 h. E
> t:=sin,com,tan,cot;8 B2 H! O% w$ t2 S3 d+ ?' w
/ Y2 r# \6 a+ C& e0 ~0 ^8 b; L/ D
一个序列也可以由若干个序列复合而成, 如:   
0 e+ K/ ?) v6 ?  |> s:=1,(4,9,16),25;1 e4 S9 ?1 L/ D; q2 B0 [; w

0 [, j6 R6 p2 \8 ^> s,s;( @" L9 y) U+ p7 v+ d
# \4 `" }+ J4 }" h# s* y
而符号NULL表示一个空序列. 序列有很多用途, 如构成列表、集合等. 事实上, 有些函数命令也是由序列构成. 例如:   : ?* U. X# M1 l5 f0 a) v
> max(s);0 J& B3 q8 B' J/ s
& h4 `1 c# ^" f7 ^4 n/ v
> min(s,0,s);. c9 t, h) `. q3 n/ s" }6 d! `7 o

  G/ `6 [- K3 _. k值得注意的是, op和nops函数命令不适用于序列, 如op(s)或nops(s)都是错误的, 如果要使用op(s)或nops(s)前应先把序列s置于列表中. # i+ U; V( u& I/ e2 B; m5 P
> s:=1, 2, abc, x^2+1, `hi world`, Pi, x -> x^2, 1/2, 1;/ H9 M3 Z7 V0 w7 z
. n9 K' b3 I5 v3 U6 D) w* Z2 c
> op(s);2 Q  Z: Q6 d' p6 M" |0 {
Error, wrong number (or type) of parameters in function op
3 Q) t% a" Y6 L6 D2 b> nops(s);
' {; T; A' d, m& @Error, wrong number (or type) of parameters in function nops
- P) V& e( u, }> op([s]);! I, D) n8 D6 f5 a0 [
. _: B1 H$ O. P6 V! J
> nops([stuff]);# l: p% y" I: \
3 I4 r9 ]) ?2 p" F1 F- S
函数seq是最有用的生成序列的命令, 通常用于写出具有一定规律的序列的通项, 命令格式为:   5 J* _" w* e- Y$ U
seq(f(i), i=m..n);  # 生成序列f(m), f(m+1), …, f(n) (m,n为任意有理数)
. o! b7 s4 ?) U. kseq(f(i), i=expr);  # 生成一个f映射expr操作数的序列! K( x) `9 ~& [
seq(f(op(i,expr)), i=1..nops(expr));  # 生成nops(expr)个元素组成的序列
8 h! a7 \" x& L1 f> seq(i^2,i=1..10);
: s7 u9 `; z+ K ( ]* t  k2 K5 ?) W8 a& C
> seq(ithprime(i),i=1..20);4 M( s8 s, t1 k
8 U+ V0 W5 x; E! W% a
> seq(i^3,i=x+y+z);
6 J0 R8 h, o( J# L7 G" S  @
, M7 X+ S8 R9 O1 w> seq(D(f),f=[sin,cos,tan,cot]);, \" q; T1 o% b6 V
9 ~  g5 b4 @! r! |. V% e
> seq(f(op(i,x1+x2+x3+x4)),i=1..nops(x1+x2+x3+x4));  c  S2 ?0 f. N/ @6 s: Z6 ~* C

4 E* A$ p% r; ~: B3 k& v  K获得一个序列中的特定元素选用操作符[  ], 如:   
, m, t* ^% e$ [  L+ N> seq(ithprime(i),i=1..20);0 |, p. N) n8 h" T5 P' |* S
- x3 j3 }! m8 i# i
> %[6],%[17];
4 S) g, R, y1 n
3 n; c, z& p6 a& Z" S$ C4.2.2 列表+ e* V% X- D& y, M% ?. J' m0 P# W/ R2 D
列表(list), 就是把对象(元素)放在一起的一种数据结构, 一般地, 用方括号[  ]表示列表. 如下例:   
6 e% s3 \9 l0 a" l$ Y/ U% }> l:=[x,1,1-z,x];( ~0 d3 t' Z" C# v5 M- B5 o1 M

# e2 }' b: F& X> whattype(%);7 i: ~. M0 l" ?- T: G6 e4 C* N

5 g$ A" d9 j7 W2 N8 F* z7 S6 n空列表定义为[ ]. . |1 W0 X% A7 }$ g% x  H1 n* s
但下述两个列表是不一样的, 因为对于列表而言, 次序是重要的:   
5 E; i( M* t: H1 r> L:=[1,2,3,4];! T7 y. q# t1 B
+ C1 n$ B5 c1 u+ U
> M:=[2,3,4,1];
% C8 @& q4 D( u8 F0 ^% R) z' S 5 M. }- y, @8 I; Y" @
4.2.3 集合
4 Z9 Y2 L9 c1 I* w集合(set)也是把对象(元素)放在一起的数据结构, 与列表不同的是集合中不可以有相同的元素(如果有, Maple也会自动将其当作同一个元素), 另外, 集合中的元素不管次序. 一般地, 用花括号表示集合. 1 a, A0 Z5 z' `6 C+ S8 c
> s:={x,1,1-z,x};7 ~+ B! y$ }3 ]4 o' [" b$ Y

; _0 K5 f% g# f> whattype(%);* m& ]6 _' g& D$ v

( X0 h  N) f: r空集定义为{ }. 5 J4 \+ G" e; [5 a6 R) g
函数nop返回列表或集合的元素数, 而op则可返回其第I个元素. . a7 S2 _# F' G' C2 A2 i
> op(1,s);- ^+ `2 Z& w$ \( |! Q

3 _5 }8 C9 z; ]/ U/ W+ Z# B> s[1];
0 g/ P( [& d2 v1 c1 j9 ?
' X" K2 [4 o$ I# ?% }9 l. c> op(1..3,s);
5 h7 e. ~! I3 @
4 e% u) u6 Y6 l! u8 ~> s[1..3];5 L  q5 s. l0 k- U* [& G
* X7 U* u1 V+ Y! [. m) ~
函数member可以判定元素是否属于一个列表或集合, 如果属于, 返回true, 否则返回false.
3 p$ B% @( u+ \' \> member(1+x,s);) b& N' ^5 Y5 y7 w

8 F! o: y9 G/ y可以通过下述方法在列表中增减元素:   " R& ]+ N3 C+ }" j  ]3 _
> t:=[op(s),x];5 |# E+ d6 U# W

4 o8 K! [2 w$ X> u:=[s[1..5],s[7..nops(s)]];
; N7 H) l" q) n2 B( @1 `& V
7 j0 q0 J9 o; x1 Q, ?) IMaple中集合的基本运算有交(intersect)、并(union)、差(minus):   
$ B$ d9 L$ y3 k, {% B> A:={seq(i^3,i=1..10)};B:={seq(i^2,i=1..10)};5 R$ L  A& {* D7 s3 a
" o7 J$ _  k2 f1 D1 E7 G
: G+ k; ]7 K) G$ Q- Y
> A intersect B;
3 {. E& _. A: l. v0 I/ y$ J
  s: c* E$ E* |* m$ ?9 f> A union B; 1 E* b" b; C9 Y9 H6 F

1 C0 K$ }0 s+ E. `> A minus B;8 ~: j  r0 a3 k& u& y

) {; J7 k5 T" Z4 {4.3 数组和表
& d4 u  y- d/ A2 ~" U在Maple中, 数组(array)由命令array产生, 其下标变量(index)可以自由指定. 下标由1开始的一维数组称为向量(vector), 二维以上的数组称为矩阵(matrix). 数组的元素按顺序排列, 任意存取一数组的元素要比列表或序列快的多. 区分一个数据结构是数组还是列表要用“type”命令.
* X+ h1 _- C2 H9 J9 U7 D* e  x' o    表(table)在建立时使用圆括号, 变量能对一个表赋值, 但一个在存取在算子中的未赋值变量会被自动地假定是表, 表的索引可以成为任意Maple表达式. 表中元素的次序不是固定的.
6 t, P+ W5 q; \( q' T! P& n> A:=array(1..4);# M! R$ M9 [% B* y! }
1 l$ R, \7 {7 x+ {, @
> for i from 1 to 4 do A[i]:=i: od:/ B- l4 }1 m1 k+ O) H
> eval(A);& t" k; M7 I* k, Z* ~# N$ @2 x( h' A6 _

9 t+ L3 F. D5 P2 F9 ^4 U> type(A,array);1 P; I  ^* I. {% M; N2 k, n" u

( u: A% r2 G/ [2 L+ b* l> type(A,list);- V/ d) U! P- O* I
7 e3 B$ p9 c3 e
> T:=table();( S+ T) Z" L( Q% [( d5 g0 D, U
9 F6 w! Y1 T& J' Z. Y* M
> T[1]:= 1;
& c2 y7 g* J3 _2 r' d# }2 q2 E
% u# s+ Y  P3 j% y, }& J- A5 M/ Y> T[5]:= 5;2 `0 M2 {; v& K1 C$ ?

) x, a6 F1 t' V, s> T[3]:= 3;, t; F  x( J% z& B; a
3 c1 P# o2 _3 V' n2 s
> T[sam]:=sally;
0 ?7 _& g- U& Q! w! T) y% |
: ]* H; }+ I: r/ f; J" s> T[Pi]:=exp(1);
0 W4 l. A8 s0 q
0 k8 C$ ?) |/ X# `; B7 P> x:='x';6 {% {5 ]0 f5 h. {
8 N  G5 x  i, q# p# W' E) J
> T[(1+x+x^3)*sin(x)] := 0;
  s& C, o7 x, h6 u3 k + n0 Y, j6 t0 X- x! `9 K
> eval(T);
0 [+ ]: K1 ]1 q" C
4 P5 q8 t) ]& t) ~  L> T[3]:='T[3]';- ?+ Z5 Y. Y6 e7 [+ O
# v3 b) a8 x1 d
> eval(T);8 N# x. a; b0 d7 D" V& ~
+ U2 p1 u; _1 U$ q, l4 j
4.4 其他数据结构
4 Z" i2 ^/ ^6 H4 S$ W串在Maple中是很重要的, 他们主要用于取名字和显示信息. 一个Maple的串可以作为变量名, 它们中的大多数是简单的、不需要加引号的串, 但是如果变量名中包含/. 例如“diff/T”则必须把变量名用引号括起来. ; J3 c2 _% h/ _. i9 g) i9 }, Y+ f
索引名是像Database[1,2,drawer]或A[3]这样的对象, 在使用索引前不需要直接建立表, 如果不得不做, Maple会自动建立表. 索引名通常被用于矩阵和向量. 为了保证Maple建立表的正确次序, 建议在赋值前直接建立.
9 ~, d& _! k; f2 G1 Q> x:=T[3];  l8 v4 D. ~1 H( ]

  p; Y# S  Q* i+ V1 \+ F> eval(T);& `! J( _$ u: y3 K2 @7 q

: @9 g# ^4 E: k9 a# {. _) Y, |3 b1 `1 o9 l> T[5]:=y;
' d, Y3 {6 I* q4 o , G0 h& ~+ x  S' O
> eval(T);
; j: E6 \. e2 N3 o( [( m+ G; M2 e 8 u& Z* Y) j) G
由此可见, Maple并不直接建立T的表, 直到给T[5]赋了值.     
/ O+ }# o3 x8 s6 v& o数值数据结构(整数、分数、有理数、浮点数、硬件浮点数和复数等)在它们的使用中是大量透明的. 浮点数是有传染性的, 这意味着如果数值结构中有一个是浮点数, 则整个结构自动转换为浮点数. 9 D) y: s. j0 G1 [0 H
4.5 数据类型转换和合并
3 x7 b8 t( {" s2 mconvert是一个功能强大的类型转换函数, 它可以实现列表和数组的类型转换:   4 o) i3 I2 a4 y
> L:=[1,2,3,4];
4 }% m8 Y! m0 }! Q/ T" {
- \1 F0 O9 v+ \- b) b- \, l> type(L,list);
$ g, L; s8 w$ b% Z* P& h
- S. k  g7 I' Y* g' F+ T/ E. ~1 q> A:=convert(L,array);8 {7 G0 m. c. R8 S
1 P/ M9 M. H4 F0 s8 w
> type(A,list);
9 Q- ?4 r5 U* V$ C
% @& V0 }5 f: a> type(A,array);1 ]& k! `6 B% @: L$ {" l
; |/ _6 p4 {& ]3 l+ e: V
另一个有用的函数zip则可把两个列表或向量合并:   * P: ?, Q7 }! U! R# e
>L:=[seq(i,i=1..10)];/ _- i2 K+ @1 O. A& P1 F" G+ ^8 \# P

8 ^3 S# {. p5 Q> Sqr:=(x)->x^2;
+ j/ T' k1 N3 g4 C9 t 8 o3 C! e5 r& \0 }( ^, B- f
> M:=map(sqr,L);. R( K, }3 i2 r, ~( D, K$ s- A# f

4 C, S$ ?7 w) F  H. A$ W> LM:=zip((x,y)->[x,y],L,M);  M4 f# I  t3 e7 r- E
; {- C3 t5 L$ Z, c
> map(op,LM);! e& s) ]5 C" v
! K4 @1 `9 S9 `& W
5 Maple高级输入与输出操作" J4 h$ O2 E; [* Q4 Y
Maple提供了良好的接口来编辑与计算数学式. 许多时候, 我们可能需要把Maple的运算结果输出到一个文件中, 或者在一个文本编辑器里先编好一个较大的Maple程序, 再将它加载到Maple的环境里. $ i$ ]  Y5 a$ y$ y
5.1 写入文件$ a7 G; G1 x+ ]3 x) J  x
5.1.1 将数值数据写入到一个文件9 i8 k* M- E- c8 D
如果Maple的计算结果是一长串的数值串行或数组, 而想把它写到一个文件时, 用writedata命令.
& z# H) N$ W  D7 B若Maple的计算结果data为集合、矩阵、列表、向量等形式时, 将其写入名为filename的文件时命令格式为: writedata("filename", data);
) S7 z  U! u. t' h  J> with(linalg):$ q  Z# p6 w& O% r
> M:=matrix(3,3,[1,2,3,4,5,6,7,8,9]);
5 R+ i8 L* F. E. W8 L6 P7 W
; j9 M4 F% E# [* E- C; d5 F> writedata("e:\\filename.txt",M);. |, y3 X+ q% i7 i4 L; ?
而将结果附加在一个已存在的文件后时,使用命令: writedata[APPEND]("filename", data);
8 a0 m$ j' C; _9 @% n9 d> W:=matrix(2,2,[1,2,3,4]);
1 p- E' Q6 ^1 T8 X& K! K8 N- p
5 O. V2 Q# U; S3 t) Q! H2 ^$ C> writedata[APPEND]("e:\\filename.txt",W);6 V. ~) p! U, H8 Z
需要注意的是, 这里的APPEND是必需的, 否则W结果将会覆盖M结果.
( M& U4 ^# D/ c! M另外, 若想将结果显示在屏幕上时, 用命令: writedata('terminal', data);9 D3 b1 l; c  }( N- C  X3 R, |* u
> writedata[APPEND]("e:\\filename.txt",W); - C7 U" g7 i9 g& s! e
> writedata('terminal',M);
- q& h- @# U0 r7 W( }. |! D" U/ `2 d1                   2                   3           0 W# ^% G- [- Q) U7 T/ z
4                   5                   6           ) P; T% I; B  @' l$ y
7                   8                   9    ! u3 z" g& D' _8 @5 y, c* r
5.1.2 将Maple语句写入一个文件
* a9 ^1 B. L" G$ Y$ C& d! w: P如果所要写入文件的是表达式、函数的定义或者是一个完整的程序, 则使用命令save, 写入一个或多个语句的命令格式分别如下:
# }, G  \3 Y+ @; X. f) k/ bsave name, "filename";
- X4 K! q" q' x* fsave name1, name2, …, "filename";$ ^; h' V6 K' }. E4 L9 L
若filename的扩展名为.m, 则Maple会以内定的格式储存, 若扩展名为.txt, 则以纯文本文件储存. 以内定的格式储存的文件作纯文本编辑器无法读取, 但在大多数情况下, 它会比纯文本文件的加载速度更快, 且文件容量小.7 \( A2 u8 M$ a& i  i" H0 u1 k
> myfunc:=(k,n)->sum(x^k/k!,x=1..n);" v) U! N, ]! e7 F) p- p$ z( q0 j
/ u. Z1 L. J* F+ B9 d7 o
> myresult:=myfunc(6,8);
! b" Y) h! p9 d9 d ( x7 ~- ^9 o" i( d4 J6 F
> save myfunc,myresult,"e:\\test.m";
( d2 p. z/ ]$ c  M/ G调用已存m文件用命令read. 试看下述实验:
+ r5 J* J. h6 X) D+ h> restart:
9 h- i3 ~6 h  r( ^- m( o3 i> myfunc(6,8);: p" |7 \' [  ?/ s. Y6 z# C% a6 c7 `

) r" p3 c( F/ _& [2 v> read "e:\\test.m";
9 Y+ u/ `! K$ Z, S5 K> myfunc(6,8);
' c, ^# \2 j3 l$ P! W' M) S; _) g
& f+ r5 R, E3 }8 T, h> myresult;$ I0 ?0 X/ I# T" N; }" `$ X# N! v% [

) |4 [! V( C1 {8 a. E  o9 L5 y5 {    而存为txt文件时则将整个语句存为一个文件:  q8 W2 n1 _% p* N4 K( w5 h
> save myfunc,myresult,"e:\\test.txt";4 Q. J7 x% z6 B' N+ @* H( z
> restart: read"e:\\test.txt";$ A6 @% n* p( q+ Y

+ A& h- @8 ^2 c
0 D0 s, F; Y6 k2 U# h5.2 读取文件
- {( \1 l+ ^- W5 b在Maple里最常用的两个读取文件的命令, 一个是读取数值数据, 另一个是是读取Maple的指令./ o! Z: J$ O: c. R, P
5.2.1 读取数值数据
; i+ Q. z6 K+ e! o如果想把大量的数据导入Maple里进行进一步的运算或者要运用大量的实验数据在Maple环境绘图时, 可以用readdata( )命令完成.
: ?- i7 b# F* v) O2 H( f从filename文件里读取n行数据时使用命令: readdata("filename",n);5 z! Q2 U' L6 C
以指定的格式读取数据时使用命令: readdata("filename",[tyep1,type2,…]);! m% j  k) D% K2 p
> readdata("e:\\filename.txt",3);
2 n0 w# r, f; g  y
* O4 I/ K% [* n# [. I    读取filename的前三列, 第一列为整数形式, 第二、三列为浮点数形式:
( W7 y( l' R  {4 X* x4 o> readdata("e:\\filename.txt",[integer,float,float]);
  A7 Z  b7 K; a) D) x8 F
/ B# m2 `/ f2 ^! o* [$ @下面再看一个运用大量的实验数据在Maple环境绘图的实验:# S9 J) `8 A3 }
> mypts:=[seq([x/1000,cos(x^2/100000)],x=1..1000)]:
& }2 d5 {% r+ o> writedata("e:\\data.txt",evalf(mypts));7 ^: F$ q5 D" f; c% m
> dots:=readdata("e:\\data.txt",100):( d) @3 K( |! t1 B8 `$ d' F% Q
> nops(dots);
% B' T& n9 p8 X ! }1 L! a# W2 H5 V" R, n3 _6 f
> dots[1..4];) g' x) D# G. e9 t/ o2 ]
* `1 s: f* E* k5 w7 {
> plot(dots,style=line);! |, u+ U* y1 e+ c! B# X
+ N: Y4 }5 V. u& a: h0 r9 i
5.2.2 读取Maple的指令4 R& H1 t: Z9 A1 y( B( Z
在编写程序时, 在普通软件中先编好程序再将其读入Maple环境中常常比直接在Maple中编写更为方便. 如果要将程序代码或Maple指令加载用read命令:1 F; Z- ?, Q- m
read "filename";/ a" K% V; m+ [3 C: w
如下例:; y4 h- G9 W& ?* o+ G; M
> reatart:; b- I7 ?+ M% n
> myfunc:=(a::list)->add(i,i=a);  M+ R# w) h6 e. X2 S# x
2 P% K& C9 S( q1 I/ q* n3 k
> avg:=(a::list)->myfunc(a)/nops(a);" c. g/ o6 Q; s& P
& D9 R( ^$ ]/ s% d6 I
> save myfunc,avg,"e:\\function.m";
+ C- F- {& m( P" b2 v> restart:' ~) l; l  q+ `. W
> read "e:\\function.m";/ \- y. O' b! U4 B# ]
> myfunc([1,2,3,4,5,6,7,8,9]);
0 C( R% h6 U8 A+ G/ D' u# E
3 z* \- e: G/ N7 S$ W> avg([1,2,3,4,5,6,7,8,9]);8 ?* _8 u' ]+ m2 u- {& X

/ H8 j0 J9 {: p: o/ c* a& M5.3 与其它程序语言的连接
' R9 D) ~+ N5 l' A4 ?% }0 M: n! U- d5.3.1 转换成FORTRAN或C语言
5 B9 T6 j% N4 E9 m! k1 P" f! [调用codegen程序包中的fortran命令可以把Maple的结果转换成FORTRAN语言:0 s# M6 Z* k/ W# w+ n7 ~0 u! t
> with(codegen,fortran):
* ~! h, j6 m5 ]f:= 1-2*x+3*x^2-2*x^3+x^4;
; x4 |% O$ P" |( }& e
0 j+ J: ?5 W9 M+ o0 x$ |% \0 H) d> fortran(%);
9 y5 S) z1 ?, b* \& Y# F      t0 = 1-2*x+3*x**2-2*x**3+x**4
- a6 u% A! u2 M9 O+ f% { > fortran(f,optimized);8 O6 P6 a% }3 f
      t2 = x**2
% }" P, b# V& S$ m4 z      t6 = t2**2( Y* x) @$ ~) s% B
      t7 = 1-2*x+3*t2-2*t2*x+t6( U8 F  }, O& P  r
> fortran(convert(f,horner,x));
0 b8 |7 h0 s% s! ?! x! G( l) c      t0 = 1+(-2+(3+(-2+x)*x)*x)*x
3 B0 z& M8 W9 r7 o  B! O- \$ G而codegen程序包中的C命令可以把Maple结果转换成C语言格式:
# j4 y, e5 T) n$ N# {9 f8 z> with(codegen,C):! h7 w: E1 w6 U+ O
f:=1-x/2+3*x^2-x^3+x^4;
+ o8 T( R- D! g, b
3 |) Z9 G& `# b$ H6 }7 r+ ^' K> C(f);- I& P- Y$ C2 O8 H2 k0 g* E/ ~
      t0 = 1.0-x/2.0+3.0*x*x-x*x*x+x*x*x*x;% r* T5 y; H$ X8 \/ D- D
> C(f,optimized);
" e! H, E+ J9 c9 ^* K+ @7 f      t2 = x*x;! R7 Y1 Z. L' {8 u6 H- Y
      t5 = t2*t2;2 ?: x, U" p5 V' E. R
      t6 = 1.0-x/2.0+3.0*t2-t2*x+t5;6 R# I: V) C- I
optimized命令表示要对转换的表达式进行优化, 如果不加此可选参数, 则直接对表达式进行一一对应的转换." S8 `, u- m) e3 a- e
5.3.2 生成LATEX
8 |  n* m1 d$ v5 [5 a/ NMaple可以把它的表达式转换成LATEX, 使用latex命令即可:
/ n4 V+ ^# ~  U/ ?% l. g* N5 v, ~> latex(x^2+y^2=z^2);: q) ]' G% W$ J
{x}^{2}+{y}^{2}={z}^{2}" |/ \) U- i* k, `6 u- e% r
    还可以将转换结果存为一个文件(LatexFile):
9 r, i8 H* N7 Q0 ^" k; D( ^> latex(x^2 + y^2 = z^2, LatexFile);6 u  u6 S& c$ @! W
    再如下例:0 K  s) a% p1 U" Q8 d) K4 {' |4 r8 |
> latex(Int(1/(x^2+1),x)=int(1/(x^2+1),x));! \( R* J0 m& ~) j* `  R1 m
\int \! \left( {x}^{2}+1 \right) ^{-1}{dx}=\arctan\left( x \right)
5 n* h# a8 ^' ~% X, Y9 j5 K  ?7 Y1 M/ O6 v; y3 ?

作者: darker50    时间: 2012-6-12 17:24
   lz这样看很累人的啊。建议换成一个文档形式的。
作者: wssl103050    时间: 2012-6-12 19:03

作者: wssl103050    时间: 2012-6-12 22:31

作者: yunbuhuiku    时间: 2012-6-14 05:22
听说女人如衣服,兄弟如手足。回想起来,我竟然七手八脚的裸奔了20年!* K  ^6 `1 m2 e! R
1 w8 e# [7 U$ E" I% b. ]3 Z
8 {$ ^, o; m6 w2 t$ c7 @

作者: wangbutian    时间: 2012-6-14 11:53
正如2楼所言,弄成一个word文档阅读起来也好些,不是吗?
作者: 边缘d无奈    时间: 2012-7-24 20:38
顶一下~~~~~~~~~~
作者: 独守一座空城    时间: 2015-9-15 15:25
lz这样看很累人的啊。建议换成一个文档形式的。
3 ~  q3 d/ v, E$ i4 ?: u0 e$ M




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5