QQ登录

只需要一步,快速开始

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

maple基础

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

1

主题

5

听众

4

积分

升级  80%

该用户从未签到

自我介绍
爱学习
跳转到指定楼层
1#
发表于 2012-6-12 16:53 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
+ D' H* B0 ]( o! N2 s$ I4 s
第一章  Maple基础/ e4 Z3 I) J" B! H) l
8 @0 o- O. ]) D& r4 X! l( k) M* J
1 初识计算机代数系统Maple  Q! B, s& ^0 F# ~' T- M, ~1 [
1.1 Maple简说
  [! [. {$ E: l! `7 X% Y6 X1980年9月, 加拿大Waterloo大学的符号计算机研究小组成立, 开始了符号计算在计算机上实现的研究项目, 数学软件Maple是这个项目的产品. 目前, 这仍是一个正在研究的项目.
- }3 j; `! g# [3 AMaple的第一个商业版本是1985年出版的. 随后几经更新, 到1992年, Windows系统下的Maple 2面世后, Maple被广泛地使用, 得到越来越多的用户. 特别是1994年, Maple 3出版后, 兴起了Maple热. 1996年初, Maple 4问世, 1998年初, Maple 5正式发行. 目前广泛流行的是Maple 7以及2002年5月面市的Maple 8.
: O+ J6 k. J' r. u0 g! J2 n( r" dMaple是一个具有强大符号运算能力、数值计算能力、图形处理能力的交互式计算机代数系统(Computer Algebra System). 它可以借助键盘和显示器代替原来的笔和纸进行各种科学计算、数学推理、猜想的证明以及智能化文字处理. ! y& _1 p' x1 B) ], {& z* k& ~3 @4 U
Maple这个超强数学工具不仅适合数学家、物理学家、工程师, 还适合化学家、生物学家和社会学家, 总之, 它适合于所有需要科学计算的人. $ k9 r/ `; {* D6 m/ _5 H( |
1.2 Maple结构; R$ m0 ^( l% p$ N1 N' x0 q
Maple软件主要由三个部分组成: 用户界面(Iris)、代数运算器(Kernel)、外部函数库(External library). 用户界面和代数运算器是用C语言写成的, 只占整个软件的一小部分, 当系统启动时, 即被装入, 主要负责输入命令和算式的初步处理、显示结果、函数图象的显示等. 代数运算器负责输入的编译、基本的代数运算(如有理数运算、初等代数运算等)以及内存的管理. Maple的大部分数学函数和过程是用Maple自身的语言写成的, 存于外部函数库中. 当一个函数被调用时, 在多数情况下, Maple会自动将该函数的过程调入内存, 一些不常用的函数才需要用户自己调入, 如线性代数包、统计包等, 这使得Maple在资源的利用上具有很大的优势, 只有最有用的东西才留驻内存, 这保证了Maple可以在较小内存的计算机上正常运行. 用户可以查看Maple的非内存函数的源程序, 也可以将自己编的函数、过程加到Maple的程序库中, 或建立自己的函数库. 2 L6 J& R' }8 A! c/ `
1.3 Maple输入输出方式* S# e3 d% ^& ^$ m  B! ~$ ]+ A
为了满足不同用户的需要, Maple可以更换输入输出格式: 从菜单“Options | Input Display和Out Display下可以选择所需的输入输出格式.
; v: O$ ?! I- SMaple 7有2种输入方式: Maple语言(Maple Notation)和标准数学记法(Standard Math Notation). Maple语言是一种结构良好、方便实用的内建高级语言, 它的语法和Pascal或C有一定程度的相似, 但有很大差别. 它支持多种数据操作命令, 如函数、序列、集合、列表、数组、表, 还包含许多数据操作命令, 如类型检验、选择、组合等. 标准数学记法就是我们常用的数学语言. ! g7 n3 r% i- V. j3 m; Q
启动Maple, 会出现新建文档中的“[>”提示符, 这是Maple中可执行块的标志, 在“>”后即可输入命令, 结束用“;”(显示输出结果)或者“:”(不显示输出结果). 但是, 值得注意的是, 并不是说Maple的每一行只能执行一句命令, 而是在一个完整的可执行块中健入回车之后, Maple会执行当前执行块中所有命令(可以是若干条命令或者是一段程序). 如果要输入的命令很长, 不能在一行输完, 可以换行输入, 此时换行命令用“shift+Enter”组合键, 而在最后一行加入结束标志“;”或“:”, 也可在非末行尾加符号“\”完成.
# B' c$ s2 o$ [# D; e3 X5 ?Maple 7有4种输出方式: Maple语言、格式化文本(Character Notation)、固定格式记法(Typeset Notation)、标准数学记法(Standard Math Notation). 通常采用标准数学记法. 2 W5 g7 A2 s& z. |0 S
Maple会认识一些输入的变量名称, 如希腊字母等. 为了使用方便, 现将希腊字母表罗列如下,输入时只需录入相应的英文,要输入大写希腊字母, 只需把英文首字母大写:   
: @# q/ W: h$ c* v
& o6 c* `5 ]; l* [
4 P, k% B' i9 d- Q. c# E7 j
8 e: i! o, e+ q; K% W% B
  |9 C2 _* Y# Y% H4 U) f. t- u
; }8 R, L) |, V* O
. [0 a- T  T9 l% F, p. ]. Y$ c( h; y# L8 }
9 d) z" B& I5 _; S" g
/ d5 |+ p+ t9 G% k0 O% \
( L1 i1 t# l- F8 t8 N3 ]! R6 }
; ^2 k; S0 j7 `. i ! ?. q9 S) m3 j0 b% R  f

! t# \1 x9 O: x
8 c4 q. _8 _! x: w) K6 K0 ~alpha        beta        gamma        delta        epsilon        zeta        eta        theta        iota        kappa        lambda        mu
9 v: W) x) Y# ~0 \" T * R# u$ m* n9 K1 H3 n4 N& [7 @
& R: M. N) J2 l6 a, ^2 e/ R
" w6 q+ }3 ?8 b( `. T
' M; F5 f5 Y% p/ R* v3 U

" L7 l+ G0 B6 O4 S ! z8 S- a3 r# ?  F3 |. z1 i0 Q
6 H- A; t# @2 g3 n
. P4 }& c, P/ q' a6 l

, R' [# }7 B; i 9 x( m) }& H: G( @# O+ A" o' W% g

! j" r" a( e/ {6 `$ G
; n% R" k1 A; i  v! s
6 k: k3 L, n" J5 Gnu        xi        omicron        pi        rho        sigma        tau        upsilon        phi        chi        psi        omega5 @3 ~2 C, n7 y* E# N. U5 ~
有时候为了美观或特殊需要,可以采用Maple中的函数或程序设计方式控制其输出方式,如下例:  I8 s2 T; s+ q( ?1 E' U4 C
> for i to 10 do 9 [  f5 t7 Z- T+ ^$ b# Y% E& g
printf("i=%+2d and i^(1/2)=%+6.3f", i, eval(sqrt(i)));; k) }0 `7 t: \9 X) D
od;' k3 v) h" ]+ K: z2 I
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
: r% H- t; b. I6 Q  ^+2d的含义是带符号的十进位整数,域宽为2. 显然,这种输出方式不是我们想要的,为了得到更美观的输出效果,在语句中加入换行控制符“\n”即可:- r) ?- s/ T5 _) O
> for i to 10 do
! [- ]. `; w! ^4 fprintf("i=%+2d and i^(1/2)=%+6.3f\n", i, eval(sqrt(i)));* p0 g, Q) h( r9 g2 h" d; w
od;
: w" l: d. M& Wi=+1 and i^(1/2)=+1.000, Y& h' O7 n6 f% W+ Z# Y0 ]
i=+2 and i^(1/2)=+1.414
/ k0 l% `# G9 V- ~: v+ Oi=+3 and i^(1/2)=+1.732
# {1 h! `" V' F7 ^# c; Hi=+4 and i^(1/2)=+2.000
) I7 S. f6 Z- `. \i=+5 and i^(1/2)=+2.236( u& k4 W+ H5 s, g/ d% y* F' P+ }1 V
i=+6 and i^(1/2)=+2.449- d6 e/ v, x5 d# G
i=+7 and i^(1/2)=+2.646
* p$ N6 \1 a& Q& `2 ?2 L0 Mi=+8 and i^(1/2)=+2.8282 w0 @1 _# G4 w) }7 @# A% o
i=+9 and i^(1/2)=+3.000
" m* _' O9 W! ~/ ki=+10 and i^(1/2)=+3.162' Z7 Q3 i! j' H" J) M( @6 F5 F& m
再看下例:将输入的两个数字用特殊形式打印:5 J% s( y) o/ N( Y
> niceP:=proc(x,y)
5 R7 |; \5 Q3 b, Z* k4 h+ J9 Tprintf("value of x=%6.4f, value of y=%6.4f",x,y);& L8 a: Q- A" x% n  O
end proc;. E4 N( k9 J8 K4 M6 w% T
+ x& j; y2 _" o1 Z
> niceP(2.4,2002.204);
& B9 z, F* K; o$ I( I2 ^+ E4 Tvalue of x=2.4000, value of y=2002.2040
$ q8 h& T$ b3 K5 o  n) |4 K" g9 x' `; P1.4 Maple联机帮助
; Q2 E/ V  A' @学会寻求联机帮助是掌握一个软件的钥匙. Maple有一个非常好的联机帮助系统, 它包含了90%以上命令的使用说明. 要了解Maple的功能可用菜单帮助“Help”, 它给出Maple内容的浏览表, 这是一种树结构的目录表, 跟有…的词条说明其后还有子目录, 点击这样的词条后子目录就会出现(也可以用Tab键和up, down选定). 可以从底栏中看到函数命令全称, 例如, 我们选graphics…, 出现该条的子目录, 从中选2D…, 再选plot就可得到作函数图象的命令plot的完整帮助信息. 一般帮助信息都有实例, 我们可以将实例中的命令部分拷贝到作业面进行计算、演示, 由此可了解该命令的作用.
* B- C; G1 q! j# x: r在使用过程中, 如果对一个命令把握不准, 可用键盘命令对某个命令进行查询. 例如, 在命令区输入命令“?plot”(或help(plot);), 然后回车将给出plot命令的帮助信息, 或者将鼠标放在选定的要查询的命令的任何位置再点击菜单中的“Help”即可.   G  |/ k3 `9 L( W: A
2  Maple的基本运算
8 O1 v1 r- U& U+ \3 P7 I2.1 数值计算问题2 \) I6 g2 \; a- b+ i/ }
算术是数学中最古老、最基础和最初等的一个分支, 它研究数的性质及其运算, 主要包括自然数、分数、小数的性质以及他们的加、减、乘、除四则运算. 在应用Maple做算术运算时, 只需将Maple当作一个“计算器”使用, 所不同的是命令结束时需加“;”或“:”.
9 s) g$ u- w1 C2 o  F在Maple中, 主要的算术运算符有“+”(加)、“–”(减)、“*”(乘)、“/”(除)以及“^”(乘方或幂,或记为**), 算术运算符与数字或字母一起组成任意表达式, 但其中“+”、“*”是最基本的运算, 其余运算均可归诸于求和或乘积形式. 算述表达式运算的次序为: 从左到右, 圆括号最先, 幂运算优先, 其次是乘除,最后是加减. 值得注意的是, “^”的表达式只能有两个操作数, 换言之,  是错误的, 而“+”或“*”的任意表达式可以有两个或者两个以上的操作数.
3 c" @$ Q' i3 h# V2 ^; r2 M) uMaple有能力精确计算任意位的整数、有理数或者实数、复数的四则运算, 以及模算术、硬件浮点数和任意精度的浮点数甚至于矩阵的计算等等. 总之, Maple可以进行任意数值计算. + @0 A% H2 w% H: E; n5 X& r
但是, 任何软件或程序毕竟只是人们进行科学研究的一种必要的辅助, 即便它有很多优点, 但也有它的局限性, 为了客观地认识数学软件、认识Maple, 下面通过两个简单例子予以说明. $ W  F, Z4 ~0 ]: K) T  G
第一个简单的数值计算实例想说明Maple数值计算的答案的正确性:   " w# |" ~2 o1 z
> 3!!!;
" \; E  `' z8 V  j* Q* l2601218943565795100204903227081043611191521875016945785727541837850835631156947382240678577958130457082619920575892247259536641565162052015873791984587740832529105244690388811884123764341191951045505346658616243271940197113909845536727278537099345629855586719369774070003700430783758997420676784016967207846280629229032107161669867260548988445514257193985499448939594496064045132362140265986193073249369770477606067680670176491669403034819961881455625195592566918830825514942947596537274845624628824234526597789737740896466553992435928786212515967483220976029505696699927284670563747137533019248313587076125412683415860129447566011455420749589952563543068288634631084965650682771552996256790845235702552186222358130016700834523443236821935793184701956510729781804354173890560727428048583995919729021726612291298420516067579036232337699453964191475175567557695392233803056825308599977441675784352815913461340394604901269542028838347101363733824484506660093348484440711931292537694657354337375724772230181534032647177531984537341478674327048457983786618703257405938924215709695994630557521063203263493209220738320923356309923267504401701760572026010829288042335606643089888710297380797578013056049576342838683057190662205291174822510536697756603029574043387983471518552602805333866357139101046336419769097397432285994219837046979109956303389604675889865795711176566670039156748153115943980043625399399731203066490601325311304719028898491856203766669164468791125249193754425845895000311561682974304641142538074897281723375955380661719801404677935614793635266265683339509760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000/ Y# P* B( r. b
上述运算结果在IBM PC机(1G, 128M)上计算只需要0.01秒, 得到如此复杂的结果(1747位), 一个自然的问题是: 答案正确吗?. ?. B  P* h6 |5 l
为了回答这个问题, 我们借助于数值分析方法, 由Stiring公式0 \( j! a" K3 I1 R! O+ j
1 a4 X2 Q9 G/ V' o
可得:  , 前三位数字与Maple输出结果相同, 且两者结果均为1747位. 另外, 在720!的计算中, 5的因子的个数为:   
1 n& A" k. U* M( A2 n! o/ v " m2 A& e5 ]% w  c
这些5与足够多的2相乘将得到178个0, 而Maple的输出结果中最后178位数为零. 由此, 可以相信Maple结果的正确性.
- P7 e, m- j4 t7 X+ _0 ^另一个例子则想说明Maple计算的局限性:   
8 u* G1 I; f  B& \% k    ~7 i1 F3 ?; f" H% y3 M; L; C- \
Maple在处理问题时, 为了避免失根, 从不求算术式的近似值, 分数则化简为既约分数. 因此, 在Maple中很容易得到:   
, M" t6 F) V+ ^* f, G
9 ?4 h* p- z, t7 d) c9 A显然这是错误的. 这一点可以从代数的角度予以分析. ! Y% r  p( D% ^+ L) e: q6 O
不妨设 , 则 , 即 , 显然 有3个结果, -2是其实数结果.
6 w# R# a+ `  A9 k另一方面, 设 , 则 , 即:  f7 i4 C. F: n5 b( r

( L. b/ k5 l$ H9 i, |, K3 e7 X显然 有6个结果, -2、2是其实数结果. 3 u( E, `! j: r& Q. u
这个简单的例子说明了Maple在数值计算方面绝对不是万能的, 其计算结果也不是完全正确的, 但是, 通过更多的实验可以发现: Maple只可能丢失部分结果, 而不会增加或很少给出完全错误的结果(如上例中Maple的浮点数结果皆为 ). 这一点提醒我们, 在利用Maple或其他任何数学软件或应用程序进行科学计算时, 必须运用相关数学基础知识校验结果的正确性. 5 |9 G7 a; R: _$ ^
尽管Maple存在缺陷(实际上, 任何一个数学软件或程序都存在缺陷), 但无数的事实说明Maple仍然不失为一个具有强大科学计算功能的计算机代数系统. 事实上, Maple同其他数学软件或程序一样只是科学计算的一个辅助工具, 数学基础才是数学科学中最重要的.
& ^- K# v2 V# p" A1 `1 A. X2.1.1 有理数运算
) Z3 [/ L- m& G# Q( _- Y作为一个符号代数系统, Maple可以绝对避免算术运算的舍入误差. 与计算器不同, Maple从来不自作主张把算术式近似成浮点数, 而只是把两个有公因数的整数的商作化简处理. 如果要求出两个整数运算的近似值时, 只需在任意一个整数后加“.”(或“.0”), 或者利用“evalf”命令把表达式转换成浮点形式, 默认浮点数位是10 (即: Digits:=10, 据此可任意改变浮点数位, 如Digits:=20). $ D8 e( a& M/ N: j" W; w9 ]. _/ C! ^
> 12!+(7*8^2)-12345/125;+ |; r) s$ M9 p& V

/ ^( F3 ~2 P0 g% r> 123456789/987654321;0 M5 l% g/ p$ u4 N# Z; T

4 s0 t* ^% \: g0 d! y> evalf(%);
. m! }) L* v& x* p. X 3 K% a8 j% [. |) I$ o1 W' z
> 10!; 100*100+1000+10+1; (100+100)*100-9;
5 _% b% ^4 d7 i; j# D # w) Z! |/ X+ A/ B

4 s; a- ~: q: ? 1 r4 H% m) g6 H% B
> big_number:=3^(3^3);! o3 J* F6 d! H" M
$ z( A" r2 E2 Y! U
> length(%);  d7 x. Z+ N9 z! g% q6 l

% i2 x0 l' _, D# o5 q* v& p* v上述实验中使用了一个变量“big_number”并用“:=”对其赋值, 与Pascal语言一样为一个变量赋值用的是“:=”. 而另一个函数“length”作用在整数上时是整数的十进制位数即数字的长度. “%”是一个非常有用的简写形式, 表示最后一次执行结果, 在本例中是上一行输出结果. 再看下面数值计算例子:   
& ^- ~+ O! D. q6 {4 W# ~    1)整数的余(irem)/商(iquo)
3 C% i4 M5 k' p命令格式:   ( ]4 E. F* `. ^
irem(m,n);        #求m除以n的余数
" h( @* C6 J2 W1 Girem(m,n,'q');    #求m除以n的余数, 并将商赋给q- D5 Y2 |  \0 q
iquo(m,n);        #求m除以n的商数
4 C" Q: |) N3 X5 d( kiquo(m,n,'r');    #求m除以n的商数, 并将余数赋给r( k! Z! ^9 D$ V* ~) _
其中, m, n是整数或整数函数, 也可以是代数值, 此时, irem保留为未求值. 3 p; k7 Z) h* U8 o; h0 d. {
> irem(2002,101,'q'); # 求2002除以101的余数, 将商赋给q" p: g; {  X( m- \
2 v5 t) {2 k  e2 j/ J* J/ r
> q; #显示q
4 ~' }) w3 f6 @6 [+ ]
1 F$ M+ r0 b6 W> iquo(2002,101,'r'); # 求2002除以101的商, 将余数赋给r
0 c( ^- ~! h: L$ k, Y( P5 y  W* D
# Q6 X8 P$ p/ U) U1 ~. p- C  R> r; #显示r0 \1 Q4 _) n% A( O1 d# m

% @' }. j- z5 }& C- Y, M: E> irem(x,3);
1 m/ i" x8 s1 V5 f' C
6 l" X) t  `" j2)素数判别(isprime)
, W) @, k8 \; Z! F/ A& U; Y" l素数判别一直是初等数论的一个难点, 也是整数分解问题的基础. Maple提供的isprime命令可以判定一个整数n是否为素数. 命令格式: isprime(n); * L9 I1 V/ D/ R) J; X  c* A
    如果判定n可分解, 则返回false, 如果返回true, 则n“很可能”是素数.
7 d( f; z5 C3 X> isprime(2^(2^4)+1);, [8 A5 J+ r5 B8 u  R5 q
5 d/ T4 m1 \0 j: }0 C& I
> isprime(2^(2^5)+1);- [. N8 a$ U9 r& Q' f! [9 b6 Z
3 ]' o2 E/ K; Y" m' ^3 K) x+ {
上述两个例子是一个有趣的数论难题。形如 的数称为Fermat数, 其中的素数称为Fermat素数, 显然, F0=3、F1=5、F2=17、F3=257、F4=65537都是素数. Fermat曾经猜想所有的Fn都是素数, 但是Euler在1732年证明了F5=641•6700417不是素数. 目前, 这仍是一个未解决的问题, 人们不知道还有没有Fermat素数, 更不知道这样的素数是否有无穷多. . j5 @7 K2 D' E9 k6 s4 o7 [7 N9 n4 z
3) 确定第i个素数(ithprime)! |: [% I, T+ I
若记第1个素数为2,判断第i个素数的命令格式: ithprime(i);    * t) H6 }* H4 O- X$ I- ^
> ithprime(2002);! l/ T& C0 p  ^% @: w$ B, D
( Q7 ~- l3 ]* l  Q2 o/ \2 E% I
> ithprime(10000);. l! R% t+ ]* R/ W5 [
3 ^! P/ w6 N; O5 e
4) 确定下一个较大(nextprime)/较小(prevprime)素数/ W! w7 f/ c& }9 n
当n为整数时,判断比n稍大或稍小的素数的命令格式为:   
7 V+ O" q8 R/ F8 t, C, W: l( xnextprime(n);  8 u+ K) i  m0 S6 W
prevprime(n);
# F6 r: R7 {8 ]- ]2 j> nextprime(2002);
! f/ @$ I/ O! d* c6 \' O/ s 1 ?; b4 }  d% g; F: x
> prevprime(2002);
# I& ^7 K1 ~8 i0 F* ` * B: Z( G; L) q% ^
5) 一组数的最大值(max)/最小值(min)! |! g; B; d' r- g7 J
命令格式: max(x1,x2,…,xn);   #求x1,x2,…,xn中的最大值
4 ]/ M3 Z/ ]" F- s% G3 r; d             min(x1,x2,…,xn);   #求x1,x2,…,xn中的最小值
! {6 E: z3 R6 S> max(1/5,ln(3),9/17,-infinity);
+ x0 ]. v4 j) d* F4 p% F* V   V3 @) `. b( P# I6 v! ^6 U
> min(x+1,x+2,y);/ g, M2 p$ M! K- j3 }! u

3 ?' v% ?7 i% P# ]6)模运算(mod/modp/mods)1 G. _3 P2 ~- h& E  }
命令格式:  e mod m;    # 表达式e对m的整数的模运算
' `; f) a+ N8 c1 O/ xmodp(e,m);  # e对正数m的模运算
! K' f1 q- r! Emods(e,m);  # e对m负对称数(即 -m)的模运算
7 E) `/ ?9 B2 i+ T6 w/ l6 J# ``mod`(e,m);  # 表达式e对m的整数的模运算, 与e mod m等价
  v2 G/ {, C  e& g( i值得注意的是, 要计算i^n mod m(其中i是一整数), 使用这种“明显的”语法是不必要的, 因为在计算模m之前, 指数要先在整数(可能导致一个非常大的整数)上计算. 更适合的是使用惰性运算符“&^”即: i &^n mod m, 此时, 指数运算将由mod运算符智能地处理. 另一方面, mod运算符的左面优先比其他运算符低, 而右面优先高于+和-, 但低于*和/. $ V5 p8 j( A( R$ a. J+ G8 T
> 2002 mod 101;
# G3 I; e( T0 f- i' f% g9 ]: s 1 h( ~, m+ ~* q
> modp(2002,101);  Y5 e$ ?) K" K) m  C, G
) \2 X' l9 [& I( o4 V
> mods(49,100);, T1 w& w: \+ M. N
) k6 r! }8 i) N3 n, q$ y3 V' r
> mods(51,100);
+ u  ?( J8 F4 W
  v; _% l: V( o9 U' Q7 D> 2^101 mod 2002;  # 同 2 &^101 mod 2002;
) e0 J( B0 Z6 c
$ E2 m8 x2 ~% M; ?+ ^7)随机数生成器(rand)
) [+ V+ s8 T7 P& x0 l+ O5 J* a$ I命令格式:   
% X0 T4 T, }: f+ B7 Grand( );    #随机返回一个12位数字的非负整数: ^! M  P& N1 l8 `
rand(a..b);  #调用rand(a..b)返回一个程序, 它在调用时生成一个在范围[a, b]内的随机数
1 |7 ?! v0 E+ l! P' U> rand();
, Z3 N; U; O2 S, X- t, g
  d: v3 T  t; f3 U> myproc:=rand(1..2002):' S# z) Z& Q$ f) n- O8 n  X/ L
> myproc();% @' S1 z8 V+ d( _( m% O
$ E4 x' y. t+ Q/ ]" q5 U
> myproc();
( m0 v( e" v' }
  X4 n1 K3 m. x' d6 j' f    注意, rand(n)是rand(0..n-1)的简写形式.
, b& H+ p8 b9 k; S2.1.2 复数运算; x9 t6 n  b* ?- @3 F+ F; Q# v: u: o
复数是Maple中的基本数据类型. 虚数单位i在Maple中用I表示. 在运算中, 数值类型转化成复数类型是自动的, 所有的算术运算符对复数类型均适用. 另外还可以用Re( )、Im( )、conjugate( )和argument( )等函数分别计算实数的实部、虚部、共轭复数和幅角主值等运算. 试作如下实验:   . H! z# S) k) L6 \$ ?# J* `" V
> complex_number:=(1+2*I)*(3+4*I);
4 i1 n+ U+ r9 E8 d" {
9 P4 @( q8 t  L9 v> Re(%);Im(%%);conjugate(%%%);argument(complex_number);7 Z( \1 c  C$ |; g, ^5 a! f; {

' p& V3 K  w3 H6 e . Z" A" V( l; M0 x/ u, I. Q) D3 G

3 `# D2 r3 J, A; P+ k & h& S" U, N9 D4 y
值得注意的是上行命令中均以“;”结束, 因此不能将命令中的2个%或3个%(最多只能用3个%)改为1个%, 因为%表示上一次输出结果, 若上行命令改为“,”结束, 则均可用1个%.
" z0 _0 J  C( [' W" o, _为了在符号表达式中进行复数运算, 可以用函数evalc( ), 函数evalc把表达式中所有的符号变量都当成实数, 也就是认为所有的复变量都写成 的形式, 其中a、b都是实变量. 另外还有一些实用命令, 分述如下:   + Y1 ~9 J1 [- r
1) 绝对值函数8 K7 l6 Z# z2 j
命令格式: abs(expr);  
' z, q3 y/ ~% T6 E当expr为实数时,返回其绝对值,当expr为复数时,返回复数的模.  b! f9 X+ f) t( J- A, N. W9 h
> abs(-2002);    #常数的绝对值
( `+ \, Q/ v+ c% k9 L! | . c3 Y8 d9 _9 p8 x! x
> abs(1+2*I);   #复数的模
) ^" ~: y/ L$ O! z+ P
) G. ?9 \' R. V4 h$ K> abs(sqrt(3)*I*u^2*v);  #复数表达式的绝对值. O; x, Q; ^  Q- ~0 W4 ]

: e* s$ B2 P4 l: M0 Z2 S> abs(2*x-5);   #函数表达式的绝对值
9 b& M/ h$ f, m7 d  ?+ I
5 ]" w, n( W# B" W9 B9 S" L2)复数的幅角函数7 \0 u, W! V5 x* s( R6 t
命令格式:   argument(x);  #返回复数x的幅角的主值* t$ s+ E; w4 S9 Y
> argument(6+11*I);
  k) D" |" R/ J * m5 i; i  X# F) w
> argument(exp(4*Pi/3*I));
5 f# O9 r- {: e& ]& m
4 ?2 M: X! t' R( n; `, Z7 O# N3)共轭复数, f/ {, v% t( z! w1 [
命令格式:   conjugate(x);  #返回x的共轭复数
, X7 h( P) ]% Q. m) p/ r$ V> conjugate(6+8*I);* X  @# c, [/ D+ X& V
- Z  v0 H/ X% L
> conjugate(exp(4*Pi/3*I));
$ _) i4 c* W" A0 K: d" o# s
! m; `7 U0 c7 L7 h" m! }2.1.3 数的进制转换% I1 h5 }* c$ F5 d- w
数的进制是数值运算中的一个重要问题. 而在Maple中数的进制转换非常容易, 使用convert命令即可. 6 ^: P" f! j5 G9 w8 k. _$ E6 N4 q
命令格式:   convert(expr, form, arg3, ...);      B" \: E. e' r1 \7 v0 d
其中, expr为任意表达式, form为一名称, arg3, ... 可选项.
' h# C5 |& H! _* }& m6 z下面对其中常用数的转换予以概述. 而convert的其它功能将在后叙章节详述.
( ^$ t; W/ Y% ]8 A4 {; d& y    1)基数之间的转换" J7 G1 B$ U6 Z: m( |
命令格式:   
, e. x( [# C* aconvert(n, base, beta);      #将基数为10的数n转换为基数为beta的数
! b) V% t+ }) J8 k/ S    convert(n, base, alpha, beta);#将基数为alpha的数字n转换为基数为beta的数" |: [  S( w. R2 W# J
> convert(2003,base,7); #将10进制数2002转换为7进制数, 结果为: (5561)7* i+ h6 C$ y! ~4 E1 n5 O
3 |0 L9 s2 c: z( s" @
> convert([1,6,5,5],base,7,10); #将7进制数5561转换为10进制数
7 }1 R9 ^3 F" s. P( G, @+ H: H. p. e 8 \1 B) i4 X# I2 N
> convert(2002,base,60);       #将十进制数2002转换为60进制数, 得33(分钟)22(秒). B- |3 [' O9 o2 T# @5 r8 ~
- }' H3 p' p7 Y+ q, o
    2)转换为二进制形式
6 B! F0 e* B" y- y, P3 u命令格式: convert(n, binary);
: l6 @# [9 O% F: ?/ J其功能是将十进制数n转换为2进制数. 值得注意的是, 数可以是正的, 也可以是负的, 或者是整数, 或者是浮点数, 是浮点数时情况较为复杂. # Y5 h8 _) P) X& T# K7 m7 d& K- u0 y
> convert(2002,binary);   
. W# u% Y9 d5 b. e ! G+ Z7 s% x+ y4 L! I+ \5 I
> convert(-1999,binary);
2 X" w1 o$ \/ C& o7 X+ X+ r
! a9 x7 a" C7 l, r9 p7 [> convert(1999.7,binary);
9 k$ u" r$ _* J( S- Y
1 }5 a6 g9 N2 h9 @; y1 U' z3)转换为十进制形式: }1 g. }" O; u8 |1 t! i( [- \- B/ F
其它数值转换为十进制的命令格式为:   
0 q+ e, m. C# Q) s: _convert(n, decimal, binary);   #将一个2进制数n转换为10进制数
; i) C' r3 l' h" O    convert(n, decimal, octal);    #将一个8进制数n转换为10进制数1 ~" V% C' X% v2 t- I1 ?4 x
    convert(string, decimal, hex);  #将一个16进制字符串string转换为10进制数3 M, e8 ~4 p, E* u
> convert(11111010010, decimal, binary);   
4 l9 T% Z1 o8 P6 V! T) a0 S
8 \. p7 F; ~, ?. x> convert(-1234, decimal, octal);           6 g, R0 d7 _: l6 [) Q) `+ Q

9 f1 _6 h% ]- e' D* S# o- [; J> convert("2A.C", decimal, hex);          3 F, P" R2 l* b

+ b) ?( I- L! [$ v, ~5 T& J; D4) 转换为16进制数& F' Z% a1 ^5 `+ C' Y7 X
将自然数n转换为16进制数的命令格式为: convert(n, hex);   
, `4 ?# d% j# A7 X8 Q/ w# d> convert(2002,hex);  convert(1999,hex);
8 j8 N; `6 @" [& Y6 v4 h , E% ~4 d+ c/ P+ \
) r) {. t" n7 n2 p; ~  g
5)转换为浮点数
2 |$ ]( B' Y6 n' D1 ^- I8 E命令格式: convert(expr, float);1 Z# |! y+ s3 D
注意, convert/float命令将任意表达式转换为精度为全局变量Digits的浮点数, 且仅是对evalf的调用. 4 @% X5 y0 B5 s3 f8 }
> convert(1999/2002,float);
9 t+ j4 a; Z* w5 i# M' `9 ?. U & k: a/ F6 }2 k* Y
> convert(Pi,float);) j1 g5 U6 n8 X

- \& |( R% ?; Z4 N. U2.2 初等数学4 M- G( k5 q7 l
    初等数学是数学的基础之一, 也是数学中最有魅力的一部分内容. 通过下面的内容我们可以领略Maple对初等数学的驾驭能力, 也可以通过这些实验对Maple产生一些感性认识.
& J- t# Y  q3 l0 \2.2.1 常用函数, S; k& x! W3 b
作为一个数学工具, 基本的数学函数是必不可少的, Maple中的数学函数很多, 现例举一二如下:   
% d: ]9 C6 V) \指数函数: exp5 g  q) u+ e7 @
一般对数: log[a]  j7 T. G. ~& G% A0 b: O. K
自然函数: ln
2 `: c& S0 j3 H3 [. V  [( l7 c常用对数: log100 U7 e9 X: \' X% ?
平方根: sqrt1 [& \, S( Y! Y7 Y; D: \  a' j; c' E
绝对值: abs' R9 d6 Y+ Y$ V, U
三角函数: sin、cos、tan、sec、csc、cot
+ [" s+ \( T3 x' F! R1 i反三角函数: arcsin、arccos、arctan、arcsec、arccsc、arccot8 ^& z% C3 O) W( u. Y
双曲函数: sinh、cosh、tanh、sech、csch、coth
0 s% F) S, C$ F' V) V% I反双曲函数: arcsinh、arccosh、arctanh、arcsech、arccsch、arccoth
: E. ?* R6 K  z7 C; y贝赛尔函数: BesselI、BesselJ、BesselK、BesselY
1 D) L; `/ [$ P1 f5 t0 L  d# Y8 YGamma函数: GAMMA2 O4 U7 q* b8 b' o
误差函数: erf  c" W5 o4 R4 T+ q% D0 A2 _( @3 _" H
函数是数学研究与应用的基础之一, 现通过一些实验说明Maple中的函数的用法及功能.   h: n8 O, c& y
1) 确定乘积和不确定乘积
1 r9 J7 H7 v, Q- |, J* E9 I! K命令格式: product(f,k);  4 z* A+ H% O+ N/ u+ h9 H
product(f,k=m..n);  + ?# {& W, {9 ]0 c0 ^' S! r" B
product(f,k=alpha);   Q8 m. H0 D5 X8 q7 X# l' F4 x6 U
product(f,k=expr);- v: P' O% u1 c$ H0 f
其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—包含k的任意表达式.
. n- m$ o4 m9 {7 P% M- V$ G> product(k^2,k=1..10);   #计算 关于1..10的连乘
+ c8 c7 w$ h# V5 Z
  B  ]# K* }! t, c> product(k^2,k);         #计算 的不确定乘积* }& H# W6 G: K7 [% w) Q' f
; @$ E4 @3 E0 a; q
> product(a[k],k=0..5);    #计算ai(i=0..5)的连乘
& L( O6 l  e6 S3 A( Y
$ j% G  S. |6 ?> product(a[k],k=0..n);    #计算ai(i=0..n)的连乘! Z  W- _% R3 X( W9 w$ f" V& u, o, E3 d

8 O. Y- b3 P- ^: A* |8 Y% {> Product(n+k,k=0..m)=product(n+k,k=0..m);   #计算(n+k)的连乘, 并写出其惰性表达式
6 a& a, E; L: W5 c* j1 ^2 b
7 K( R/ j% f: X" N8 C> product(k,k=RootOf(x^3-2));     #计算 的三个根的乘积3 J- }: g  X( O6 E
8 F$ E2 }, a: }+ K9 V4 v: @
    product命令计算符号乘积, 常常用来计算一个公式的确实或不确实的乘积. 如果这个公式不能求值计算, Maple返回 函数. 典型的例子是:   
+ w; b/ _( M+ n2 K5 v2 d> product(x+k,k=0..n-1);! D# V" i. g6 @  K: P" }
. T) t$ \7 c- v" T
如果求一个有限序列值的乘积而不是计算一个公式, 则用mul命令. 如:   6 S2 v. B7 \  i
> mul(x+k,k=0..3);
8 A& L# s' B& h9 o& V# R! L
" w. {: r5 E3 D8 k2 F2)指数函数
$ y3 L) O  H8 T计算指数函数exp关于x的表达式的命令格式为: exp(x);
- J/ _7 d3 x) l) G> exp(1);
) w. P7 U  a9 k ! ^/ ], m9 f/ z
> evalf(%);2 Q* V* F% X& I. ?. A9 q
! N, g; A* j* y3 ^. N6 M8 t
> exp(1.29+2*I);
! w+ q) q7 f5 [1 G
" a4 C! g7 e+ w" ^5 W> evalc(exp(x+I*y));
( B9 z1 y0 C9 c' Y- r6 Q  _& ]
! [# Z+ D. C# W6 T7 F! A3)确定求和与不确定求和sum
4 F3 R/ Q: ]8 z7 @( H( O) e命令格式: sum(f,k);    o) c: ]3 [' W. V
sum(f,k=m..n);  5 N! X' G4 G1 [
sum(f,k=alpha);
! N6 G7 Y0 S5 E  x9 a4 m: Nsum(f,k=expr);6 ]! k* N8 a' m' x; c) w2 `
其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—不含k的表达式.
4 l9 X+ {  N  w( y- h9 H, c  h> Sum(k^2,k=1..n)=sum(k^2,k=1..n);/ W: w% w* `* z- e6 ^' q
, I- l! l8 F7 V+ E; m8 H$ o5 p
> Sum(k^3,k=1..n)=sum(k^3,k=1..n);3 Y3 S) E% C% p9 a  p
5 ~( E# O, f4 c/ d
> Sum(k^4,k=1..n)=sum(k^4,k=1..n);
3 W. {/ D# w- q+ p - f* F! r6 @$ H- l; z6 e5 d
> Sum(1/k!,k=0..infinity)=sum(1/k!,k=0..infinity);
. {, u# t9 z8 u: t + V& T: f7 N' T
> sum(a[k]*x[k],k=0..n);
) b( ]- I& d% ~) u" z9 r+ t' f1 `2 i + ?+ l8 l" R! j* P; R" }
> Sum(k/(k+1),k)=sum(k/(k+1),k);/ M! C# A9 V- N" {& v/ i

- T6 W$ n* d3 _0 G> sum(k/(k+1),k=RootOf(x^2-3));* C* ~% b/ I" M. L4 N2 d3 J. k8 u

# z9 p$ m2 V. [  ?sum函数可计算一个公式的确定和与不确定和, 如果Maple无法计算封闭形式, 则返回未求值的结果. 值得注意的是, 在sum命令中将f和k用单引号括起来, 可避免过早求值. 这一点在某些情况下是必需的.
# y5 W) ]/ L1 w  d* I- g1 }3 U> Sum('k','k'=0..n)=sum('k','k'=0..n);
0 \+ b* n+ N  l' J1 H5 w. @1 L. P ) V; r# d" k6 ?8 _9 Q' M5 U
如果计算一个有限序列的值, 而不是计算一个公式, 可用add命令. 如:   
3 M$ j6 B6 B! {% L> add(k,k=1..100);
% s8 [; q; i! \
2 ], m/ m8 k4 W' \- G% \& b尽管sum命令常常用于计算显式求和, 但在程序设计中计算一个显式和应该使用add命令.
7 ~6 `6 R* r9 A$ G4 I; w另外, sum知道各种求和方法, 并会对各类发散的求和给出正确的结果, 如果要将求和限制为收敛求和, 就必须检查显式的收敛性.
2 W; e9 m0 Q; ]9 N3 v2 L3)三角函数/双曲函数2 n# T* t9 E2 Y8 Z; V1 D
命令格式:   sin(x);   cos(x);   tan(x);   cot(x);   sec(x);   csc(x);0 C  D2 l7 w/ B2 O! p- D7 w( U
          sinh(x);  cosh(x);  tanh(x);  coth(x);  sech(x);  csch(x);3 B  v- M# u/ ]7 Q" ~! q" \* S
其中, x为任意表达式.
1 B! Z1 D. }+ _- T9 L* T4 |( h值得注意的是三角函数/双曲函数的参数以弧度为单位. Maple提供了利用常见三角函数/双曲函数恒等式进行化简和展开的程序, 也有将其转化为其它函数的命令convert.# c% V% v2 V& ^$ |
> Sin(Pi)=sin(Pi);
* J. K7 @! q- N+ X/ m6 l4 ~ 1 @" c* G3 e) l
> coth(1.9+2.1*I);
. b. b1 u, o6 K7 w5 `/ z4 }
! Y) D; S: }. o7 }5 R> expand(sin(x+y));     #展开表达式, W5 O7 P/ Y% K

# ~" H3 v4 O8 S8 M/ F$ ~# |  x> combine(%);        #合并表达式9 r! ~% I  |" t/ v, I1 p! ~

: m* t% L# C$ l1 R' A0 T7 R> convert(sin(7*Pi/60),'radical');
- X! P  ~9 i, x& l# w, j3 K 7 x% A; t6 h7 x/ b
> evalf(%);
* N* v. K: Z; X' [1 b1 d+ D3 R
) T* c6 O; j9 N3 u& q但有趣的是, combine只对sin, cos有效, 对tan, cot竟无能为力./ D- \3 J, b  z+ U* v
4)反三角函数/反双曲函数
0 e5 ]6 q2 t8 m" s命令格式: arcsin(x);   arccos(x);   arctan(x);   arccot(x);   arcsec(x);   arccsc(x);
7 G% z, d4 p2 X     arcsinh(x);  arccosh(x);  arctanh(x);  arccoth(x);  arcsech(x);  arccsch(x);   4 i( @" |6 ^' W
arctan(y,x);+ j5 H) [) h* L0 Z, j6 N
其中, x, y为表达式. 反三角函数/反双曲函数的参数必须按弧度计算.
5 F) X  b0 y; I算子记法可用于对于反三角函数和反双曲函数. 例如, sin@@(-1)求值为arcsin.
' g! J$ e  V( _+ ?$ N> arcsinh(1);, [- A) c- R( E& C+ q! {) {8 S) @

! Z. w. y  q. R> cos(arcsin(x));- _  c5 ?9 b' z2 I0 q1 U/ ?7 B

, `$ r1 ]: q* q* _" g> arcsin(1.9+2.1*I);
* W2 [* r* O' J( \* n. }$ U) F
. M* x2 Z# v, o, k) g5)对数函数
' h0 G; x9 e1 N8 v) A' l! Q" V命令格式: ln(x);           #自然对数# ?' m& O2 f- m/ N
log[a](x);        #一般对数
. h6 U9 c, q# u' U7 Llog10(x);        #常用对数% i9 |9 [3 _/ V% T) H& s
一般地, 在ln(x)中要求x>0. 但对于复数型表达式x, 有:   ( M" w/ k% n5 z" Q
  (其中,  )* ?2 z( I4 j* Z! N( y
> ln(2002.0);- s" y# |2 D( Z! A. [; S& c, D

0 B  ]" U4 j# g2 ]& l* ~% W> ln(3+4*I);
# a! h2 w) e" v; o/ F3 M6 i
. H* Y, ]$ ?' l' E& [& ^> evalc(%);    # 求出上式的实部、虚部
6 n/ D. B& h7 u% P% P8 K : x, {8 }7 ?3 Q8 G2 Q. k, B8 p4 {
> log10(1000000);: u4 y) O7 T( x, ?
; Z! `2 {  b0 D. t9 j
> simplify(%);   #化简上式1 j3 i, U4 n2 Q* f, h
0 E3 l% d) {" }5 f
2.2.2 函数的定义
  i4 ~5 T' v) U( [) U# [% @Maple是一个计算机代数系统, 带未知或者已知字母变量的表达式是它的基本数据形式. 一个简单的问题是, 既然表达式中可以包含未知变量, 那么它是不是函数呢?试看下面一个例子:   ; ?1 ]3 O7 g4 \4 L2 e$ ^+ z
> f(x):=a*x^2+b*x+c;
1 c1 F$ e( F  p4 ]$ |   I' W2 ]! N. x: ^# ?0 {
可以看出, Maple接受了这样的赋值语句, 但f(x)是不是一个函数呢?要回答这个问题,一个简单的方法是求函数值:   
# `5 s, p) F; t" }/ }) F5 j> f(x),f(0),f(1/a);  M, J4 [, A5 _6 V+ I, B

# q0 }2 B; o( F1 D, i由上述结果可以看出, 用赋值方法定义的f(x)是一个表达式而不是一个函数, 因为f(x)不能把所定义的“自变量”或者“参数”转换成别的变量或表达式. 但从赋值“过程”可以看出, f(x)虽然也算是一个“函数”, 但却是一个没有具体定义的函数:   3 L2 B: B( r, W, X, j! d
> print(f);
. W4 z3 _* }1 i2 ?+ q6 u
. g2 R  {4 N/ i; z5 a事实上, 我们所做的赋值运算, 只不过是在函数f的记忆表(remember table)中加入了f(x)在x上的值, 当我们把自变量换作0或1/a时, f(x)的记忆表中没有对应的表项, 所以输出结果就是抽象的表达式.
1 e. g5 t- z4 b在Maple中, 要真正完成一个函数的定义, 需要用算子(也称箭头操作符):   
6 Q: z, [9 C* {' z) B" K> f:=x->a*x^2+b*x+c;3 R: Y6 n( Y( J' f& c

. I: |1 e" i. }) \- f% ^+ Y> f(x),f(0),f(1/a);: M2 l- N& d' B- M  D
2 A# A; G( O/ X' Z  @
多变量的函数也可以用同样的方法予以定义, 只不过要把所有的自变量定成一个序列, 并用一个括号“()”将它们括起来(这个括号是必须的, 因为括号运算优先于分隔符“,”).
; S& o* f3 V+ E+ [> f:=(x,y)->x^2+y^2;
  [% j5 ^. L4 v5 l) Z) ]/ l 9 S( {; z& v/ i* w) ?3 O- t
> f(1,2);8 d% U7 Z7 k# ?4 d9 H
0 \1 Y% k) I* ]4 T) }6 {. `4 Y
> f:=(x,y)->a*x*y*exp(x^2+y^2);
$ }" X7 M0 E# L- z  _9 X& n' f & G' q7 i: f# G8 k0 a# w; ~6 w& C
综上所述, 箭头操作符定义函数的方式一般为:   9 _/ X  ^: S; o$ x
一元函数: 参数->函数表达式
3 D/ i7 a+ q* W- d: a多多函数: (参数序列)->函数表达式0 U' j, t/ M  [( k- S  S8 M
无参数函数也许不好理解, 但可以用来定义常函数:   6 j8 q# g. C3 |8 p) t$ N" q
> E:=()->exp(1);( u% e5 u4 E! Y% Q

# B  ~5 T6 }+ p; @6 C6 H* t' Y> E();& g. _& S" B8 u% \1 R8 W

9 O# K4 q: x6 ~> E(x);: l( N6 Z$ |; o% l* g6 F8 W$ J
9 e; r: D3 D7 i9 j. [$ x! F! u
另一个定义函数的命令是unapply,其作用是从一个表达式建立一个算子或函数.
! V% O# C1 z1 d4 k* j1 r: |$ G定义一个表达式为expr的关于x的函数f的命令格式为:  f:=unapply(expr, x);         
* L) `' H9 r5 s) ~6 T( j7 @定义一个表达式为expr的关于x,y,…的多元函数f的命令格式为:  f:=unapply(expr, x, y, …);     + E% d8 Q% J" y# H7 ^5 C
> f:=unapply(x^4+x^3+x^2+x+1,x);+ ^+ n5 h1 J; k% P/ i5 ^" b" [9 ?0 q
% P( ~) U  C% [; {
> f(4);7 n+ @  y3 I! G9 I1 f" M: I3 c
  M. a, a  K, l1 f4 `" J
> f:=unapply(x*y/(x^2+y^2),x,y);5 n0 R: u7 }- t9 C- K
% x  @' n& k" j; t
> f(1,1);
/ N. h$ v0 @; A3 ~: O; T - M* [4 q& t6 {7 r! W4 w# n
借助函数piecewise可以生成简单分段函数:
' ?0 j2 O# n% ^, c8 T> abs(x)=piecewise(x>0,x,x=0,0,x<0,-x);- T! f% p) ^! \2 ^1 V# e

5 y! B. X' ]$ n% V0 k/ b: b2 S9 b清除函数的定义用命令unassign. , K# D9 ~' ^( n, V, h, u* V0 t
> unassign(f);
: K/ s1 o7 R: _* |* m  ]> f(1,1);) n( Y/ ~7 y: c: f

$ Z( P# L& V: T8 }" x" L6 A( [除此之外, 还可以通过程序设计方式定义函数(参见第6章).
  y* n# H( j2 l; y定义了一个函数后, 就可以使用op或nops指令查看有关函数中操作数的信息. nops(expr)返回操作数的个数, 函数op的主要功能是获取表达式的操作数,其命令格式为:
0 Y$ k* A4 q& J0 R# ?+ a! ~op(expr);         
( [: ?4 `+ y4 }8 O6 X7 d. jop(i, expr);         
& t* C4 \2 A9 g. f7 rop(i .. j, expr);      2 k5 o" k; `0 t8 {
nops(expr);
$ V: {4 ]2 G" S6 |# _如果函数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的类型. ; S) L) T1 r, X0 L
命令op(i .. j, expr); 执行的结果是expr的第i到第j个操作数, i..j中含负整数时的情形同上.( H( v( D" Q/ _8 v: q' W
命令op(expr); 等价于op(1..nops(expr), expr);
( H9 x, j- ?0 O4 F" [特别地, 当op函数中i为列表[a1, a2, ..., an], 则op([a1, a2, ..., an], expr); 等价于op(an, op(..., op(a2, op(a1, e))...));
& x2 ?1 F3 {5 z" ^0 V$ H) d而当expr为一般表达式时,nops(expr)命令返回的是表达式的项数, 当expr是级数时返回级数每一项的系数和指数的总和.
1 n& \/ }+ U6 B! C9 i; w> expr:=6+cos(x)+sin(x)*cos(x)^2;+ O+ c+ f! K8 {) ~9 Q

# T' y; [3 j  }; U> op(expr);
$ L" r! A; Q% o7 z3 T % D+ D) k" L8 \. t- G" J. d5 O
> nops(expr);) O! m! C$ f" b; E$ Y# I. ?
9 m9 m* C6 p) c. L' s9 J& D
> p:=x^2*y+3*x^3*z+2;9 [- r( I% f8 M6 K1 L& n
& q# X3 Y  u6 o3 u- d4 a% e
> op(1,p);
+ x. ?: ~  S6 L1 W, p , R! B5 \- F* V- w9 K9 O/ `+ q: i
> op(1..nops(p),p);
. Y/ K7 ~3 m- m0 |
( a) w* i1 n: l9 X> op(op(2,p));$ z& @$ C# u+ [

5 V: N# c' y( s* q7 Z$ t9 R> u:=[1,4,9];
3 V8 K( j+ |% X8 \, a- d
6 }3 Y) s1 J- J. S> op(0,u);' j! f+ V; ?6 D' q6 P1 [) y

! \' t( @* A4 H1 G$ f9 k+ O> s:=series(sin(x),x=1,3);
, h( L7 p" p. i5 f! t! D8 h 8 u9 M+ ^7 P- e' ^. P
> op(0,s);
! U, Z0 x2 u; S         0 i$ z  K: E2 u: f; C1 }- K& S
> nops(s);5 M5 g& B  C0 C/ k3 a  T
7 ]5 X4 y+ {5 ^9 Z% O% j% k1 _# ^+ L/ c$ X
下面一个有趣的例子说明了Maple在处理算术运算时的“个性”:6 N) r2 z1 _3 r- K. e6 @
> op(x*y*z);1 Q0 ?. n* f' ?9 {/ v4 x$ n

: U% e: V; q- o' x. T> op(x*y*z+1);1 T# Q- B5 m) t$ E* r6 [. L  K5 d
& F1 z( c' b* h! m: y
2.2.3 Maple中的常量与变量名
# f, F6 o- W+ F2 u% d为了解决数学问题, 一些常用的数学常数是必要的. Maple系统中已经存储了一些数学常数在表达式序列constants中:   
& z7 J8 k  m  I3 m. C0 t> constants;* b) f# Q( y/ H3 P. v! m
- I5 C3 g; U) S# x0 Z$ C8 [! Y
为了方便使用, 现将上述常数的具体含义列示如下:   $ [; J. i; ]+ [0 y- s5 Q+ T1 x( |9 }' W
常    数        名 称        近似值4 G' e+ |) |1 \; w: r* _( [
圆周率 , d1 s( J8 Z; b2 K) U
Pi        3.1415926535
9 }1 e! _1 ?4 x6 J0 tCatalan常数
7 f+ H9 U9 m( z1 P( NCatalan        0.9159655942
# w" h/ |/ ?+ F8 C- X* h" N; @6 }Euler-Mascheroni常数
1 G8 a  d# s! a: Q/ f6 B( igamma        0.5772156649
: G8 ^9 l3 h7 X1 W. T% P 5 `6 T- \- r6 }( Q& D! ~7 C0 L  b7 G
infinity        0 S" y2 v9 i  p4 O1 @& {
. q- C* S! [9 n# b
需要注意的是, 自然对数的底数e未作为一个常数出现, 但这个常数是存在的, 可以通过exp(1)来获取.
' ^" k* u8 O- @9 w2 g* ^在Maple中, 最简单的变量名是字符串, 变量名是由字母、数码或下划线组成的序列, 其中第一个字符必须是字母或是下划线. 名字的长度限制是499个字符. 在定义变量名时常用连接符“.”将两个字符串连接成一个名. 主要有三种形式: “名.自然数”、“名.字符串”、“名.表达式”.
* j: n6 B: ~; i/ W: U2 |' X值得注意的是, 在Maple中是区分字母大小写的. 在使用变量、常量和函数时应记住这一点. 数学常量 用Pi表示, 而pi则仅为符号 无任何意义. 如g, G, new_term, New_Team, x13a, x13A都是不同的变量名. 9 i8 r  g7 z5 [0 t
在Maple中有一些保留字不可以被用作变量名:   
7 e, ]- H9 I5 _by      do      done     elif     else     end        fi        for      
5 Y2 c! H; }$ l7 ]from    if       in       local     od     option    options     proc         " Y7 _5 f! {2 n! r
quit    read     save     stop     then     to        while      D
! ^" C  Z$ c/ IMaple中的内部函数如sin, cos, exp, sqrt, ……等也不可以作变量名.
" s" s7 p3 D+ Z4 b) v1 G3 Z1 G另外一个值得注意的是在Maple中三种类型引号的不同作用:   - p4 F( x/ a* W9 ?. ~
`  `:   界定一个包含特殊字符的符号, 是为了输入特殊字符串用的;    $ k# a' h( u. O2 e  ?  u; @; X8 k  `
'  ':   界定一个暂时不求值的表达式;   
" _) ~5 T8 B) f"  ":   界定一个字符串, 它不能被赋值.
0 {9 @+ B9 O4 \+ M2.2.4 函数类型转换           ' ^3 f- d- \% {; l5 X5 P- `
函数类型转换是数学应用中一个重要问题, 譬如, 将三角函数转换成指数函数, 双曲函数转换成指数函数, 等等. 在Maple中, 实现函数类型转换的命令是convert. 命令格式:  
# {0 ^" T0 o9 V    convert(expr, form);        #把数学式expr转换成form的形式' d; @* R" S; ~7 S2 _( f! r+ N
convert(expr, form, x);      #指定变量x, 此时form只适于exp、sin、cos# _! m  I  t2 O1 v3 t
convert指令所提供的三角函数、指数与函数的转换共有exp等7种:   
, @% N+ _# m# j6 u2 ^(1) exp: 将三角函数转换成指数8 a& W( K1 L, K: y, M) a2 M1 R1 r
(2) expln: 把数学式转换成指数与对数
0 M5 ?$ j1 l2 v$ @  F9 i! z' A# x(3) expsincos: 分别把三角函数与双曲函数转换成sin、cos与指数的形式
3 w- u5 \  x6 N(4) ln: 将反三角函数转换成对数
) c4 _: g1 z9 h# e+ ]& z! w(5) sincos: 将三角函数转换成sin与cos的形式, 而把双曲函数转换成sinh与cosh的形式
5 K2 p5 Y# T" z& @7 K" t(6) tan: 将三角函数转换成tan的形式
- I# T3 Q' j2 d, j5 P7 z0 D: a& [(7) trig: 将指数函数转换成三角函数与对数函数5 \6 x, A9 u' {9 m
> convert(sinh(x),exp);   #将sinh(x)转换成exp类型; r0 @/ J, L  x! S! Z/ [/ e8 I* o. H9 K

1 x( W6 E( q' U$ F# F3 i> convert(cos(x)*sinh(y),exp);
: a$ T6 F" L# I4 w+ w* A0 S   N2 d" \$ S/ ~9 G0 H$ i+ a4 L
> convert(cos(x)*sinh(y),exp,y);
7 {( ^* U2 S' y7 }
3 t" P1 c* c4 N9 m> convert(exp(x)*exp(x^(-2)),trig);* p: M& Y- s" h% _; I
3 e  I0 O& z9 N* U& G1 Q$ c: K- `7 O
> convert(arcsinh(x)*cos(x),expln);: E6 q( R/ R: H4 l7 L
7 {& F+ e$ C2 g3 u
> convert(cot(x)+sinh(x),expsincos);
- N, ?; q& ~8 Q$ @, ~, a 5 {3 Z1 C+ e/ b. H6 D
> convert(arctanh(x),ln);
1 Q6 R  _8 p4 s" o1 ]5 K 5 \& P8 Q& u% I8 R7 m3 m
convert在有理式的转换中也起着重要的作用. 在有关多项式运算的过程中, 利用秦九韶算法可以减少多项式求值的计算量. 在Maple中, 可以用函数convert将多项式转换为这种形式, 而cost则可以获取求值所需的计算量. 注意: cost命令是一个库函数, 第一次调用时需要使用with(codegen)加载. 例举如下:   
. Y) N1 w- q9 v> with(codegen):6 u* p5 l1 ^; j& f
> p:=4*x^4+3*x^3+2*x^2-x;
- r/ ^: l& s' [% w. @& e0 h/ a
8 m3 E- D5 v+ v$ h> cost(p);
+ C% z7 E& y$ M7 T
8 Q6 p: K7 x( F7 A1 X) e: u% {9 R> convert(p,'horner');  #将展开的表达式转换成嵌套形式2 R( y& k6 P2 S; ^( `- r8 p7 i5 V
5 L/ ~9 r6 j/ ^- W
> cost(%);/ s% g# q* i; l+ X

  u# U8 Z/ e+ q& ^# q6 J; x同样, 把分式化成连分式(continued fraction)形式也可以降低求值所需的计算量.
: I. G. ]4 _2 g( i& q: E6 @> (1+x+x^2+x^3)/p;
; k$ J# K0 n9 r2 ]; S
' g" @7 A1 \: U2 A2 H2 p$ X" B> cost(%);
' z" L/ _' `; P: w 6 D; p, Y7 T2 c3 m* W+ R) ?
> convert(%%,'confrac',x);, H# z1 }9 S( R
0 y( _, D( e3 |3 D2 m- o, }
> cost(%);8 g" J5 f" J2 I% T/ H( F
2 ]1 u* ]& c3 M2 a$ L& X8 R
在某些场合下(比如求微分、积分时), 把分式化成部分分式(partial fraction)也就是几个最简分式的和式的形式也可以简化运算, 但简化程度不及连分数形式.
/ W3 ~2 g2 Z$ k% p> convert(%%, 'parfrac',x);# t, j# W& ]# ~% c
% Q, [) d  `+ k+ M- f( m
> cost(%);
$ @9 q. [& j3 H- C, w; Q 3 j% m. J: x& n& J, n" S. B/ m
而把分数转换成连分数的方法为:* T3 Y* L: j- b
> with(numtheory):
: C; o, c& q. q6 B& v> cfrac(339/284);
- I0 D+ w7 T7 Y: c% }! K
% b1 \. z0 G6 `2.2.5 函数的映射—map指令
( G& L" T1 V# B1 g在符号运算的世界里, 映射指令map可以说是相当重要的一个指令, 它可以把函数或指令映射到这些结构里的元素, 而不破坏整个结构的完整性. 命令格式为:. O  f  e6 B2 {8 h) s7 m6 j5 W
map(f, expr);      #将函数f映射到expr的每个操作数
5 z0 o4 E/ [- d7 P5 Y+ Hmap(f, expr, a);    #将函数f映射到expr的每个操作数, 并取出a为f的第2个自变量5 S9 o$ M: S+ P& z
map(f, expr, a1, a2,…, an); #将函数f映射到expr的每个操作数, 并取a1~an为f的第2~n+1个自变量
: U4 F& j3 M) I4 z6 c8 p# Omap2(f, a1, expr, a2, …, an);    #以a1为第1个自变量, expr的操作数为第2个自变量, a2为
1 p. g/ i% t; Q4 q( I# ^& ?: I5 g1 C第3个自变量…, an为第n+1个自变量来映射函数f8 e) ~) x" Q9 d- r; Q
> map(f,x1+x2+x3+x4,a1,a2,a3,a4);  P% u1 [" Q" |# j5 e6 l. \6 ^
5 n: T/ u8 v7 I# }2 b$ Z1 y2 V
> f:=x->sqrt(x)+x^2;
" m, d0 r7 U. N/ ` . V$ y( X5 r/ o4 ?- u6 T3 i
> map(f,[a,b,c]);  p. Y2 ]) O; y, e+ N  F/ f  V

+ W3 f4 Y! I$ p3 ?$ g2 E, C0 D/ d; y> map(h, [a,b,c],x,y);
. }" c0 M; \, H3 b
5 x& {1 Y: W& [# V  T* Q> map(convert,[arcsinh(x/2),arccosh(x/2)],ln);+ H+ g9 `$ U/ ~6 \/ |8 O0 L% S+ l
7 \, p, v. p/ s# }
> map(x->convert(x,exp),[sin(x),cos(x)]);" T) E: H7 I! @$ c( |: v

) }  u2 w# I' p. U2 ~, b上式的映射关系可通过下式理解:/ S0 f6 h' W/ |9 f
> [convert(sin(x),exp),convert(cos(x),exp)];
9 t) \- Y5 A1 T& g6 H; _ 9 K# k* c, d4 Y
> restart:
4 X4 R% L: X3 a, m: j/ G! Vmap2(f,a1,x1+x2+x3+x4,a2,a3,a4);
$ e. j9 _* V4 e. G  S1 I
( D2 |& g! x) k6 u> map2(max,k,[a,b,c,d]); 5 E3 ?7 _8 _6 M
1 D# |- q& M# F: x
再看下面示例:   
( g3 |/ z7 \. F> L:=[seq(i,i=1..10)];7 W/ P1 O$ `6 \: K- r

; z6 e6 }# X( B& R. b7 S3 N3 C, [> nops(L);% x4 R# J2 E9 V  i0 a* M

$ N, v6 f: I7 I% M8 t5 p> sqr:=(x)->x^2;% |3 Y4 L% @" y. m

3 n. R$ S; |9 n8 c& u> map(sqr,L);- m( i& Z" ~' O# e( G
  C+ l8 _! o# A: x3 C0 b( P
> map((x)->x+1,L);2 P: ^# T+ P9 I8 u6 y$ D

9 p5 f1 g, M# r, S/ o$ M* x> map(f,L);) f, X/ H5 }! M6 j* x3 L: F& B, t3 m
' @5 e3 V! O5 G9 N& H7 b! R; d
> map(f,{a,b,c});2 S+ O3 ?* L  t
' }/ _1 P; i8 S7 z  _
> map(sqr,x+y*z);; l6 C# R% ^) s$ F, Z

! @2 z# M1 Y8 C+ _7 D( }> M:=linalg[matrix](3,3,(i,j)->i+j);
" J5 y0 N1 d" C. D9 t8 m# p 6 q9 h% {! F' V5 i4 }' b4 y
> map((x)->1/x,M);
' E4 n4 M* y# T5 q4 T 3 o+ l% s  q0 z" U( |
3 求 值( T- @# p& J2 M
3.1 赋值  i# u( k$ I; ]
在Maple中, 不需要申明变量的类型, 甚至在使用变量前不需要将它赋值, 这是Maple与其它高级程序设计语言不同的一点, 也正是Maple符号演算的魅力所在, 这个特性是由Maple与众不同的赋值方法决定的. 为了理解其赋值机制, 先看下面的例子. & k: C3 h# `" M. v* u2 b
> p:=9*x^3-37*x^2+47*x-19;
& ?  ?( j; M$ ^) N3 {" d  n
6 Y6 l4 }4 F. R7 h. V: U> roots(p);9 H4 }& g! n7 z7 ?6 \# M0 \. s. Y
9 w& R7 l6 q' e0 j  g
> subs(x=19/9,p);, E* }, Y4 g0 V. L" u' ]

4 @5 k7 U. i& N" N& R9 C在这个例子中, 第一条语句是一个赋值语句, 它的作用是把变量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;”这样的简单语句即可验证.
7 b  f( e0 p" X2 Y. K" F5 |" c3.2 变量代换4 c7 \5 S& |) C8 x
在表达式化简中, 变量代换是一个得力工具. 我们可以利用函数subs根据自己的意愿进行变量代换, 最简单的调用这个函数的形式是这样的:   
% r) [$ n7 `. Q0 B: hsubs ( var = repacedment, expression);
  Y% l& G8 U' c% I% F# T/ ]" b调用的结果是将表达式expression中所有变量var出现的地方替换成 replacement.
% f6 W1 ], b+ z; @9 ~' d1 c% k) x$ [: B> f:=x^2+exp(x^3)-8;
1 Y3 E) ]* E( S: c/ G6 N2 U
' ~+ v) V" K! G! S6 Y> subs(x=1,f);; }3 j5 Z! j3 v# M/ D
: n3 f. m5 Z  }5 w9 s8 I
> subs(x=0,cos(x)*(sin(x)+x^2+5));
; D$ i; {) ^7 D: A
0 ~  z4 G' }" G) a& n    由此可见, 变量替换只得到替换后的结果, 而不改变表达式的内容, 而且Maple只对替换的结果进行化简而不求值计算, 如果需要计算, 必须调用求值函数evalf. 如:   1 x. b  H. b6 J3 Z8 U4 C" X6 p
> evalf(%);% `# v$ w8 K0 I0 V2 t# ~1 g
: G. N) r# |- I, q  W2 `1 M) r" B
变量替换函数subs也可以进行多重的变量替换, 以两重代换为例:   8 A. h# E5 L6 ~
subs (var1 = repacedment1, var2 = repacedment2, expression)9 h+ C0 g3 ]% j' s# f' z
调用的结果和按从左到右的顺序连续两次调用是一样的, 也就是先将expression中的var1替换成replacement1, 再将其结果中的var2替换成replacement2, 把这种替换称作顺序替换;    与此相对, 还可以进行同步替换, 即同时将expression中的var1替换成replacement1, 而var2替换成replacement2. 同步替换的调用形式为:   
2 l" ^! ]% d3 a: o6 ?, Psubs ( {var1 = repacedment1, var2 = repacedment2 }, expression)
: J0 U% ?' M0 w" W7 g4 H( W0 g( j下面通过例子说明这几种形式的替换. + T/ Q+ a2 Z8 F* o; Y2 Q" N  x
> subs(x=y,y=z,x^2*y);              (顺序替换)  s+ d9 R3 H( O# S& L; J( f" U

) j4 P" [$ s# P9 s> subs({x=y,y=z},x^2*y);            (同步替换)$ `( J/ @4 N# t5 b

, {; d6 b' W; \> subs((a=b,b=c,c=a),a+2*b+3*c);   (顺序替换)( f! r; s6 M  X3 U( f( L# ]9 t

( e  H; }. v1 @% Y, R* S> subs({a=b,b=c,c=a},a+2*b+3*c);    (轮  换)" {$ Z. s+ X, k, ~3 L/ l2 u2 `/ n
* O; ]( J, e  H5 I
> subs({p=q,q=p},f(p,q));             (互  换)) g; i2 Z8 I& h" J; T  `( Z1 l' k
5 Y0 ^* z+ j5 ~2 v9 {' i
3.3 假设机制
2 I* q3 N$ O: yMaple是一种计算机代数语言, 显然, 很多人会尝试用Maple(或其他计算机代数语言)解决分析问题. 但由于分析问题与处理问题的考虑方法不同, 使得问题的解决存在某些困难. 例如考虑方程 的解. 如果k是实数, 结果显然是x=1, 但如果k是 的复根, 为了保证解x=1的正确性, 必需添加附带条件: 也就是当 时x=1. 这是一个对结果进行正确分析的例子. 然而从代数的角度考虑这个问题时就会把k当作不定元, 此时k没有值, 从方程两端去除k的多项式是合法的, 只要这个多项式不是零多项式即可(这一点是可以保证的, 因为其所有系数不全为0). 在此情况下x=1就不需要任何附加条件. 计算机代数系统经常采用这种分析的观点.   F9 q  F8 R+ t+ n
在Maple中, 采用分析观点解决这类带有一定附加条件的实用工具是函数assume, 其命令格式为: assume(x, prop);- z( h% F, c8 O# T+ t4 y4 r# T5 c- N
函数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);”也不会产生矛盾. ! J: e6 j/ a/ B1 x, L' a$ b
> Int(exp(-s*t),t=0..infinity);
+ M8 [8 A, F3 M7 Y 3 }( W7 W. ?7 m
> value(%);
$ G( c0 r" O' D6 y! n3 eDefinite integration: Can't determine if the integral is convergent.
5 D( R! _" m3 |0 ~; Q  I% ]# QNeed to know the sign of --> s
: z3 c% K# a! ^* V( s% M2 NWill now try indefinite integration and then take limits.  I) f( ]) I7 c" x
4 ?0 x+ P  |# `0 ~5 n2 M, w' x
> assume(s>0);
3 c( K: t: i! Y0 A2 X> Int(exp(-s*t),t=0..infinity);$ d' A8 L* |4 I# ]7 R$ `
5 K( S7 a, d6 Q- h* g9 L
> value(%);8 T5 e9 T( U7 I  K( b% R
+ |) r- L4 c) T/ X/ R
3.4 求值规则
+ H/ s. F3 l) ^; c在多数情况下, Maple的求值规则设计为做用户期望的事情, 但要做到这一点很困难,因为不同的人在相同的情形下会有不同的期望. 在大多数情况下, 全局变量被完全求值, 局部变量被一层求值. 而由符号' '界定一个暂时不求值的表达式, 单步求值仅去掉引号, 不作计算, 这也是允许取消指定名字或清除变量的原因. 如下例:   
& _, D6 \* R9 Y4 E> x:=y;. P+ [( y& v) M6 q

) w0 m; Y, b* u$ _7 g" X> y:=z;
( J( [( i( R) L8 R2 n
; R% x; N* ?6 s/ n3 ^# o1 L/ X* H> z:=3;
1 d' G6 [6 N- _4 }) g ! r. k) L7 r, {! u- a6 F" P* c
> x;
) W- q) J4 A3 _4 w; s' u 1 a; e5 i: c+ B3 x5 i$ w
> y;2 u" {5 P; @( ?
- {! M& Y6 S# l, `* A
> x:='x';
5 v' M* s  d1 D/ D6 p& W
- j( ]1 h) m) l> x;2 i; p; h# `/ A; H& k8 W1 C

( {9 k. ]4 U+ n* h4 W> y;# X5 Z9 J; u' P$ s' w

9 O" A& k( Z* y2 F# ^对于不同的问题, Maple设计了不同的求值命令. 现分述如下:   
# y9 _1 R& R6 ], I4 m4 t8 g- b1) 对表达式求值
4 t: x7 X& o  @7 ]2 l命令格式: eval(e, x=a);  #求表达式e在x=a处的值# o5 a$ V6 F# J/ v
             eval(e, eqns); #对方程或方程组eqns求值
0 X9 c; z0 c* V$ m             eval(e);      #表达式e求值到上面两层4 ^6 F/ c9 {1 c+ `4 R
             eval(x,n);    #给出求值名称的第n层求值4 I; o* S2 J. W
> p:=x^5+x^4+x^3+x^2+x+73;
! Q* N/ P! x! O , h0 }2 Y8 ~% M* [8 n5 M1 n
> eval(p,x=7);, w  t: k+ u7 v' V% ^$ Z# v

) m$ _) u5 v# ]* N0 V4 d> P:=exp(y)+x*y+exp(x);
0 g. G8 t, \# ?+ `0 d ( t+ m# H% Q' ^9 N
> eval(P,[x=2,y=3]);
) u5 I5 g& A9 D- a7 D. _% }! e! U
. H- N3 a: u, z$ k) d- A: T- ]    当表达式在异常点处求值时, eval会给一个错误消息. 如下:   $ Q' c# m$ o" j( Y
> eval(sin(x)/x,x=0);
. S* |+ o8 Y4 l" KError, numeric exception: division by zero
  A9 H" x4 q* n/ u, M( m! C    下面再看使用eval进行全层求值或者对名称几层求值的示例:   / S$ i2 C1 F2 v) M1 V! {
> a:=b: b:=c: c:=x+1:
" L( T, `9 u: M3 k! N> a;              #默认的全层递归求值# j8 I8 b* [% M

, A+ \- y, `2 ~; s) h1 I: F3 v> eval(a);        #强制全层递归求值3 X9 N7 g  z. q' b+ P' y

/ Q8 L2 K, v! {9 G6 o> eval(a,1);       #对a一层求值
' S- d% s! @2 W
% t# u) \/ W2 ~3 X6 ~> eval(a,2);       #对a二层求值
& J& ^' J" @/ M- @ 3 H- d# t1 j  q7 V1 l! A
> eval(a,3);       #对a三层求值
; Y! u% Y' v  d5 Y6 |
! l1 H( |  l7 Y$ U5 u> eval(a,4);       #对a四层求值
7 M; y& [# h2 m8 r. D / R8 X( }$ R% h3 x
    2) 在代数数(或者函数)域求值
5 P1 N: q/ S0 u2 N1 K6 f命令格式: evala(expr);       # 对表达式或者未求值函数求值
1 e* c0 Z8 f2 V# C+ T             evala(expr,opts);   #求值时可加选项(opts)$ p& w2 V* I& }8 c3 e: o
所谓代数数(Algebraic number)就是整系数单变量多项式的根, 其范围比有理数大, 真包含于实数域, 也就是说任意实数都是整系数多项式的根(如 就不是任何整系数多项式的根). 另一方面, 代数数也不是都可以表示成为根式的, 如多项式 的根就不能表示成为根式的形式.
: U; y: d, ^/ }代数数的计算, 算法复杂, 而且相当费时. 在Maple中, 代数数用函数RootOf()来表示. 如 作为一个代数数, 可以表示为:   5 w$ K* U1 `# F* A* J& R7 |
> alpha:=RootOf(x^2-3,x);. m5 `8 G! F3 H* q+ s! f1 }& m

, l6 V0 \3 m4 W6 G6 X0 d> simplify(alpha^2);, p4 n9 Z3 C# x1 a$ L8 O

" \+ ?0 z5 A# B6 t- Z  I在Maple内部, 代数数 不再表示为根式, 而在化简时, 仅仅利用到 这样的事实. 这里, Maple用到一个内部变量_Z. 再看下面一个例子,其中alias是缩写的定义函数,而参数lenstra指lenstra椭圆曲线方法:
  N" @: V! z" V  s> alias(alpha=RootOf(x^2-2)):; r! D0 }/ t. p. `& f
> evala(factor(x^2-2,alpha),lenstra);$ F8 @) k7 p. a/ K
( D% e) I: N+ J9 {; D: j
> evala(quo(x^2-x+3,x-alpha,x,'r')); 9 P5 O7 ]- U6 N* F! [  p# P5 w: o% r: j* d

# j; q$ E/ |0 j  q7 q> r;
  p4 Z0 Q+ P( ?7 v
$ d4 ]8 F' E' w; {> simplify(%);3 ], M' K: C5 E

4 r: m$ L4 t$ W+ o4 N: P8 N) u& {3) 在复数域上符号求值+ T1 J$ O8 ^/ o7 O
操纵复数型表达式并将其分离给出expr的实部和虚部的函数为evalc, 命令格式为:4 M4 A# c( O9 W. n
evalc(expr);     e7 J  F: a3 `0 s7 d
evalc假定所有变量表示数值, 且实数变量的函数是实数类型. 其输出规范形式为: expr1+I*expr2. 8 j% y" [& {6 F0 \" m) m2 p' \
> evalc(sin(6+8*I));
5 B! O, D/ `, x. {4 ]* h 1 g; }4 J1 h: F5 K1 ]
> evalc(f(exp(alpha+x*I)));
! o" C: s- f& E$ R! ? 0 V$ ~" p: U$ p: A) p* R
> evalc(abs(x+y*I)=cos(u(x)+I*v(y)));+ M2 G! m+ z* }, I1 ~" C6 D

: s" p' O' \6 n+ u5 T4) 使用浮点算法求值, `% {6 c# ~2 l
浮点算法是数值计算的一种基本方法,在任何情况下均可以对表达式expr使用evalf命令计算精度为n的浮点数(n=Digits), 如果n缺省, 则取系统默认值, 命令格式为: evalf(expr, n);     
$ R* Z+ a/ F$ n! N( \> evalf(Pi,50);    0 h! e9 F9 G% g0 Y' N. z
0 y+ V1 J) ~& F
> evalf(sin(3+4*I));   $ [; P8 ?3 `3 M. l. q+ Y- E

* f* @3 g- O+ F* y% P- M2 V> evalf(int(sin(x)/x,x=0..1),20);
/ Y" F# Z; @' V# h7 Q0 s8 o # L5 o& ~, o2 }1 @5 K4 Q# x; u
5) 对惰性函数求值
* _: F! c8 X3 e# n8 q2 J把只用表达式表示而暂不求值的函数称为惰性函数, 除了第一个字母大写外, Maple中的惰性函数和活性函数的名字是相同的. 惰性函数调用的典型用法是预防对问题的符号求值, 这样可以节省对输入进行符号处理的时间, 而value函数强制对其求值. 对任意代数表达式f求值的命令格式为: value(f);   7 O& S; ?7 ^# \2 S# k5 ]- ]2 q# }; H1 e
> F:=Int(exp(x),x);9 W# g, ?3 L* ^' ~' S, s$ z

( b% c1 U2 j  [/ _> value(%);
! J# [5 _- G* |" @" o" E/ l
; x  T8 R' v5 f# {' g5 h0 O> f:=Limit(sin(x)/x,x=0);: h2 X/ I( F7 [! a( |0 R6 m

" d& C, y) ]+ X4 ]6 ]; ~> value(%);
& Y& M( G& ~6 [+ r- W9 e % ~% x7 S+ R; i6 p) F5 H
另外, 将惰性函数的大写字母改为小写字母亦即可求值. 如下例:   
% _6 `0 U2 O8 c. M; h> Limit(sin(x)/x,x=0)=limit(sin(x)/x,x=0);
  b2 o/ b6 Z. k' N/ ?: w
$ v8 v  p# U' E4 数据结构" t! v% j/ g' h
Maple中有许多内建的与FORTRAN、C或Pascal不同的数据结构. 主要的数据结构有序列(sequence)、列表(list)、集合(set)、代数数( algebraic number)、未求值或惰性函数调用、表(table)、级数(series)、串(string)、索引名(index)、关系(relation)、过程体(process)以及整数(integer)、分数(fraction)、浮点数(float)、复数(complex number)等数据结构, 而矩阵(matrix)在Maple中表示为阵列, 是一种特殊的表. 2 |; u  C/ ~" v
4.1 数据类型查询
6 S& l! H& |: P9 B8 {: S+ r在Maple中, 用whattype指令来查询某个变量的数据类型或特定类型, 命令格式为: 1 a7 A2 T+ \% C( V/ c
whattype(expr)        # 查询expr的数据类型
; C. N8 q. V, c4 x3 |& A) ~type(expr, t)           # 查询expr是否为t类型, 若是则返回true, 否则返回false
+ S0 N: Q( b% {- K$ n* M> whattype(12);* I# b( f+ n  L" n( ?9 `' i
. C* R/ j7 G% [9 V& D+ E+ k
> whattype(Pi);
) @7 h' B; [  Q& s7 a5 o 9 E) a/ Y1 s+ c( ?2 a
> type(1.1,fraction);
2 i  V  m7 c8 \: F5 ]5 P8 ?
& m9 c, i& a8 T# ~5 X> whattype(1.1);
( g# a# d' c  F8 I5 H5 \/ p+ `
3 d9 w. e1 _* Y, f" h4.2 序列, 列表和集合
" m, `% |+ ~) y' Q: u% g4.2.1 序列
; p& ]9 _8 ]8 A6 X所谓序列(Sequence), 就是一组用逗号隔开的表达式列. 如:   
0 v+ E. C8 w/ C/ F( g2 N: m. T> s:=1,4,9,16,25;
, g, n% F$ Y6 D# w- j! X4 v! [
  K2 h$ e0 z& R4 E> t:=sin,com,tan,cot;0 V. `5 b3 s1 _) N

, i: Y/ q! ]: h2 |  V* m0 X, z一个序列也可以由若干个序列复合而成, 如:   . c2 n: U( d4 o) B, l" V9 _0 M
> s:=1,(4,9,16),25;* w2 O7 M1 }8 H! P. X  c

. R, E8 Q, \" Z> s,s;0 S* ?: u- ]0 M
+ J; d0 q0 K8 P9 g2 L  g' Q
而符号NULL表示一个空序列. 序列有很多用途, 如构成列表、集合等. 事实上, 有些函数命令也是由序列构成. 例如:   
+ O0 z  O4 W& ?  \1 V5 j3 d% g, M> max(s);
; m) t, t9 i  d
* ^5 s7 V& Y, ]; N' _+ q> min(s,0,s);
( [3 M2 z" u. a) w$ c
& G, [9 u! T" R# {值得注意的是, op和nops函数命令不适用于序列, 如op(s)或nops(s)都是错误的, 如果要使用op(s)或nops(s)前应先把序列s置于列表中.
2 f6 i4 R& }- P: l0 P" I+ ^> s:=1, 2, abc, x^2+1, `hi world`, Pi, x -> x^2, 1/2, 1;
' ^: T& f- x+ M2 @& i7 N6 e3 @, f) s2 u % m4 Y6 Z6 {9 R. J. @
> op(s);- Y' `4 D7 @# z+ z7 f1 d/ T. N
Error, wrong number (or type) of parameters in function op
1 a. Y$ n; ~" W. p> nops(s);( E/ j6 L  R6 v9 Q) R
Error, wrong number (or type) of parameters in function nops2 E# L" k: b# {* F7 u8 S$ }
> op([s]);
- E; Y8 g% Z8 i5 e; X  M9 i 4 f0 O$ V2 w! |3 y3 q0 z+ E, {& b
> nops([stuff]);
; z% j9 L) i0 j8 q9 I' w) ]( Z
1 M. D# q  @) [# f6 l函数seq是最有用的生成序列的命令, 通常用于写出具有一定规律的序列的通项, 命令格式为:   
  I& {* F! P1 v% J0 r: O: h" N. ~. vseq(f(i), i=m..n);  # 生成序列f(m), f(m+1), …, f(n) (m,n为任意有理数)
/ [- j3 M; A0 @! Z' qseq(f(i), i=expr);  # 生成一个f映射expr操作数的序列7 @8 O/ b5 ?! E
seq(f(op(i,expr)), i=1..nops(expr));  # 生成nops(expr)个元素组成的序列
* I8 C3 a9 a2 D7 i> seq(i^2,i=1..10);. S1 Q, @& J! M6 j/ Y

9 M; b% R0 r; h! {9 E& i$ G9 s  Y; G> seq(ithprime(i),i=1..20);  }) d9 |) P' I+ U1 D) U

' o7 J# \4 G1 {> seq(i^3,i=x+y+z);$ @6 r" M, I# W9 h# j: m4 _
, h/ l# Z: z5 r3 D# ~! k
> seq(D(f),f=[sin,cos,tan,cot]);
9 W4 L1 \9 E2 S0 E# ^% l/ U 5 c* k* V/ r& ^) e, P
> seq(f(op(i,x1+x2+x3+x4)),i=1..nops(x1+x2+x3+x4));; l3 T' W! r+ E
4 F4 t8 p9 O( r2 ^; N1 `, Z$ ~
获得一个序列中的特定元素选用操作符[  ], 如:   
3 {+ H  C( d  K! W& U> seq(ithprime(i),i=1..20);
7 `9 _2 H0 Y3 A. p
- G9 E- l1 ], g  U2 J" H4 s> %[6],%[17];
$ _9 L1 Y  J0 ^( h. i& Q0 g1 k; U2 s * h# C$ Y" @! y# K- ~
4.2.2 列表
# t. x! u4 z+ j5 g- b) A$ \列表(list), 就是把对象(元素)放在一起的一种数据结构, 一般地, 用方括号[  ]表示列表. 如下例:   1 f5 S+ d% @+ {5 n$ J, F
> l:=[x,1,1-z,x];9 H# v" U: s) T6 J  Z0 d
* ^% P$ {2 x) o" h+ y8 C
> whattype(%);3 B7 ~: M% D' W# h! M
7 B6 e# {; K; ]% H
空列表定义为[ ].
3 F0 N* A1 G: z* h但下述两个列表是不一样的, 因为对于列表而言, 次序是重要的:   
5 Y  U: l% l! L% Z! ]> L:=[1,2,3,4];
! j+ }% J: l% i! V
! t( S" X$ c$ R  z; j- a> M:=[2,3,4,1];" k7 b2 M: i0 v! j3 k1 [
' x# z/ [9 e2 ]! m
4.2.3 集合
6 D2 `4 F, x: M" M. r) R# z集合(set)也是把对象(元素)放在一起的数据结构, 与列表不同的是集合中不可以有相同的元素(如果有, Maple也会自动将其当作同一个元素), 另外, 集合中的元素不管次序. 一般地, 用花括号表示集合. . C+ _: L! D) h- z0 O
> s:={x,1,1-z,x};4 A% q3 e* S7 ?6 _! u4 Z* \' S' {
0 _! b3 T5 H' l
> whattype(%);! e) j# u8 t8 V; S
7 K/ h. J" l( b' i: S! \
空集定义为{ }. ! S: k0 }+ n9 M& ]% L- r5 G: K
函数nop返回列表或集合的元素数, 而op则可返回其第I个元素.
3 w* Y% _& c, E* y& Z1 O> op(1,s);2 W+ X7 D& T5 R

7 J9 E3 O; G7 y) X7 Z& J3 h* v> s[1];
. J" e& N3 K! H 4 P8 j+ z/ I- _7 ^: o' @( P
> op(1..3,s);# l8 B7 P, f) s6 z6 s7 Q8 Y5 N1 R3 j
8 W% a' h3 G- m. b8 D/ Q* }' W7 }
> s[1..3];" S! y: D/ A; M! X) U9 f
; v. o4 N' x8 d$ a; G- `
函数member可以判定元素是否属于一个列表或集合, 如果属于, 返回true, 否则返回false.
5 s5 ]+ @2 @2 H" Z* w& F9 T> member(1+x,s);& _+ l1 s, J' R' \8 g# T6 A
- s0 u  n) }3 q  Q: [
可以通过下述方法在列表中增减元素:   
0 m% v2 a6 p) W+ t. J> t:=[op(s),x];: o# T& n& i8 Y' x5 L

& V' H4 f0 V- K0 f0 i+ b> u:=[s[1..5],s[7..nops(s)]];, q5 [" |/ D( T2 y! k

2 ~, k, K/ @8 ^. `Maple中集合的基本运算有交(intersect)、并(union)、差(minus):   2 u) c. V  h7 L  i  ]
> A:={seq(i^3,i=1..10)};B:={seq(i^2,i=1..10)};
- K8 \0 E9 ]  ]" S ; K" \7 }5 a* S; Y3 Z* W  X+ y

3 S- P4 r8 `( Q+ y2 {% Y* r8 @; N> A intersect B; : @: Q/ g+ K0 q1 A1 g( Y
# y( K8 R7 c' L- i6 Z9 z
> A union B;
# a' G8 f8 X1 b3 e1 C
) w* m$ o3 ^- ~$ e) h9 Y! z> A minus B;( j0 j1 y) J& ]- \

- _5 A" x, e3 c2 h2 z  ]4.3 数组和表5 d* ]. j! T3 s5 c$ V* b. D( m  k% e5 ~
在Maple中, 数组(array)由命令array产生, 其下标变量(index)可以自由指定. 下标由1开始的一维数组称为向量(vector), 二维以上的数组称为矩阵(matrix). 数组的元素按顺序排列, 任意存取一数组的元素要比列表或序列快的多. 区分一个数据结构是数组还是列表要用“type”命令.
. G0 X$ |2 ]$ T' R) Z; }- ^    表(table)在建立时使用圆括号, 变量能对一个表赋值, 但一个在存取在算子中的未赋值变量会被自动地假定是表, 表的索引可以成为任意Maple表达式. 表中元素的次序不是固定的.
! _# h2 q/ k7 K5 g> A:=array(1..4);
# D4 b- Q. j! G * P9 A+ d( t) Q5 Z4 P3 I) M
> for i from 1 to 4 do A[i]:=i: od:/ [- `* U5 J8 ]( Z5 z4 ?
> eval(A);# R7 b; S/ l- l; ]: P

( y2 L4 J$ w" A  U4 d> type(A,array);6 J. A) c; f0 r! R( s; y
' w0 L/ \/ c! f
> type(A,list);0 P9 `' x1 J! h, J; A8 b& y7 [
! r( _0 w  c7 O" p" O, g- d
> T:=table();
0 d1 g7 K  L( \" j! W/ _ " W: b  [1 h: H: d+ p' N
> T[1]:= 1;
# g4 ]7 b8 [" D9 G( \
$ t+ n6 _8 W8 a0 \* b: Z> T[5]:= 5;/ ]" J. d5 s* L- X, _- K( u* G

  M+ l6 E3 x% h; S6 m# T% W. y> T[3]:= 3;
- [" E/ V1 Z; z6 k* H3 p + P$ y; l: W( R) P0 l
> T[sam]:=sally;/ j( g9 t0 @6 X# g

$ w3 H& T8 k5 O# A3 P: _> T[Pi]:=exp(1);
4 H; X3 Q( G+ G* O; w* }' g( k - E3 {8 x; u/ M/ V4 o
> x:='x';& z+ x; a. K; \, G1 q5 V% v

% T/ g( x. R- [9 G# Z* S1 M, g> T[(1+x+x^3)*sin(x)] := 0;
+ |! y; y" G9 n1 E% y
9 Y  `! k5 D" r1 |' w> eval(T);
* c  v, J% _/ v7 D/ A/ M( ~
( V% D* Y8 N- r0 U( j> T[3]:='T[3]';
2 `% n( a5 z& T
  ~9 C9 I, [. n' N( W, h> eval(T);6 t# i; L& M) E/ n. V
8 a0 n: t* m1 Q0 b' h: ^3 E' \* l
4.4 其他数据结构* c! U  I2 ]$ T0 ]
串在Maple中是很重要的, 他们主要用于取名字和显示信息. 一个Maple的串可以作为变量名, 它们中的大多数是简单的、不需要加引号的串, 但是如果变量名中包含/. 例如“diff/T”则必须把变量名用引号括起来. % \& G0 Y9 Y) @1 p, l+ K) Z
索引名是像Database[1,2,drawer]或A[3]这样的对象, 在使用索引前不需要直接建立表, 如果不得不做, Maple会自动建立表. 索引名通常被用于矩阵和向量. 为了保证Maple建立表的正确次序, 建议在赋值前直接建立. % x0 [+ e- e) t: F; p4 \4 q
> x:=T[3];
, Q' B3 ~5 r! C& G/ O ! h- L. g4 t$ r2 u( d. J8 Z
> eval(T);
( k- ^7 {" ^8 O ) e4 q$ Q( |4 ^" Q; S( k: D1 x
> T[5]:=y;! q3 |0 n9 {! a; F# H. \
  l7 s+ {7 |. q
> eval(T);2 m) T7 J- y+ N7 c4 F: C- z

2 Q) z2 H  J5 z" u% M由此可见, Maple并不直接建立T的表, 直到给T[5]赋了值.     
, Y4 ~$ n0 H" A8 s  E数值数据结构(整数、分数、有理数、浮点数、硬件浮点数和复数等)在它们的使用中是大量透明的. 浮点数是有传染性的, 这意味着如果数值结构中有一个是浮点数, 则整个结构自动转换为浮点数. : |2 h7 T, ^4 p& {; A
4.5 数据类型转换和合并- H" [/ l, E) R: G0 q
convert是一个功能强大的类型转换函数, 它可以实现列表和数组的类型转换:   : P- p$ Z) [2 _2 x8 R7 @0 }
> L:=[1,2,3,4];
9 `" |5 i2 q6 b ) U. `5 X! K8 ]+ w9 G, `
> type(L,list);
: Z' |* z+ m% x3 U. M. X6 ]3 ?
' `/ j) _' h' w> A:=convert(L,array);8 _; b  W0 J( I0 l9 \

$ G  D* d( x/ Y4 @1 P> type(A,list);7 V# z9 `4 S/ k. r
$ u+ s" p+ }; X( C
> type(A,array);
7 J+ L# r% d3 w, m, H7 z
# S' O! A1 |& v5 J9 q" x另一个有用的函数zip则可把两个列表或向量合并:   ( }6 ]1 e. X  B  [' O
>L:=[seq(i,i=1..10)];# r, i0 o9 A8 K- U0 b/ F
2 T) d% g3 t9 {1 m& r
> Sqr:=(x)->x^2;
; M' O& h5 J. n. B6 z/ Y0 e 2 W; u1 F8 d! ^8 \
> M:=map(sqr,L);* P- v) E8 E. o2 c' E9 {& Y

5 }/ p5 L+ B* T3 p8 F* ~> LM:=zip((x,y)->[x,y],L,M);/ I1 y9 j$ b+ v3 c9 l8 `/ i. B
2 {9 P2 _- Y9 I+ F
> map(op,LM);; h3 x0 w1 D1 N. y# @/ J; ?! c* O
) @# D; l1 ^/ }1 D- Q
5 Maple高级输入与输出操作
1 Q3 t3 Y  D/ n" _# b5 n0 r% AMaple提供了良好的接口来编辑与计算数学式. 许多时候, 我们可能需要把Maple的运算结果输出到一个文件中, 或者在一个文本编辑器里先编好一个较大的Maple程序, 再将它加载到Maple的环境里.
! A$ ^& `+ M7 X: d5.1 写入文件" E1 v9 `. D8 Y1 e9 ?5 X6 O
5.1.1 将数值数据写入到一个文件
0 g  X) D& z) p4 P5 u如果Maple的计算结果是一长串的数值串行或数组, 而想把它写到一个文件时, 用writedata命令.
& L& t8 N0 ~; H3 F# c8 r' f* P若Maple的计算结果data为集合、矩阵、列表、向量等形式时, 将其写入名为filename的文件时命令格式为: writedata("filename", data);1 z' e8 R5 ]& d
> with(linalg):/ A) C/ _3 }( z1 s2 i$ ~
> M:=matrix(3,3,[1,2,3,4,5,6,7,8,9]);. l' O: ~5 @$ X* V  T

. i* P2 N. ^6 ^) u! R> writedata("e:\\filename.txt",M);
+ T; M0 m- n+ Q& s  Q而将结果附加在一个已存在的文件后时,使用命令: writedata[APPEND]("filename", data);
& ]) ^, C0 x8 B% Q  i" G1 ]* c  t3 N> W:=matrix(2,2,[1,2,3,4]);4 H3 d; _- V6 e4 I! N6 T6 q' f2 g
- Y& @5 H& K+ y: Y. z
> writedata[APPEND]("e:\\filename.txt",W);
/ c! ?. B( X. ?% o* d需要注意的是, 这里的APPEND是必需的, 否则W结果将会覆盖M结果.$ y2 d1 Y. t# @+ i7 h2 s2 P
另外, 若想将结果显示在屏幕上时, 用命令: writedata('terminal', data);6 |* y4 }. z; \
> writedata[APPEND]("e:\\filename.txt",W);
  ]% c! E9 F: w2 a> writedata('terminal',M);
7 g2 O7 b% [: B1                   2                   3           6 a4 S1 w* _  d* d
4                   5                   6           " A$ B2 |0 {# l/ k; H) d
7                   8                   9    & G) y2 b. c9 E8 Y
5.1.2 将Maple语句写入一个文件6 r6 g. ]* x+ b" X& n. z
如果所要写入文件的是表达式、函数的定义或者是一个完整的程序, 则使用命令save, 写入一个或多个语句的命令格式分别如下:
0 `: w3 f* c0 Q( Y. s4 usave name, "filename";
) n3 ]# O0 C1 Usave name1, name2, …, "filename";
" d8 h9 a4 n! P! B若filename的扩展名为.m, 则Maple会以内定的格式储存, 若扩展名为.txt, 则以纯文本文件储存. 以内定的格式储存的文件作纯文本编辑器无法读取, 但在大多数情况下, 它会比纯文本文件的加载速度更快, 且文件容量小.
& `8 ]/ y7 a. [$ `: F> myfunc:=(k,n)->sum(x^k/k!,x=1..n);
1 e0 `  Q0 H! i' L
* u6 k( t- N# @* G+ Y1 d- g) W; f> myresult:=myfunc(6,8);
" P; S3 z1 G/ p/ K. I. q . x" s. B  N3 R2 G9 L( v: x
> save myfunc,myresult,"e:\\test.m";, f0 S2 {1 k0 p+ i" ?; {  Q; K) D
调用已存m文件用命令read. 试看下述实验:
: s4 }0 m% E  {8 p+ [> restart:5 L2 k; s3 l, B" ~
> myfunc(6,8);) _9 W) c% d; W3 C  Q3 y2 f

- s, O% K" @1 ~2 m6 x" x> read "e:\\test.m";
, s7 j' f, l/ b- T5 f/ p8 C> myfunc(6,8);3 d4 q7 O; F9 @2 v8 L2 G# `

9 q8 o. p; F* l% ~( k> myresult;
# O) K$ u6 a; w$ h9 ~ 1 v  \3 b5 R5 K! C  B# J
    而存为txt文件时则将整个语句存为一个文件:
: m8 \7 T6 L, f+ ]8 _1 H9 i) x> save myfunc,myresult,"e:\\test.txt";; @7 [1 X, l  j. y) I& n  ]/ [
> restart: read"e:\\test.txt";
* m" l; e% n3 ?: r , x* E) P2 F0 G9 K# K( U
8 s$ k; }) V) C: w) G
5.2 读取文件  ~$ s# w0 _/ [/ r7 I
在Maple里最常用的两个读取文件的命令, 一个是读取数值数据, 另一个是是读取Maple的指令.
4 X; I- }8 B0 z7 }, [% [& I5.2.1 读取数值数据
* j' Q8 @! E% }/ ]如果想把大量的数据导入Maple里进行进一步的运算或者要运用大量的实验数据在Maple环境绘图时, 可以用readdata( )命令完成.
) M3 A0 Q/ d* T0 v, l, ?从filename文件里读取n行数据时使用命令: readdata("filename",n);$ O; ]' {  z6 V9 C& R- [
以指定的格式读取数据时使用命令: readdata("filename",[tyep1,type2,…]);
! U' O; l2 g( \. p, ^) X4 i> readdata("e:\\filename.txt",3);
2 |, l' p2 I" e) c! u9 \ ; N/ ?& w- b7 D
    读取filename的前三列, 第一列为整数形式, 第二、三列为浮点数形式:
: A* ^( z# G( M3 o+ R; Y1 H7 H> readdata("e:\\filename.txt",[integer,float,float]);# c$ w6 p: z7 c3 X# d  Q

% {4 K, ?! P5 A4 [5 I# M# u; I下面再看一个运用大量的实验数据在Maple环境绘图的实验:3 U- ~( G: M0 H  F! h! a3 q. p
> mypts:=[seq([x/1000,cos(x^2/100000)],x=1..1000)]:
! i9 |, y+ w$ l2 |> writedata("e:\\data.txt",evalf(mypts));2 d% ?6 G9 ~2 f7 ~- p  u6 B
> dots:=readdata("e:\\data.txt",100):
3 n8 H2 x% p6 Z* y( F> nops(dots);
( f) J; e" p, {1 e
  g0 V8 ^& c( {3 B( p# Q' `$ q. p> dots[1..4];9 C1 m3 J. ?' t9 q! s; ]1 Z. }

& o' q2 {& c( t" A2 s+ v> plot(dots,style=line);
1 U8 I2 r0 `5 p( }' F9 d% B - {$ z8 V$ {" }+ e% l2 k
5.2.2 读取Maple的指令
! [# H0 E, U( f; T" p# i. Z2 [+ K在编写程序时, 在普通软件中先编好程序再将其读入Maple环境中常常比直接在Maple中编写更为方便. 如果要将程序代码或Maple指令加载用read命令:8 ?! _7 _' ^+ H4 q
read "filename";$ f# n2 o: c/ v. Q6 e
如下例:) u# _: n, w- H9 Y- k) }( A, T) ^
> reatart:# u5 V+ {+ s8 i7 q
> myfunc:=(a::list)->add(i,i=a);- Z% G6 f( C, q5 H( Y# q) R

2 o; K6 C7 D" w$ F" k> avg:=(a::list)->myfunc(a)/nops(a);! V6 X4 ?% k$ s

) J5 h" W' K: E: M# m! U- O, R" ~> save myfunc,avg,"e:\\function.m";
" ?# x6 i" p; u. [> restart:
. K  a4 j" s: Q& B> read "e:\\function.m";& K1 w6 H% Q4 R
> myfunc([1,2,3,4,5,6,7,8,9]);
6 t4 w4 |6 X) `
* N- }8 Y3 z- J6 f> avg([1,2,3,4,5,6,7,8,9]);* X1 K' ~7 }* v  B1 Q3 S* ?
0 X' N, M7 J4 Y' r9 J' E8 `
5.3 与其它程序语言的连接
( D  K/ R7 c. h% Y# i. y0 V5.3.1 转换成FORTRAN或C语言: \3 O  D% P* L9 U$ ?$ j1 _
调用codegen程序包中的fortran命令可以把Maple的结果转换成FORTRAN语言:- ~  I' E( }. @( V
> with(codegen,fortran):
( N1 U! U/ e+ k. mf:= 1-2*x+3*x^2-2*x^3+x^4;
* L4 s* ~9 f4 x1 ]4 [
5 l" K1 f# n* W: S' v# H> fortran(%);
0 y1 f! O: t$ {7 q      t0 = 1-2*x+3*x**2-2*x**3+x**4. j/ a# P8 _) c3 S+ D  n: k4 e% z' i
> fortran(f,optimized);* q  m9 f2 }; X, U$ O# P5 p- P
      t2 = x**2
  m" A  m% P: F      t6 = t2**2, L* H9 ], a( X" X% Q& r! K1 b8 M3 v
      t7 = 1-2*x+3*t2-2*t2*x+t6: G% ]& \2 f9 |( O  ?9 u
> fortran(convert(f,horner,x));* e0 ^4 D7 a, [, U/ Q# U
      t0 = 1+(-2+(3+(-2+x)*x)*x)*x
  P* U, V3 `) N  W+ B% g而codegen程序包中的C命令可以把Maple结果转换成C语言格式:1 M8 D6 C$ k, j' }7 u
> with(codegen,C):
2 W# D7 P: n1 z& g+ \f:=1-x/2+3*x^2-x^3+x^4;
- |& U# t3 E% f2 P$ t
2 H* _2 a; u! d+ \5 I$ l> C(f);- F: S& q0 h* r5 b9 [9 P
      t0 = 1.0-x/2.0+3.0*x*x-x*x*x+x*x*x*x;/ _- p- E8 `* [7 O" ~) ]
> C(f,optimized);
: y2 n3 o. t1 T+ o! k4 S      t2 = x*x;
) p) \% ^; p$ y9 \5 e0 x: z) J! m      t5 = t2*t2;
9 k" q" \$ F0 h$ W      t6 = 1.0-x/2.0+3.0*t2-t2*x+t5;
9 }' U8 s3 k3 f- M/ \optimized命令表示要对转换的表达式进行优化, 如果不加此可选参数, 则直接对表达式进行一一对应的转换.8 ?2 r! F8 b: ?& @4 C- ^% a
5.3.2 生成LATEX
2 {. @  V# h# T+ _/ c. T; uMaple可以把它的表达式转换成LATEX, 使用latex命令即可:
" W: C; b3 f8 N( Q& i- B' O, R% W> latex(x^2+y^2=z^2);
4 g0 o4 k/ Q- f{x}^{2}+{y}^{2}={z}^{2}
! r1 ?( `2 n$ s    还可以将转换结果存为一个文件(LatexFile):! v; z* ?4 Y0 r, ~8 ]4 \( a( O1 l
> latex(x^2 + y^2 = z^2, LatexFile);
/ H! t9 U! i" p, n& V- @$ S    再如下例:
0 P$ W5 g4 Y% @2 B& }> latex(Int(1/(x^2+1),x)=int(1/(x^2+1),x));
7 p" L( Y. V* G9 u\int \! \left( {x}^{2}+1 \right) ^{-1}{dx}=\arctan\left( x \right)
* G+ a5 H; A+ R. ?2 T- Y2 q- |
! [! B6 x+ @" a, }
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年!$ j  O1 t0 p1 A/ M* x

    . D! A3 j) q  B8 M% _7 ]( L$ T: t3 [
    回复

    使用道具 举报

    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-12-21 05:00 , Processed in 2.060320 second(s), 96 queries .

    回顶部