QQ登录

只需要一步,快速开始

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

maple基础

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

1

主题

5

听众

4

积分

升级  80%

该用户从未签到

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

5 K7 `  z$ h9 M: e- X# [
. d# i  P. s2 l- v4 I
$ t8 K! `8 X1 W) B, l+ { 3 Z2 O! ?' g3 g0 _0 O" D$ Z% e  s* M

: }6 |4 [$ a% H' O% K$ D1 e5 v- |
2 ~, q7 |6 }  {/ H1 L
6 d/ g! K+ J5 G) {
# @7 p+ Q7 _, O) }& r) [; I& C1 F
& r' ~' O  ?9 \, D2 d 1 a' Z6 a7 i6 l! {9 I

, g4 _- [1 Y2 J% j
$ [8 }2 ?/ k7 Q; z4 E( T2 Palpha        beta        gamma        delta        epsilon        zeta        eta        theta        iota        kappa        lambda        mu
2 Q3 F; K/ }' z* x1 T' a" \' E, y 7 n6 C2 V" G/ V, b; D4 B
: T6 [6 g& u7 n  [0 H( G/ y
4 S# o; L7 L) b: W5 y1 J6 W' a

! e& V+ M" U( I$ _0 q. ]! i; ~
- J# g- U  R7 }* N 6 z) q9 ^; A' F5 ^
5 Q5 O& V: D& O  m& w
8 Y8 |# c, e6 q

4 b' u  {7 w) [% N2 C+ o
2 c: u6 ]& u2 d4 I$ s
3 W& L# s. x: R% v, q ! P7 m, l7 X& d3 W  F1 ]: z
2 Y! S/ o5 J3 T; E  n5 H
nu        xi        omicron        pi        rho        sigma        tau        upsilon        phi        chi        psi        omega( W) d8 _( O  p4 u3 ~
有时候为了美观或特殊需要,可以采用Maple中的函数或程序设计方式控制其输出方式,如下例:: c- W2 ]8 N1 k
> for i to 10 do - `9 `- `' B) r, h; K* c
printf("i=%+2d and i^(1/2)=%+6.3f", i, eval(sqrt(i)));
, s9 q) L4 i/ o3 d$ h: God;
) y' ?5 @' d8 ^5 y0 m% ]9 E7 l; A0 Ji=+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# [' m0 q) ]1 j
+2d的含义是带符号的十进位整数,域宽为2. 显然,这种输出方式不是我们想要的,为了得到更美观的输出效果,在语句中加入换行控制符“\n”即可:5 H* ]% T1 o1 b+ d
> for i to 10 do
9 ]$ [" ?8 X, w0 {9 D" y4 a# oprintf("i=%+2d and i^(1/2)=%+6.3f\n", i, eval(sqrt(i)));
9 P5 c4 K4 r3 K7 f6 qod;& J% b0 j# ]2 }$ u# b* s. I
i=+1 and i^(1/2)=+1.000
/ U+ h8 w# J8 h7 ui=+2 and i^(1/2)=+1.414( h& r: C' h7 r+ l
i=+3 and i^(1/2)=+1.732. h/ ^0 A1 }' i- q& G! i( \
i=+4 and i^(1/2)=+2.000, D% d- z% @: l! w; Z* F- k. i( `
i=+5 and i^(1/2)=+2.2361 m- H$ O1 _& K" B: T: U% O
i=+6 and i^(1/2)=+2.449
. J* w* a- z2 N8 Q7 s! ~i=+7 and i^(1/2)=+2.646! Y1 o" P; L# K$ ?; x
i=+8 and i^(1/2)=+2.828
& u' D7 B2 H8 o- C5 a- ai=+9 and i^(1/2)=+3.000) w5 [2 e. v* ]  M! H, y3 z
i=+10 and i^(1/2)=+3.162
4 m+ [' E! L, r3 t' ~- _! V再看下例:将输入的两个数字用特殊形式打印:, ]: {3 Q' I" }0 l; n. g7 ?' o
> niceP:=proc(x,y)
0 m) k$ b: @6 y& a* g& nprintf("value of x=%6.4f, value of y=%6.4f",x,y);+ S& b- y# P3 S6 ?& L! B$ U
end proc;# x& A6 x1 E6 U! ?2 P) w

0 ?3 s$ R1 ]/ K% J3 Z* H3 f3 ]! B4 a> niceP(2.4,2002.204);6 Q& N! \+ {4 V" g9 t1 n, R
value of x=2.4000, value of y=2002.2040$ D3 o2 g4 g* U# c
1.4 Maple联机帮助
* A# J- i8 @) [; ~' q% ?9 Q学会寻求联机帮助是掌握一个软件的钥匙. Maple有一个非常好的联机帮助系统, 它包含了90%以上命令的使用说明. 要了解Maple的功能可用菜单帮助“Help”, 它给出Maple内容的浏览表, 这是一种树结构的目录表, 跟有…的词条说明其后还有子目录, 点击这样的词条后子目录就会出现(也可以用Tab键和up, down选定). 可以从底栏中看到函数命令全称, 例如, 我们选graphics…, 出现该条的子目录, 从中选2D…, 再选plot就可得到作函数图象的命令plot的完整帮助信息. 一般帮助信息都有实例, 我们可以将实例中的命令部分拷贝到作业面进行计算、演示, 由此可了解该命令的作用. 2 ]- ^' n2 U5 w
在使用过程中, 如果对一个命令把握不准, 可用键盘命令对某个命令进行查询. 例如, 在命令区输入命令“?plot”(或help(plot);), 然后回车将给出plot命令的帮助信息, 或者将鼠标放在选定的要查询的命令的任何位置再点击菜单中的“Help”即可. + m) F+ ?( C# z, ?
2  Maple的基本运算( B, }! F# L& P% ]* v' c
2.1 数值计算问题
5 S! \4 K) R0 L& W算术是数学中最古老、最基础和最初等的一个分支, 它研究数的性质及其运算, 主要包括自然数、分数、小数的性质以及他们的加、减、乘、除四则运算. 在应用Maple做算术运算时, 只需将Maple当作一个“计算器”使用, 所不同的是命令结束时需加“;”或“:”.
' o! q, |; Z: T  Q* G1 z$ m% q, W在Maple中, 主要的算术运算符有“+”(加)、“–”(减)、“*”(乘)、“/”(除)以及“^”(乘方或幂,或记为**), 算术运算符与数字或字母一起组成任意表达式, 但其中“+”、“*”是最基本的运算, 其余运算均可归诸于求和或乘积形式. 算述表达式运算的次序为: 从左到右, 圆括号最先, 幂运算优先, 其次是乘除,最后是加减. 值得注意的是, “^”的表达式只能有两个操作数, 换言之,  是错误的, 而“+”或“*”的任意表达式可以有两个或者两个以上的操作数. ' ?6 m( v! h; o/ {, Y9 [4 \, v! Y
Maple有能力精确计算任意位的整数、有理数或者实数、复数的四则运算, 以及模算术、硬件浮点数和任意精度的浮点数甚至于矩阵的计算等等. 总之, Maple可以进行任意数值计算.
9 |9 o9 G9 v( |但是, 任何软件或程序毕竟只是人们进行科学研究的一种必要的辅助, 即便它有很多优点, 但也有它的局限性, 为了客观地认识数学软件、认识Maple, 下面通过两个简单例子予以说明. # B; l$ Y' Z8 O' F* P
第一个简单的数值计算实例想说明Maple数值计算的答案的正确性:   
% y( b# \- o4 J( f> 3!!!;
( }" ^/ N0 _" j2601218943565795100204903227081043611191521875016945785727541837850835631156947382240678577958130457082619920575892247259536641565162052015873791984587740832529105244690388811884123764341191951045505346658616243271940197113909845536727278537099345629855586719369774070003700430783758997420676784016967207846280629229032107161669867260548988445514257193985499448939594496064045132362140265986193073249369770477606067680670176491669403034819961881455625195592566918830825514942947596537274845624628824234526597789737740896466553992435928786212515967483220976029505696699927284670563747137533019248313587076125412683415860129447566011455420749589952563543068288634631084965650682771552996256790845235702552186222358130016700834523443236821935793184701956510729781804354173890560727428048583995919729021726612291298420516067579036232337699453964191475175567557695392233803056825308599977441675784352815913461340394604901269542028838347101363733824484506660093348484440711931292537694657354337375724772230181534032647177531984537341478674327048457983786618703257405938924215709695994630557521063203263493209220738320923356309923267504401701760572026010829288042335606643089888710297380797578013056049576342838683057190662205291174822510536697756603029574043387983471518552602805333866357139101046336419769097397432285994219837046979109956303389604675889865795711176566670039156748153115943980043625399399731203066490601325311304719028898491856203766669164468791125249193754425845895000311561682974304641142538074897281723375955380661719801404677935614793635266265683339509760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
4 c$ B. H- P1 k" q  ~3 e% ~/ R" F( W上述运算结果在IBM PC机(1G, 128M)上计算只需要0.01秒, 得到如此复杂的结果(1747位), 一个自然的问题是: 答案正确吗?" @2 ~3 J; c7 Z" f& Z( }; \6 k
为了回答这个问题, 我们借助于数值分析方法, 由Stiring公式7 u! ?1 o- J6 o) z/ m; I
( h5 E' B/ x8 G+ h7 W
可得:  , 前三位数字与Maple输出结果相同, 且两者结果均为1747位. 另外, 在720!的计算中, 5的因子的个数为:   8 P5 L# D, |: T! d
$ p6 w) W) v% q* T
这些5与足够多的2相乘将得到178个0, 而Maple的输出结果中最后178位数为零. 由此, 可以相信Maple结果的正确性. 8 K3 T6 ^0 d9 G% `2 E1 ?
另一个例子则想说明Maple计算的局限性:   8 J/ y4 Z2 E  a5 N  Q% k/ |
  
5 z: V% R# |' s1 A! H: YMaple在处理问题时, 为了避免失根, 从不求算术式的近似值, 分数则化简为既约分数. 因此, 在Maple中很容易得到:   ! R; U; W7 A! S( e# a2 A. {

; d' `3 v0 Q" w  u4 L5 y显然这是错误的. 这一点可以从代数的角度予以分析.
4 H4 x: ~3 G8 M& y5 s- S不妨设 , 则 , 即 , 显然 有3个结果, -2是其实数结果.
: ]; h$ R3 S% a  Y3 \; T9 P: y另一方面, 设 , 则 , 即:/ C( Q- E& x1 N
: _, `2 e0 \. d, e$ Q2 G
显然 有6个结果, -2、2是其实数结果.
0 A- @: K; e9 m& Y这个简单的例子说明了Maple在数值计算方面绝对不是万能的, 其计算结果也不是完全正确的, 但是, 通过更多的实验可以发现: Maple只可能丢失部分结果, 而不会增加或很少给出完全错误的结果(如上例中Maple的浮点数结果皆为 ). 这一点提醒我们, 在利用Maple或其他任何数学软件或应用程序进行科学计算时, 必须运用相关数学基础知识校验结果的正确性. 9 z5 Y0 ]( g  {' B  [1 }8 P
尽管Maple存在缺陷(实际上, 任何一个数学软件或程序都存在缺陷), 但无数的事实说明Maple仍然不失为一个具有强大科学计算功能的计算机代数系统. 事实上, Maple同其他数学软件或程序一样只是科学计算的一个辅助工具, 数学基础才是数学科学中最重要的. 5 d. e' W; ~! B
2.1.1 有理数运算
8 T* n" E$ g) c9 m% a作为一个符号代数系统, Maple可以绝对避免算术运算的舍入误差. 与计算器不同, Maple从来不自作主张把算术式近似成浮点数, 而只是把两个有公因数的整数的商作化简处理. 如果要求出两个整数运算的近似值时, 只需在任意一个整数后加“.”(或“.0”), 或者利用“evalf”命令把表达式转换成浮点形式, 默认浮点数位是10 (即: Digits:=10, 据此可任意改变浮点数位, 如Digits:=20). & t3 \2 L3 ~& ~3 B9 M( \4 X
> 12!+(7*8^2)-12345/125;. h/ E  y6 x) ?2 O" C0 D

  |4 S' F" ^" s> 123456789/987654321;
# B+ Z4 {2 h3 Z6 M $ |7 u+ K5 o- d1 r/ \: ~( L
> evalf(%);
. ~- m6 s+ L4 @( w  }
' _! {5 s& n* i7 l1 P> 10!; 100*100+1000+10+1; (100+100)*100-9;+ c+ F1 C8 @& a) B' I$ e

* u! y5 x! d1 G2 M7 `
  C9 G$ B; V; c; { 0 L0 ~; V6 |8 t' M; f
> big_number:=3^(3^3);. W! z5 k/ ^3 X% L4 m" |1 Y+ a

& L) d* ]5 x+ |- [0 L. _  U6 g> length(%);' _1 n' T1 b+ {; R1 t+ X
! L: L! F# }" |8 x/ g
上述实验中使用了一个变量“big_number”并用“:=”对其赋值, 与Pascal语言一样为一个变量赋值用的是“:=”. 而另一个函数“length”作用在整数上时是整数的十进制位数即数字的长度. “%”是一个非常有用的简写形式, 表示最后一次执行结果, 在本例中是上一行输出结果. 再看下面数值计算例子:   0 v9 A* o4 a% x3 E# D
    1)整数的余(irem)/商(iquo)) m( {  N' \" Z0 }$ S4 ~6 O; c
命令格式:   
1 n+ T7 ]0 ]/ y+ L- C4 ~- F& Yirem(m,n);        #求m除以n的余数
4 v  b1 {  a! o* [irem(m,n,'q');    #求m除以n的余数, 并将商赋给q
0 w* n) H3 `3 J( _3 Piquo(m,n);        #求m除以n的商数
3 l3 N* I# b5 T4 }, h0 Uiquo(m,n,'r');    #求m除以n的商数, 并将余数赋给r! W' {3 ?: O; k3 `9 h# s
其中, m, n是整数或整数函数, 也可以是代数值, 此时, irem保留为未求值. + A1 X& @9 N/ S: S4 c' v) G3 i
> irem(2002,101,'q'); # 求2002除以101的余数, 将商赋给q
$ `2 @1 B( r7 V5 b
0 I  w0 f# ]+ z, W> q; #显示q
' j* N" i0 V0 E  T5 S  x' N
3 \9 d. r  [* s- U% ?> iquo(2002,101,'r'); # 求2002除以101的商, 将余数赋给r. G4 V; P$ b  X
0 {2 k4 e, ~' z6 x4 R) Q  {- k
> r; #显示r1 g; ~% p- h& g' V" D% o3 ~3 U

3 g: R+ N9 Q" N- @> irem(x,3);
' G8 g  v- ]% N4 U5 w8 Q! [ 5 V3 q$ G' M4 J; {6 Z5 p
2)素数判别(isprime)% ^/ V) J7 p% a& _' G3 M8 v- E
素数判别一直是初等数论的一个难点, 也是整数分解问题的基础. Maple提供的isprime命令可以判定一个整数n是否为素数. 命令格式: isprime(n); % _, P2 y1 n" F' `
    如果判定n可分解, 则返回false, 如果返回true, 则n“很可能”是素数.
0 r" Z6 f( t4 s% ^$ N7 N, ~> isprime(2^(2^4)+1);
3 @) n) E5 D2 R. Z1 `
5 V" `2 I* x8 d9 `> isprime(2^(2^5)+1);
+ P3 z' S# H1 v% X1 b' Z 4 O$ R) f& J3 ~6 N
上述两个例子是一个有趣的数论难题。形如 的数称为Fermat数, 其中的素数称为Fermat素数, 显然, F0=3、F1=5、F2=17、F3=257、F4=65537都是素数. Fermat曾经猜想所有的Fn都是素数, 但是Euler在1732年证明了F5=641•6700417不是素数. 目前, 这仍是一个未解决的问题, 人们不知道还有没有Fermat素数, 更不知道这样的素数是否有无穷多. / m, Z7 G+ ]2 q, G2 N7 W+ `
3) 确定第i个素数(ithprime)
: y  s% b! z# S3 v$ v若记第1个素数为2,判断第i个素数的命令格式: ithprime(i);    . |$ V% q  p  k5 C; S8 X
> ithprime(2002);
0 N8 R. C: \8 {% f+ j- t, z
  [& q. @4 e( `( v! v! o, H9 P> ithprime(10000);
! ~7 c! o9 Y. m5 l/ V2 [) u
* M) C6 ?. g6 O0 o4) 确定下一个较大(nextprime)/较小(prevprime)素数
7 _3 g( X% y2 S8 ]8 ]当n为整数时,判断比n稍大或稍小的素数的命令格式为:   
* W  r' G, r2 w8 ^( F$ t9 i1 [$ @1 |nextprime(n);  
, t* E! D8 P3 }$ ^prevprime(n); % C* h4 T9 ]" e: g- Z, l" V
> nextprime(2002);+ b" W' i/ k* P) b0 J# Q4 B

+ \7 q" _3 R% [) |( S> prevprime(2002);
) O: w. Z1 P5 S( r 4 g1 l) Q; E! b( B3 s/ C- R) g
5) 一组数的最大值(max)/最小值(min)
( m7 \* |. u) l% M- t/ `; Z% O3 I命令格式: max(x1,x2,…,xn);   #求x1,x2,…,xn中的最大值
9 `1 @4 W* f$ S+ i             min(x1,x2,…,xn);   #求x1,x2,…,xn中的最小值
- H" _1 U" j( D( r> max(1/5,ln(3),9/17,-infinity);
$ r/ b& x# V4 {- I7 _0 F' } $ X  X8 y& \! {1 l
> min(x+1,x+2,y);
2 b) f, f* _0 B! \* O . v8 @# I" B+ s1 j
6)模运算(mod/modp/mods)- U$ l* t" |2 ^8 a
命令格式:  e mod m;    # 表达式e对m的整数的模运算- @; |2 t# e8 ?( Q3 i' g( T) ]
modp(e,m);  # e对正数m的模运算" G. v2 L- X1 F
mods(e,m);  # e对m负对称数(即 -m)的模运算) Q" H4 l1 Z3 [  n
`mod`(e,m);  # 表达式e对m的整数的模运算, 与e mod m等价9 E2 z/ H: V3 ^/ x: |
值得注意的是, 要计算i^n mod m(其中i是一整数), 使用这种“明显的”语法是不必要的, 因为在计算模m之前, 指数要先在整数(可能导致一个非常大的整数)上计算. 更适合的是使用惰性运算符“&^”即: i &^n mod m, 此时, 指数运算将由mod运算符智能地处理. 另一方面, mod运算符的左面优先比其他运算符低, 而右面优先高于+和-, 但低于*和/. 6 ]4 ?0 T0 Y" ^* [) V, w* o
> 2002 mod 101;
8 [+ |9 p( W- `. V) z
2 e3 H/ ]/ w$ O. Y. s> modp(2002,101);
6 [! c8 i2 Z1 S
/ ~! g, @  P  Z. }> mods(49,100);) `/ K. ~2 v/ P
5 j$ B! v" N3 L& n$ D$ C
> mods(51,100);9 H( \6 P: Y9 t( n8 ~

, q: P" j  V. t> 2^101 mod 2002;  # 同 2 &^101 mod 2002;
+ r1 C4 w: V. \0 o/ P" _/ H, @* V
. [3 f9 t0 T5 x: @0 r' ^5 B2 _7)随机数生成器(rand)1 x6 R0 d, }/ j8 j) ^+ V5 C
命令格式:   
; A7 l3 B" O9 d  J& f. c! Xrand( );    #随机返回一个12位数字的非负整数
& x3 [0 \2 e5 _: J# ?8 m+ v. X2 _( ^rand(a..b);  #调用rand(a..b)返回一个程序, 它在调用时生成一个在范围[a, b]内的随机数
+ ~0 f! \0 D( ?2 }4 v) D; A> rand();
4 H  l% [; N! Z+ f( g
6 J, _0 a+ d9 n+ ~> myproc:=rand(1..2002):
+ H; c$ d& C1 x  Q% `> myproc();* U1 l) m7 U( A& v: Y' R
- n3 M+ t, k! T- Q" b
> myproc();
" D) G( T' U( c/ Y1 j 7 T. c. E+ W  r
    注意, rand(n)是rand(0..n-1)的简写形式.
! J. H# R# c: Q) t1 w9 r2.1.2 复数运算
7 X" v" |! r! a. v复数是Maple中的基本数据类型. 虚数单位i在Maple中用I表示. 在运算中, 数值类型转化成复数类型是自动的, 所有的算术运算符对复数类型均适用. 另外还可以用Re( )、Im( )、conjugate( )和argument( )等函数分别计算实数的实部、虚部、共轭复数和幅角主值等运算. 试作如下实验:   " u7 x) Q& U7 V, q% H1 G
> complex_number:=(1+2*I)*(3+4*I);
( \; l7 W* F; f* W1 M. \ 1 r: M1 A2 U# h5 T7 X
> Re(%);Im(%%);conjugate(%%%);argument(complex_number);! z3 C- q- z- Y9 I
1 v( b# ~, R! L" L. e

7 K# g9 f9 _$ t- ^" J+ o; n$ O, } % W2 h& Y& p9 ~$ J

8 d# p4 i5 N; V! x5 j值得注意的是上行命令中均以“;”结束, 因此不能将命令中的2个%或3个%(最多只能用3个%)改为1个%, 因为%表示上一次输出结果, 若上行命令改为“,”结束, 则均可用1个%.
  H- q# I6 y% j& {为了在符号表达式中进行复数运算, 可以用函数evalc( ), 函数evalc把表达式中所有的符号变量都当成实数, 也就是认为所有的复变量都写成 的形式, 其中a、b都是实变量. 另外还有一些实用命令, 分述如下:   8 _" x* u8 ?: b( b1 U
1) 绝对值函数
( y3 F/ W9 Z9 D命令格式: abs(expr);    m. J& R% n) H7 g4 w( [
当expr为实数时,返回其绝对值,当expr为复数时,返回复数的模.( ?9 L) }9 S, z8 y. K! q- [7 f4 `
> abs(-2002);    #常数的绝对值9 [$ [4 J6 T% }! z; s/ z

( K' q8 p5 V1 a) p& h> abs(1+2*I);   #复数的模  [! i0 W' R& v% J) J1 u

6 a% }5 m3 d6 G) z' z, k> abs(sqrt(3)*I*u^2*v);  #复数表达式的绝对值$ u8 e/ B. n; |) h3 |- b
! C2 e1 z. D8 J" C! ]& K5 w2 ?- n
> abs(2*x-5);   #函数表达式的绝对值5 l* Q! G( Y+ A: p, E; K
/ f& z* T! N$ C4 g, m9 g
2)复数的幅角函数
1 L4 Q* ^1 T" g. T) C) H$ i命令格式:   argument(x);  #返回复数x的幅角的主值/ }0 P  ^& L" B& K; N) s% ^
> argument(6+11*I);
2 K0 n) ]- W" X( X! q5 ?* F  V8 J; V. _
# i. L- U2 S9 _> argument(exp(4*Pi/3*I));
2 R# L1 M9 F3 U- R. t- l7 j2 Z: ^8 o/ p
  q' |% H( ?1 I& x2 j; Q3)共轭复数
# `# v5 H* E/ y1 b2 e6 I命令格式:   conjugate(x);  #返回x的共轭复数. l& x- q0 E* M- Q( q! D
> conjugate(6+8*I);
9 k: C5 ^7 _* g. \3 Q3 v + _/ P- K( O- B) @' O( n) B3 z
> conjugate(exp(4*Pi/3*I));. m4 P7 g9 i0 J
; h- p% Z/ ^9 b+ k, n) l& @+ s) Q
2.1.3 数的进制转换
' M% @$ m: _6 A, S( H) Y1 a数的进制是数值运算中的一个重要问题. 而在Maple中数的进制转换非常容易, 使用convert命令即可. 3 q' Y# F' E0 g0 P
命令格式:   convert(expr, form, arg3, ...);    * i+ d" s7 B& Y  v; s- Y/ Q$ _
其中, expr为任意表达式, form为一名称, arg3, ... 可选项.
  ~+ b! ]% q# h9 l下面对其中常用数的转换予以概述. 而convert的其它功能将在后叙章节详述. & T8 S/ q  a1 m/ V( v2 L; X
    1)基数之间的转换
& s+ Y1 A' b1 @  h& H! C命令格式:   
5 ]' ^. n% s- T  rconvert(n, base, beta);      #将基数为10的数n转换为基数为beta的数; k) g1 I; `2 m- A2 F% L, k9 g' l
    convert(n, base, alpha, beta);#将基数为alpha的数字n转换为基数为beta的数
/ V% k: l/ F4 u  Z. `! j0 b> convert(2003,base,7); #将10进制数2002转换为7进制数, 结果为: (5561)7+ i8 k( s4 M) r$ m" a1 _8 f# E7 a6 ~

- H6 O! x5 ~$ {( m% o' O2 _8 o> convert([1,6,5,5],base,7,10); #将7进制数5561转换为10进制数. F% l, h- O1 l, D7 O; j

: a1 y& k* t* J& s$ L* v> convert(2002,base,60);       #将十进制数2002转换为60进制数, 得33(分钟)22(秒)0 N5 j! ?1 i: S
# f4 C0 n1 a0 @9 r. C, A" G! v4 s
    2)转换为二进制形式
7 V* m. ?/ B9 t$ Y7 S命令格式: convert(n, binary);
& l+ X3 H4 J( t+ V& F1 P其功能是将十进制数n转换为2进制数. 值得注意的是, 数可以是正的, 也可以是负的, 或者是整数, 或者是浮点数, 是浮点数时情况较为复杂.
  J/ |# N' a7 h7 |) a3 W6 J> convert(2002,binary);   5 ^8 j: p8 E3 Z+ l$ U* n0 z+ u" B

2 N" M8 a0 R$ G+ j8 ]> convert(-1999,binary);
8 H$ q" X; ^6 Q7 [6 ]/ T
% U# r$ S$ {& N. ^> convert(1999.7,binary); " ~# }; z8 u- b' o/ b, X  b
5 o  v2 s' [# ~0 C- \
3)转换为十进制形式( E8 _+ {9 v* `1 n1 X1 z
其它数值转换为十进制的命令格式为:   & c9 B3 f7 f' O1 j3 e7 _# a6 a
convert(n, decimal, binary);   #将一个2进制数n转换为10进制数
( l+ Z' }( Z- L( t9 z; m9 b+ ]9 ]! C4 F    convert(n, decimal, octal);    #将一个8进制数n转换为10进制数
( o: n% l9 j; l    convert(string, decimal, hex);  #将一个16进制字符串string转换为10进制数
2 v. W# c1 [9 L8 l3 Q: p> convert(11111010010, decimal, binary);    + K# k" F! E# c! J3 ^& T0 o$ S) P

; f: D, Z) @3 ^, G4 s9 Y6 g> convert(-1234, decimal, octal);           / a) s7 n$ r' M6 G5 s

' f- B  m/ _3 ?. c: r> convert("2A.C", decimal, hex);          # ]3 K/ l7 _( r) g- u
# b  t& p9 s! b* V
4) 转换为16进制数
+ b! v5 O8 N1 C  D将自然数n转换为16进制数的命令格式为: convert(n, hex);   
. w! t. ?+ G1 D9 X1 E" v> convert(2002,hex);  convert(1999,hex);7 ~5 h9 Q  [5 Q2 y" T' o# I8 }
+ p4 ?( R$ x3 |

% r/ G0 w4 u& Y- v5)转换为浮点数" p" v4 P2 P2 i: }# S# u8 ]+ k
命令格式: convert(expr, float);7 }6 p9 K: L/ C. @# b5 f) I
注意, convert/float命令将任意表达式转换为精度为全局变量Digits的浮点数, 且仅是对evalf的调用.
$ K/ h$ i: F( n2 n> convert(1999/2002,float);5 {" t: C# x1 M  d
9 ^" j$ R: p" y& V2 y
> convert(Pi,float);
+ o. R7 P. o& i# J
0 {' e5 t+ G. ]% ]9 g2.2 初等数学
( v, |* {( }6 t0 U7 y. }* y    初等数学是数学的基础之一, 也是数学中最有魅力的一部分内容. 通过下面的内容我们可以领略Maple对初等数学的驾驭能力, 也可以通过这些实验对Maple产生一些感性认识. 4 ]4 F4 n( ^  V: `' j
2.2.1 常用函数  N2 O( y* Z* g: q5 a
作为一个数学工具, 基本的数学函数是必不可少的, Maple中的数学函数很多, 现例举一二如下:   % ^  G% Z2 y; X5 J7 N
指数函数: exp
4 B0 K; q9 r3 x" I7 l1 A5 h, K一般对数: log[a], v6 x; a' A/ F4 F; Y& A
自然函数: ln6 C4 C) R! Q, d* [7 u4 q1 V* ~
常用对数: log109 S1 E  ?2 k- E2 T' w
平方根: sqrt( J9 n2 ]8 y0 K7 I" O* _, |
绝对值: abs8 s0 @5 U4 E4 z5 i$ R$ v
三角函数: sin、cos、tan、sec、csc、cot
4 O" r& T, i" [  k3 O反三角函数: arcsin、arccos、arctan、arcsec、arccsc、arccot% _% L; c5 o2 X* g
双曲函数: sinh、cosh、tanh、sech、csch、coth
7 ?: R# E# T9 O4 X% _+ i- S' B反双曲函数: arcsinh、arccosh、arctanh、arcsech、arccsch、arccoth; v5 M+ q& [  m* u( B
贝赛尔函数: BesselI、BesselJ、BesselK、BesselY4 y. E# y* C$ ?6 A7 @* M; X# u1 ]
Gamma函数: GAMMA. v5 i8 C% a' P3 ^; O
误差函数: erf- Q4 z3 j, s. I# ~
函数是数学研究与应用的基础之一, 现通过一些实验说明Maple中的函数的用法及功能.
8 H" q1 a8 Q9 I( ?* P4 Y, ~1) 确定乘积和不确定乘积
: e0 G# h/ _& ]7 J( q命令格式: product(f,k);  8 z1 Q8 t: }- [1 \" x! o
product(f,k=m..n);  
  ]  T( W/ H1 ~- `% E' P+ I. w. pproduct(f,k=alpha);
7 v& u- g1 y% ?% o8 Vproduct(f,k=expr);  U# S7 ^7 D! l9 f! L
其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—包含k的任意表达式. 6 b+ M; W& f7 V% v& C* i* ?$ s. a6 \
> product(k^2,k=1..10);   #计算 关于1..10的连乘
" E$ r3 j. _5 I6 {! \! y) K
& x& e8 g6 q' x) F> product(k^2,k);         #计算 的不确定乘积. w: q, U& s% J6 |& x1 X, H* y# ~

8 Z! t  ]3 o2 x/ j! Q  Q3 Y' ~> product(a[k],k=0..5);    #计算ai(i=0..5)的连乘# Y3 ~! k7 M, X" |. O. F

0 f+ [; b% m! H4 B) J; d> product(a[k],k=0..n);    #计算ai(i=0..n)的连乘2 [3 r2 t9 {& M
: Z' o: o$ M' g9 \5 |
> Product(n+k,k=0..m)=product(n+k,k=0..m);   #计算(n+k)的连乘, 并写出其惰性表达式0 b2 b3 P6 }& n; ]# p& W, a/ w
$ M- ?. z8 [9 ]! P: \: x5 @$ \% M
> product(k,k=RootOf(x^3-2));     #计算 的三个根的乘积
3 P* C, Q+ g4 D( s$ Y/ _
0 n; I9 f, Q5 ~1 p- Y) i$ ?    product命令计算符号乘积, 常常用来计算一个公式的确实或不确实的乘积. 如果这个公式不能求值计算, Maple返回 函数. 典型的例子是:   
& s0 I5 `$ A4 x2 `> product(x+k,k=0..n-1);
8 `$ r2 }& Y' w$ r- D" F
) d7 X; Q5 F4 R! G2 e0 W如果求一个有限序列值的乘积而不是计算一个公式, 则用mul命令. 如:   ( q* T/ Z6 M1 [8 V5 y, m* U. Q! d" o
> mul(x+k,k=0..3);3 r# `- V, }6 J+ I

1 C- y; L! K% s1 U# V2)指数函数6 X& Z8 Y# n9 Q' @& m4 b  a9 N
计算指数函数exp关于x的表达式的命令格式为: exp(x);
- z! x2 e0 e! d& W0 f4 A> exp(1);
0 l, S! g: n2 M: [9 O% _' |3 `- q
0 G1 b& D, X7 L3 }% h% [) W> evalf(%);
# L4 d* F: i- i4 t, Z: R9 G! l$ q
% n# |5 N- \' F2 y' Q> exp(1.29+2*I);3 v' n) V9 a% b* E4 q' t
1 \+ Z( F/ Z( B, S9 J, }1 c
> evalc(exp(x+I*y));& y4 J/ v* G$ |5 i- h5 F( }

6 `! R" U' z  p3 k! T: r& }! s. f3 y3)确定求和与不确定求和sum
6 T$ c& z; G8 U- c, D0 o命令格式: sum(f,k);  
0 C/ ^1 p) b. B* jsum(f,k=m..n);  
5 }$ f# |1 A9 I- Esum(f,k=alpha);
; B$ w3 P4 D7 s& r$ @* W( bsum(f,k=expr);
$ v. t0 }. n! ?5 R其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—不含k的表达式.
! l& ~6 H4 v# y- ~0 j> Sum(k^2,k=1..n)=sum(k^2,k=1..n);5 @9 A& e: E* x  V

0 _. R# k& J; C/ p3 a, C> Sum(k^3,k=1..n)=sum(k^3,k=1..n);
! ?0 y" f8 F3 G) \3 |5 g & p9 I$ b- ]8 w
> Sum(k^4,k=1..n)=sum(k^4,k=1..n);  Q' X* E! ~4 B; `4 L, z! P

" J% r9 F  h& y, B; Q$ b0 p6 P> Sum(1/k!,k=0..infinity)=sum(1/k!,k=0..infinity);
" S6 [6 y% W" w* d
( W! [/ L/ _/ p6 {9 e  k> sum(a[k]*x[k],k=0..n);
/ H" ~5 x, O9 K8 M5 T6 Z6 D) }( O
+ Q. Y" H" @, N' _* k> Sum(k/(k+1),k)=sum(k/(k+1),k);
) O; t( G5 {1 P6 R/ {5 C2 R " Z: n0 f5 E% i: y3 n
> sum(k/(k+1),k=RootOf(x^2-3));
: r4 w. D2 [" q9 Q. P4 B - z7 `' J, S" ?5 Q1 @
sum函数可计算一个公式的确定和与不确定和, 如果Maple无法计算封闭形式, 则返回未求值的结果. 值得注意的是, 在sum命令中将f和k用单引号括起来, 可避免过早求值. 这一点在某些情况下是必需的. ; E( m/ Q1 }4 h& p9 I/ X
> Sum('k','k'=0..n)=sum('k','k'=0..n);: b( i8 D  {; D7 m
: c; g2 A. H& q3 c% E+ h
如果计算一个有限序列的值, 而不是计算一个公式, 可用add命令. 如:   
6 i  [9 w% S- t: t% u> add(k,k=1..100);
; `% C5 p8 g  s2 N: l0 ?3 M 2 w6 c( s- x' n0 K7 L4 g2 I
尽管sum命令常常用于计算显式求和, 但在程序设计中计算一个显式和应该使用add命令. $ `4 D* z; s/ }# {
另外, sum知道各种求和方法, 并会对各类发散的求和给出正确的结果, 如果要将求和限制为收敛求和, 就必须检查显式的收敛性. & Y8 z3 h* w& f! s" X
3)三角函数/双曲函数
, T; [. Q  b3 d/ h# W0 `命令格式:   sin(x);   cos(x);   tan(x);   cot(x);   sec(x);   csc(x);5 M: F3 D- ]' o9 ?$ ]2 n
          sinh(x);  cosh(x);  tanh(x);  coth(x);  sech(x);  csch(x);, w+ s/ c  i' X
其中, x为任意表达式. * x$ Q2 f, J3 |* |% v: S; s: i) A' @5 Q
值得注意的是三角函数/双曲函数的参数以弧度为单位. Maple提供了利用常见三角函数/双曲函数恒等式进行化简和展开的程序, 也有将其转化为其它函数的命令convert.7 A! {2 u: g: Z
> Sin(Pi)=sin(Pi);
2 v: l1 y% e" U5 J* S: g 0 h: d, l( K! B. s+ N
> coth(1.9+2.1*I);9 I6 G$ R$ A0 R, @- D& b

1 R. h5 }0 A. ?9 s* m4 y) f# M! ?> expand(sin(x+y));     #展开表达式
# }, _9 y# z/ C0 n: t' E  u2 R
( J. j' o- k. A6 w> combine(%);        #合并表达式
: n. U4 W! O6 L4 M5 p0 B' t
( O1 A5 D6 `! Y' W: V7 b+ x6 `% N> convert(sin(7*Pi/60),'radical');* v! T9 N5 u' L- M) Q5 ]8 ?0 b

* T' O6 J/ d8 `! l2 R> evalf(%);
9 L' h7 J1 z/ A+ t0 j/ i - l( }' |" n+ A/ J
但有趣的是, combine只对sin, cos有效, 对tan, cot竟无能为力.# n+ S9 P% \% |& N1 f
4)反三角函数/反双曲函数7 t& F7 }7 ~. Q/ @
命令格式: arcsin(x);   arccos(x);   arctan(x);   arccot(x);   arcsec(x);   arccsc(x);; U6 _8 r/ X& O) b3 p
     arcsinh(x);  arccosh(x);  arctanh(x);  arccoth(x);  arcsech(x);  arccsch(x);   6 h. D5 e- g7 V: m' P
arctan(y,x);
& Y( ]' g+ R5 @! p# I其中, x, y为表达式. 反三角函数/反双曲函数的参数必须按弧度计算.
& S! T- p; J) A- ~算子记法可用于对于反三角函数和反双曲函数. 例如, sin@@(-1)求值为arcsin.
+ ]& g" D+ X& i. w' i& k1 w> arcsinh(1);% L( ^- r. Z. ]* W" n. M6 a" |) P

/ c% A2 P6 d3 _- ]! n> cos(arcsin(x));
: C0 h" I5 D+ y- }# v( w4 Z; P* f + `1 F" G# P) i5 @7 i
> arcsin(1.9+2.1*I);* j" Z' E# f: K0 ?+ ~% `  D9 ~

: E' h. _6 T1 I8 q, h5)对数函数
: ^) X, _1 r& R6 ~8 Q# d命令格式: ln(x);           #自然对数! z" R  Z' h8 X1 S1 i/ Z
log[a](x);        #一般对数7 M! }; w7 F8 b0 ]# `- [- O9 V5 F
log10(x);        #常用对数' f; s% R& `# Z% ^/ P
一般地, 在ln(x)中要求x>0. 但对于复数型表达式x, 有:   
) _9 C' @) \* S9 f4 Z' ?  (其中,  )5 G5 R( {1 d: s
> ln(2002.0);
# c9 u0 p$ L0 E2 m  Y$ e$ k& T2 \+ ^ " T* t/ o6 w9 G  I' }
> ln(3+4*I);8 F& A9 [( Y. c+ x
* W) q' F! |3 P
> evalc(%);    # 求出上式的实部、虚部6 s  F: f% C9 c% `# ~

* C8 O$ U# O( k% `> log10(1000000);
3 g. i0 c+ z' t# N) j0 I/ U
. b1 h- }  ^; `2 k% ]: d> simplify(%);   #化简上式# ?% d$ Y. {9 m: e/ r- y
% w$ a, l) [0 p0 O( P4 e
2.2.2 函数的定义5 [" _$ e9 t# f! V. H" u0 g
Maple是一个计算机代数系统, 带未知或者已知字母变量的表达式是它的基本数据形式. 一个简单的问题是, 既然表达式中可以包含未知变量, 那么它是不是函数呢?试看下面一个例子:   
! F% |' a. ^6 ?0 Y. N* P> f(x):=a*x^2+b*x+c;
5 @1 }" G' s" A0 ]9 f" I
* v0 s# E, h9 t$ [: t可以看出, Maple接受了这样的赋值语句, 但f(x)是不是一个函数呢?要回答这个问题,一个简单的方法是求函数值:   
  U& q# S+ ~1 ~4 {) |% H- W% P> f(x),f(0),f(1/a);
  p7 k* Q9 l4 e, e$ V1 | 4 E) i$ b3 O) j: n: A) `/ Z
由上述结果可以看出, 用赋值方法定义的f(x)是一个表达式而不是一个函数, 因为f(x)不能把所定义的“自变量”或者“参数”转换成别的变量或表达式. 但从赋值“过程”可以看出, f(x)虽然也算是一个“函数”, 但却是一个没有具体定义的函数:   
8 I: P3 Z5 q6 L9 E; Z/ l> print(f);7 x* @7 L" c% V5 o% f5 p
( \+ z) f3 C0 t! a
事实上, 我们所做的赋值运算, 只不过是在函数f的记忆表(remember table)中加入了f(x)在x上的值, 当我们把自变量换作0或1/a时, f(x)的记忆表中没有对应的表项, 所以输出结果就是抽象的表达式.
3 l+ q  y7 {) U! H& v在Maple中, 要真正完成一个函数的定义, 需要用算子(也称箭头操作符):   ; \3 x' m2 |. y- z! L
> f:=x->a*x^2+b*x+c;
, E" l  i' [; o4 w9 s3 F6 s4 C
$ Y" Z5 H" ~9 \# Z> f(x),f(0),f(1/a);
# K  Y3 \' L" y7 c
. q  e" x6 i( t0 J3 k0 @+ V多变量的函数也可以用同样的方法予以定义, 只不过要把所有的自变量定成一个序列, 并用一个括号“()”将它们括起来(这个括号是必须的, 因为括号运算优先于分隔符“,”).
& G  _0 N8 O' j6 a1 J> f:=(x,y)->x^2+y^2;! h4 @1 E' H+ G, w' G
3 ?# P" B8 H2 s1 O
> f(1,2);
; ^1 `( p7 u; i; P/ p) W% j% p; ]
- b, a2 E, t/ L0 Y: M2 K- u> f:=(x,y)->a*x*y*exp(x^2+y^2);
- K* O+ C/ |: C6 S
- H. H8 w9 r8 Q: r+ R- W1 `综上所述, 箭头操作符定义函数的方式一般为:   8 i7 S. R$ s5 T$ e0 D3 R. b+ R6 M% [
一元函数: 参数->函数表达式
8 M! @" |  \( R; d7 ?+ e. k多多函数: (参数序列)->函数表达式
* E( o( _+ r2 ~无参数函数也许不好理解, 但可以用来定义常函数:   
* z+ k# @  f# z9 x> E:=()->exp(1);
/ n* g! i" ^$ s8 E0 e9 a; S $ v0 U+ A& D7 a& y, U% }
> E();5 x" ^( [2 E; N
* R# |: I! N. M6 C' X
> E(x);
+ y6 O. _' @5 K) W) [6 J) }( v, j ! H; G9 V( E6 V
另一个定义函数的命令是unapply,其作用是从一个表达式建立一个算子或函数.
5 D' y) l: {5 f! k+ k% g" a定义一个表达式为expr的关于x的函数f的命令格式为:  f:=unapply(expr, x);          * B/ s, K# B. |4 J7 a
定义一个表达式为expr的关于x,y,…的多元函数f的命令格式为:  f:=unapply(expr, x, y, …);     
4 L! e9 X0 G7 n- c1 X, I0 ~' v1 q. U> f:=unapply(x^4+x^3+x^2+x+1,x);
6 [' N8 ~# x# H% S# |- L- M
+ U' ^0 v2 V, c; Y; I> f(4);
& U( M$ }4 z* e1 s% q$ j% W7 ? 4 f; u! p( R- a) x' Q
> f:=unapply(x*y/(x^2+y^2),x,y);: c# s' ?% i" n# c1 T/ h
5 c- f7 x. ]* g  P2 U7 C
> f(1,1);( g- \2 Y4 n, X+ z/ A8 V

; D. m/ w2 _- z3 z; ]借助函数piecewise可以生成简单分段函数:! P1 m6 ]- F6 S& }% w# u3 M
> abs(x)=piecewise(x>0,x,x=0,0,x<0,-x);
: k8 g% f9 I' |& m
$ p% Z: ^: x, C7 n# v清除函数的定义用命令unassign. + n* T9 G. Y9 [' i
> unassign(f);% F* `9 H) x' |9 U% e
> f(1,1);
: d, }$ r/ T- ^2 N
, c; q1 }, H/ d) ~. m除此之外, 还可以通过程序设计方式定义函数(参见第6章). 5 G/ U2 h" I3 q4 g6 b8 [$ [, k
定义了一个函数后, 就可以使用op或nops指令查看有关函数中操作数的信息. nops(expr)返回操作数的个数, 函数op的主要功能是获取表达式的操作数,其命令格式为:+ n7 {' q$ d# N+ T- z
op(expr);         
) ?* m% n- J5 c$ Z# ^/ M3 d' Lop(i, expr);         
' ]3 K7 i. U5 y% K( }op(i .. j, expr);      
6 I: h, |8 @! _- i7 B0 Rnops(expr);
/ W/ T; k: n7 f3 k- X; v如果函数op中的参数i是正整数,则op取出expr里第i个操作数, 如果i是负整数, 则其结果为op(nops(expr)+i+1, expr); 而i=0的情形较为复杂, 当expr为函数时, op(0, expr)返回函数名, 当expr为级数时, 返回级数的展开点(x-x0), 其它数据类型, op(0, expr)返回expr的类型.
+ R' @* m1 p+ U, t- q- G' @命令op(i .. j, expr); 执行的结果是expr的第i到第j个操作数, i..j中含负整数时的情形同上.5 ]9 z: `4 g' X+ X# s" H' R- d/ U' S# n+ g" _
命令op(expr); 等价于op(1..nops(expr), expr);
( n0 w1 ?' c2 l! i9 ?& V# L特别地, 当op函数中i为列表[a1, a2, ..., an], 则op([a1, a2, ..., an], expr); 等价于op(an, op(..., op(a2, op(a1, e))...)); 1 ^0 I* Y: W0 A/ u
而当expr为一般表达式时,nops(expr)命令返回的是表达式的项数, 当expr是级数时返回级数每一项的系数和指数的总和.
& R' C* X! |, D) |+ n& n* Y> expr:=6+cos(x)+sin(x)*cos(x)^2;
0 Z2 s9 T8 u: q7 r8 c ) E5 h$ Q9 Y2 @- L
> op(expr);
6 u( M7 P, o4 V, O $ a! l$ W3 _7 Z; i
> nops(expr);
1 {( |" Z( i2 q/ m3 C; y# q1 u + F3 j' w" p0 b0 c' ]9 o
> p:=x^2*y+3*x^3*z+2;
: k1 K0 @1 {- l9 q$ v
" r( r$ b2 k5 t% {> op(1,p);. p6 f. P9 O% q- J% W8 d2 `; q

" `5 g& V+ f: r> op(1..nops(p),p);
; E" Y% c6 \% t6 [1 |5 K1 S1 F
$ P" L/ E. g6 N- A. C7 i; h+ v> op(op(2,p));
! G6 b. z: s9 E2 H5 O& t$ ~0 x% `6 G: Q: u# J
3 t% r! z& D- K2 U6 U# W> u:=[1,4,9];
- h- u9 i0 C2 g8 w
5 O! j8 X6 Q* m9 j> op(0,u);
. w7 v/ G3 @! I4 a7 N / x7 c8 l) ?9 e' e9 U4 i
> s:=series(sin(x),x=1,3);. w) d8 o5 n/ H" t2 c
4 Q8 }9 v+ u9 n
> op(0,s);6 J) v/ K0 i) K4 V
        * t0 ]/ M8 e# J* u; K
> nops(s);
+ h. k9 v7 Q- o& _( o9 a
) O6 ?0 b: k7 Z1 u2 }下面一个有趣的例子说明了Maple在处理算术运算时的“个性”:
3 d0 [- F/ x: B8 s% {) N> op(x*y*z);$ \% G2 d& x3 u- c  _

" k2 \0 t* l7 O4 c> op(x*y*z+1);# S6 w- p, p: I$ \, ^! |/ F' [, y

' w: L  [, C" \+ l2.2.3 Maple中的常量与变量名" A1 Z6 f: {+ J, G! X8 i" l( X
为了解决数学问题, 一些常用的数学常数是必要的. Maple系统中已经存储了一些数学常数在表达式序列constants中:   
5 C) I/ _8 J1 Z! A' F8 m> constants;
& J' A1 c& {9 n$ f+ O % J+ _- p- S2 G  U& ]- U
为了方便使用, 现将上述常数的具体含义列示如下:   * B" K' d- V0 M; B2 m
常    数        名 称        近似值7 v, I& f4 v% v. M8 J
圆周率
# u; S  ]- ~7 m5 N% T- l' `Pi        3.1415926535
" q. Z$ {- [( h" a& HCatalan常数
4 h9 }. r" T5 o& l$ gCatalan        0.91596559426 b7 b% X2 |/ {0 C/ }
Euler-Mascheroni常数 + r- [8 w. R# V4 ~6 a
gamma        0.5772156649
0 ], u! w' m) D8 |0 x
5 R  y* b" i6 a: qinfinity        3 K0 s6 \/ ~; c+ r; A
8 _& }3 i& @( N! L& X9 X8 |( I- _" b
需要注意的是, 自然对数的底数e未作为一个常数出现, 但这个常数是存在的, 可以通过exp(1)来获取.
7 M# u. ^/ B6 S% R* V在Maple中, 最简单的变量名是字符串, 变量名是由字母、数码或下划线组成的序列, 其中第一个字符必须是字母或是下划线. 名字的长度限制是499个字符. 在定义变量名时常用连接符“.”将两个字符串连接成一个名. 主要有三种形式: “名.自然数”、“名.字符串”、“名.表达式”. 6 v0 V/ c  @- O. W5 q
值得注意的是, 在Maple中是区分字母大小写的. 在使用变量、常量和函数时应记住这一点. 数学常量 用Pi表示, 而pi则仅为符号 无任何意义. 如g, G, new_term, New_Team, x13a, x13A都是不同的变量名. ; R% B! w3 b  z! E, N
在Maple中有一些保留字不可以被用作变量名:   3 X7 H" \4 U8 @1 Z
by      do      done     elif     else     end        fi        for      
( G! l  d& b* R1 e3 ]1 ]% nfrom    if       in       local     od     option    options     proc         
. Y; L$ I# w- Q0 u9 gquit    read     save     stop     then     to        while      D* @# V' N" l4 }
Maple中的内部函数如sin, cos, exp, sqrt, ……等也不可以作变量名.
8 U( f% N; s3 \4 z- z4 m3 _, w另外一个值得注意的是在Maple中三种类型引号的不同作用:   $ A5 J* e! i, s% G' a
`  `:   界定一个包含特殊字符的符号, 是为了输入特殊字符串用的;   
' ?4 h- p* P$ _$ G'  ':   界定一个暂时不求值的表达式;   
8 ]/ b3 Q; P% E" n8 |( R1 P3 r"  ":   界定一个字符串, 它不能被赋值. - x" T; t: |$ g: A4 Z* W4 f8 @
2.2.4 函数类型转换           
- D0 ~; s/ P1 T/ w函数类型转换是数学应用中一个重要问题, 譬如, 将三角函数转换成指数函数, 双曲函数转换成指数函数, 等等. 在Maple中, 实现函数类型转换的命令是convert. 命令格式:  
9 n8 U2 L0 G( p6 Y- i    convert(expr, form);        #把数学式expr转换成form的形式1 z$ }% U& w: a* K7 X
convert(expr, form, x);      #指定变量x, 此时form只适于exp、sin、cos5 P9 l; b: a; ~! s6 W1 k
convert指令所提供的三角函数、指数与函数的转换共有exp等7种:   
  W& V' Z: {6 K8 q4 V8 M(1) exp: 将三角函数转换成指数
6 M8 f; }0 y$ d3 c6 v/ T* M(2) expln: 把数学式转换成指数与对数
3 ^' e. j! h  c5 m6 H, v0 q) m. x(3) expsincos: 分别把三角函数与双曲函数转换成sin、cos与指数的形式: u3 ^/ U& d8 D1 }6 q, S: S' ~) V
(4) ln: 将反三角函数转换成对数& O) u: Y3 |  U$ N# [7 L
(5) sincos: 将三角函数转换成sin与cos的形式, 而把双曲函数转换成sinh与cosh的形式" J! J8 E& u+ i5 W4 s
(6) tan: 将三角函数转换成tan的形式6 M) B" z/ _1 T) _* A
(7) trig: 将指数函数转换成三角函数与对数函数
; N/ E0 x+ \+ q( w4 w  J+ a> convert(sinh(x),exp);   #将sinh(x)转换成exp类型0 _: r7 i/ Z) ^# N
9 a, U7 y& V5 C+ b/ o, B2 D3 X
> convert(cos(x)*sinh(y),exp);
$ ]  f3 E& U, ?$ F
' t! u5 w: B8 g' g" ]# q> convert(cos(x)*sinh(y),exp,y);
1 p! l  J, X+ V. @9 f3 c, s, m5 }; { 9 K/ D' X4 [' @3 c6 H1 S
> convert(exp(x)*exp(x^(-2)),trig);$ Z+ z: `' }! l' f- Q
; e2 S: ?1 m. _, c: T, ?7 X. r9 o
> convert(arcsinh(x)*cos(x),expln);: J% R3 I) q0 r. ~1 Q" G
* L4 F' F, r2 f9 m4 c0 A2 p" Q4 J3 B; `
> convert(cot(x)+sinh(x),expsincos);
* V6 [3 z/ y6 o% P+ y9 K
- W( I. I0 _! e4 e> convert(arctanh(x),ln);
% [+ y% v7 v+ `) I, H5 d( }% O
  n& Y5 Q& G2 T" W6 e; I+ e! S. gconvert在有理式的转换中也起着重要的作用. 在有关多项式运算的过程中, 利用秦九韶算法可以减少多项式求值的计算量. 在Maple中, 可以用函数convert将多项式转换为这种形式, 而cost则可以获取求值所需的计算量. 注意: cost命令是一个库函数, 第一次调用时需要使用with(codegen)加载. 例举如下:   
; s6 C9 k- N& S1 G* D+ |# \> with(codegen):. }  U$ x& y1 q* X
> p:=4*x^4+3*x^3+2*x^2-x;
8 d% z) G0 o5 [: X: \. ^ , Q( n: x2 ^. f  x" s" r
> cost(p);: a# _# v4 r) f0 V1 H. \

1 b$ v; ~& \/ u) S> convert(p,'horner');  #将展开的表达式转换成嵌套形式
: w5 i/ e" i0 g( ]) G( l ! S7 b/ [" I7 F, u6 a4 f# W
> cost(%);
  Y4 e, @9 L8 H; Q9 ]2 R7 I ; D+ }7 o- [, N% S9 f" c
同样, 把分式化成连分式(continued fraction)形式也可以降低求值所需的计算量.
% ?" T, T# Y; O% R> (1+x+x^2+x^3)/p;! I2 j1 {  o7 N2 N* V& d. E
2 N% Y! h# _8 z  g, d
> cost(%);& ?* }( r6 q4 p# |& [7 ^
' P6 @% b1 h: b/ M+ W
> convert(%%,'confrac',x);- `5 Y) L1 e" Y3 j: S
0 U% S( b9 u7 }4 U  C
> cost(%);
9 c3 u  q1 D0 w9 r, | / X* K& K1 h8 I/ n: }
在某些场合下(比如求微分、积分时), 把分式化成部分分式(partial fraction)也就是几个最简分式的和式的形式也可以简化运算, 但简化程度不及连分数形式.
. e+ d% T2 x) y8 |5 q> convert(%%, 'parfrac',x);
( _8 Z9 e# q+ V$ A# C$ i+ K4 } 7 b+ O2 C; M0 m1 L2 {& h" _
> cost(%);
2 [7 b6 Q! D5 d8 z8 {( u  H 5 _: ]- x) @" c% d" B- J2 m
而把分数转换成连分数的方法为:1 I- I* h" ^% l* q6 l  ^
> with(numtheory):
' E0 [  Z4 p! F3 s8 q> cfrac(339/284);3 `4 F% |8 |$ N5 T
8 C- ~8 |0 i& X8 g
2.2.5 函数的映射—map指令6 v3 u6 t& X4 S# ~5 m
在符号运算的世界里, 映射指令map可以说是相当重要的一个指令, 它可以把函数或指令映射到这些结构里的元素, 而不破坏整个结构的完整性. 命令格式为:- Y- e" P3 }1 U. b
map(f, expr);      #将函数f映射到expr的每个操作数
. S5 h: |0 q6 P' x: N# W5 Gmap(f, expr, a);    #将函数f映射到expr的每个操作数, 并取出a为f的第2个自变量
' M3 W2 q  l1 R: ^, O. Imap(f, expr, a1, a2,…, an); #将函数f映射到expr的每个操作数, 并取a1~an为f的第2~n+1个自变量( Q1 \; `  ^4 ^5 A' _
map2(f, a1, expr, a2, …, an);    #以a1为第1个自变量, expr的操作数为第2个自变量, a2为  A, l! B0 k& n3 c
第3个自变量…, an为第n+1个自变量来映射函数f5 @: I/ Q2 |( Z0 x# x
> map(f,x1+x2+x3+x4,a1,a2,a3,a4);
0 o/ f! j3 W6 L+ E * m. t) n8 |% V8 j
> f:=x->sqrt(x)+x^2;
, w% s- ^, E" O: v" v# A! r 2 W- Y* w# w6 j% T( Z; }
> map(f,[a,b,c]);! Q9 L! O% X2 d1 }- X% K

, {' s2 K: n  ~) T' v1 O7 W> map(h, [a,b,c],x,y);
- o* L2 S, V- N( K/ w2 ~% b. w
6 }: D+ Y; b3 y2 _. [* \( g> map(convert,[arcsinh(x/2),arccosh(x/2)],ln);2 C- b8 E% P# [0 e
9 E- v7 v8 L, B
> map(x->convert(x,exp),[sin(x),cos(x)]);
, h& l+ p. c- H# H2 {9 Y, o
+ {, Z9 v! n2 [+ i" c, `( C5 D上式的映射关系可通过下式理解:* p: P' w' [9 u$ o8 h
> [convert(sin(x),exp),convert(cos(x),exp)];& I0 \" Y9 T! e/ A4 V7 l

7 ~3 v5 c& H+ n4 l> restart:
+ B9 b) [* w3 B" V4 o9 Hmap2(f,a1,x1+x2+x3+x4,a2,a3,a4);
& ?( x! `# C( A. |1 B( ~
% l6 ^7 e( S/ O5 C/ Q( x- W0 j> map2(max,k,[a,b,c,d]); 9 X; L3 {* g4 p: b( {5 P

4 g3 `2 v) {- R再看下面示例:   
; R) J' X3 x4 m& {9 V+ {! ~> L:=[seq(i,i=1..10)];
: r8 _" u  I; J: V3 B
( {, L# U7 v, M/ w8 D> nops(L);& z+ n2 X+ Y/ n8 W

7 i" U3 T$ J! n' j1 G> sqr:=(x)->x^2;( F0 Q7 z& h8 u& e9 D: o2 P
: s# l! Z9 K/ O
> map(sqr,L);6 G& ~+ u) f/ l- P4 ~6 Z/ p
, n3 ^/ i2 _0 N% l7 z
> map((x)->x+1,L);
4 a6 ]* A1 a8 Y# d* |
+ E/ C% \, |: S! l0 h> map(f,L);
% ^& }8 }- `* \6 [ ( f7 U9 k( y7 B+ G' Y6 x# K) V: K( c
> map(f,{a,b,c});
3 Z/ D( a6 B- ]
5 L& _; E1 @5 T) |& g> map(sqr,x+y*z);
$ Q- s; K4 ~3 g, ~/ S( B
, h& D( t& a6 x1 S. M! x% c> M:=linalg[matrix](3,3,(i,j)->i+j);$ h0 p8 x& {6 j4 |" f2 j: [% \
  h/ ?2 v$ S" X: A
> map((x)->1/x,M);
3 k) K: }2 C2 @4 |& Q! F  d6 k
9 ]5 D5 O1 R0 L6 U3 求 值
$ D" P, J$ t8 b5 w7 _4 q% J6 e3.1 赋值# y1 ^" b, Y+ o: @% [4 p3 J  h6 ?2 m
在Maple中, 不需要申明变量的类型, 甚至在使用变量前不需要将它赋值, 这是Maple与其它高级程序设计语言不同的一点, 也正是Maple符号演算的魅力所在, 这个特性是由Maple与众不同的赋值方法决定的. 为了理解其赋值机制, 先看下面的例子. % a0 [8 q, b. N8 b* r! Q
> p:=9*x^3-37*x^2+47*x-19;
& y' I+ `9 h7 s  f1 V . B, |, O- C0 b# J# t
> roots(p);3 U& t/ ]  g5 S) {& }

" I! {0 _. d; t3 C2 t- W8 r> subs(x=19/9,p);
7 T4 r+ h6 c! H, j' w/ }) C
3 c) T* c! a9 V+ f6 D  M在这个例子中, 第一条语句是一个赋值语句, 它的作用是把变量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;”这样的简单语句即可验证.
* _( p* R0 b) o0 E- K: x7 B. _3.2 变量代换
! ?7 `6 L: O) N$ r在表达式化简中, 变量代换是一个得力工具. 我们可以利用函数subs根据自己的意愿进行变量代换, 最简单的调用这个函数的形式是这样的:   ) p8 z% a# A( z4 X! j9 C
subs ( var = repacedment, expression);
" W. ?6 H, m* K' E! j6 m调用的结果是将表达式expression中所有变量var出现的地方替换成 replacement.
$ m& C9 u' m6 _! O> f:=x^2+exp(x^3)-8;6 t! \, J+ ]1 [( n; H
! `9 R$ R; }, H% \) b2 Q
> subs(x=1,f);; R3 v* C# Y' Y/ l; L5 T
5 V8 N' B# u6 |. f
> subs(x=0,cos(x)*(sin(x)+x^2+5));0 p8 s4 @4 H3 r% m; X0 R2 ~4 e
! W  U! O/ ], j$ @& Y! E% M
    由此可见, 变量替换只得到替换后的结果, 而不改变表达式的内容, 而且Maple只对替换的结果进行化简而不求值计算, 如果需要计算, 必须调用求值函数evalf. 如:   
0 O9 S  Z1 _9 X3 @> evalf(%);2 M3 m' A$ G7 X$ P% ?

* c8 x$ d$ Q' v0 s6 g! F) K! _' R变量替换函数subs也可以进行多重的变量替换, 以两重代换为例:   
! F! \' F7 o  g& U* ~# Msubs (var1 = repacedment1, var2 = repacedment2, expression)/ r; `( }9 y; E, @+ ]( |
调用的结果和按从左到右的顺序连续两次调用是一样的, 也就是先将expression中的var1替换成replacement1, 再将其结果中的var2替换成replacement2, 把这种替换称作顺序替换;    与此相对, 还可以进行同步替换, 即同时将expression中的var1替换成replacement1, 而var2替换成replacement2. 同步替换的调用形式为:   
, M: W$ b0 j/ Ksubs ( {var1 = repacedment1, var2 = repacedment2 }, expression)
0 R  j: K. w5 k下面通过例子说明这几种形式的替换. 9 i# Z+ R! `/ n+ y
> subs(x=y,y=z,x^2*y);              (顺序替换)
( W4 Y: X- h5 D/ \ . Y& e- b1 ^9 p3 F8 f$ B2 B
> subs({x=y,y=z},x^2*y);            (同步替换)
7 e: ^' Q* d2 K+ Z- E/ R7 }; ]
5 I5 G; ]- K! t$ t> subs((a=b,b=c,c=a),a+2*b+3*c);   (顺序替换)
/ J3 C4 `+ C: B9 \
3 G" y2 J! C0 q+ a' w> subs({a=b,b=c,c=a},a+2*b+3*c);    (轮  换)1 A3 l( ?& G3 E# t3 G" \9 X
$ o5 w% `/ p5 T# v
> subs({p=q,q=p},f(p,q));             (互  换)
) v$ w# I0 C. K4 ]; H + E) u& R  v3 @7 z1 C9 u/ Y( y
3.3 假设机制& p1 ?9 P& y# i* J/ h
Maple是一种计算机代数语言, 显然, 很多人会尝试用Maple(或其他计算机代数语言)解决分析问题. 但由于分析问题与处理问题的考虑方法不同, 使得问题的解决存在某些困难. 例如考虑方程 的解. 如果k是实数, 结果显然是x=1, 但如果k是 的复根, 为了保证解x=1的正确性, 必需添加附带条件: 也就是当 时x=1. 这是一个对结果进行正确分析的例子. 然而从代数的角度考虑这个问题时就会把k当作不定元, 此时k没有值, 从方程两端去除k的多项式是合法的, 只要这个多项式不是零多项式即可(这一点是可以保证的, 因为其所有系数不全为0). 在此情况下x=1就不需要任何附加条件. 计算机代数系统经常采用这种分析的观点.
, R) S* ], W( [. ?2 Z# H在Maple中, 采用分析观点解决这类带有一定附加条件的实用工具是函数assume, 其命令格式为: assume(x, prop);
3 }; b# }4 H& b+ d函数assume界定了变量与变量之间的关系式属性. assume最普遍的用法是assume(a>0), 该语句假设符号a为一个正实常数; 若假定某一符号c为常数,使用命令assume(c,constant); 另一方面, assume可以带多对参数或多个关系式. 当给定多个参数时, 所有假定均同时生效. 例如, 要定义a<b<c, 可以用assume(a<b, b<c); 同样地, 要定义0<x<1, 可以用assume(0<x,x<1). 当assume对x作出假定时, 以前所有对x的假定都将被删除. 这就允许在Maple中先写“assume(x>0);”后再写“assume(x<0);”也不会产生矛盾.
2 H( X- H. {, O0 g  X+ D> Int(exp(-s*t),t=0..infinity);
( f! P' |: H* ^7 |7 @) N
: O# J- P5 Q7 m" I6 d* F> value(%);
6 }6 D. Y% G+ u0 xDefinite integration: Can't determine if the integral is convergent.- Z. u! U* B/ V' o( K- l4 S
Need to know the sign of --> s
7 G6 Y+ A; E3 C5 n6 d: S- ~6 _) y  TWill now try indefinite integration and then take limits.
. Q' W- p5 O6 z1 Y
+ s1 t; L2 ?" Y> assume(s>0);
+ W# v* I6 C7 e# \+ ?0 j* p* x> Int(exp(-s*t),t=0..infinity);
' `; K  b. ^+ D3 @- |& o 3 L, K9 p! A% e4 w" A4 M
> value(%);' M9 r- |! ^( O
+ ]& v+ y2 }" @4 y+ t" R4 m3 O8 y2 t
3.4 求值规则2 h# [: W; i1 y% @/ A. o
在多数情况下, Maple的求值规则设计为做用户期望的事情, 但要做到这一点很困难,因为不同的人在相同的情形下会有不同的期望. 在大多数情况下, 全局变量被完全求值, 局部变量被一层求值. 而由符号' '界定一个暂时不求值的表达式, 单步求值仅去掉引号, 不作计算, 这也是允许取消指定名字或清除变量的原因. 如下例:   
% E4 S% l* V& H; {( Y/ i> x:=y;
. G3 M2 n0 S. i. B
, T8 R4 k* W, i0 k' D' f> y:=z;* }% Y- G# [3 I. J9 X9 U3 z$ z

6 k; Q  S' G- s0 ?, l> z:=3;* E8 K2 S' B% ^# v- D; f1 M
$ N/ @# l0 v4 A( M  P( U; |' N
> x;
6 o1 D" Q9 M. ~" o ( f) O8 W: m2 q4 X) l4 |
> y;
, U7 Z5 Y; X% H, Z& E$ x  B " i  J1 E# A9 b  \- ^
> x:='x';
" L* |1 M7 A% }3 y% a 3 V# M8 h6 c2 E4 u9 S
> x;
5 B8 l( m( A9 v9 e- O1 D$ m
+ p4 t1 p3 Y' f> y;' b3 v' j- d. l5 m

( x- e% ^; x, l/ n对于不同的问题, Maple设计了不同的求值命令. 现分述如下:   1 D! l3 g' n0 _' A
1) 对表达式求值, f6 B3 y. ^$ O$ N/ u- K( ?
命令格式: eval(e, x=a);  #求表达式e在x=a处的值
# z" B( z/ g1 x. z- t2 a  m             eval(e, eqns); #对方程或方程组eqns求值
8 j% l  o5 ?6 s  U! e             eval(e);      #表达式e求值到上面两层
8 V  g" ?$ g# J3 ^             eval(x,n);    #给出求值名称的第n层求值+ A; {  o7 ?; \4 s2 b. S# k5 l( t
> p:=x^5+x^4+x^3+x^2+x+73;* D6 V! O- z' p( ]

& T/ \8 K3 ?4 J; W8 x; e- y. B8 G2 W2 V> eval(p,x=7);7 @" r/ j. _5 v/ H0 b4 m

9 C& v7 O) ]% r. V$ Z9 ^> P:=exp(y)+x*y+exp(x);5 h, H% G* n- k0 Y3 e; w' ^4 M
* r% p# e, u' e4 I0 U4 `  o& ?, a
> eval(P,[x=2,y=3]);$ `2 Q9 y. ?: k

# h) M- @: M# r0 A) S. L  M$ f    当表达式在异常点处求值时, eval会给一个错误消息. 如下:   
$ O. r- K* t8 |1 x2 B> eval(sin(x)/x,x=0);" \; ]& \4 Y6 {4 q4 j, r
Error, numeric exception: division by zero1 p) i% J$ m: }' p, D& x) f* J
    下面再看使用eval进行全层求值或者对名称几层求值的示例:   & y5 b6 l6 F2 E; F  r3 g! P
> a:=b: b:=c: c:=x+1:! l) y( i- f* a8 y! s  ~
> a;              #默认的全层递归求值6 h! J. ~+ }" Y/ p7 s' z% T

# X9 w! a+ x. e, k> eval(a);        #强制全层递归求值
2 p' Y- b4 y, u& }2 e" x ( _5 x# y" w* a' Y
> eval(a,1);       #对a一层求值8 k: \' j$ f7 H# F# U
7 q* p3 b5 }( Z5 N# H
> eval(a,2);       #对a二层求值; k0 I9 `! y, [) B/ G* o: g: _
# O$ \4 A. R8 `4 ~4 z/ M
> eval(a,3);       #对a三层求值
+ q! t5 j% H) c# y( e3 W ; `1 N1 _+ j3 R: Q* q* c9 F1 K) U
> eval(a,4);       #对a四层求值, j4 W+ P' S# i% F: M' _+ y

0 L" `. \+ S0 U7 p+ {4 {. N    2) 在代数数(或者函数)域求值
0 f+ o3 D$ Q/ Z9 E9 D- b, j命令格式: evala(expr);       # 对表达式或者未求值函数求值
# D' T6 @' b* J             evala(expr,opts);   #求值时可加选项(opts)
2 o3 b' f5 M) k" Q$ `( U' [9 E5 o所谓代数数(Algebraic number)就是整系数单变量多项式的根, 其范围比有理数大, 真包含于实数域, 也就是说任意实数都是整系数多项式的根(如 就不是任何整系数多项式的根). 另一方面, 代数数也不是都可以表示成为根式的, 如多项式 的根就不能表示成为根式的形式.
0 b6 P2 f! _4 D$ v) O代数数的计算, 算法复杂, 而且相当费时. 在Maple中, 代数数用函数RootOf()来表示. 如 作为一个代数数, 可以表示为:   3 R" f. U0 n& n! X- H: {1 g
> alpha:=RootOf(x^2-3,x);& r/ y7 @" J) J5 K! U
4 y# [3 R4 @. [4 u8 |/ u
> simplify(alpha^2);
' _. x0 {/ H( I* y- v9 @4 c3 L/ ~
! j* `, r1 |& D- S) j在Maple内部, 代数数 不再表示为根式, 而在化简时, 仅仅利用到 这样的事实. 这里, Maple用到一个内部变量_Z. 再看下面一个例子,其中alias是缩写的定义函数,而参数lenstra指lenstra椭圆曲线方法:0 w/ a. b" B% }; a9 {
> alias(alpha=RootOf(x^2-2)):
5 Z$ C% c: S0 \+ M1 J> evala(factor(x^2-2,alpha),lenstra);
1 y) `) p4 l8 h6 Y/ a/ K5 Y  V' s( X0 U : N6 X+ |5 h3 C; ]  _
> evala(quo(x^2-x+3,x-alpha,x,'r')); # r  V0 \6 q( ?  e* c5 R; N
& ]6 P  r1 z% @
> r;) A/ B) w( d3 t! n- b
. r# |. O+ l1 h7 m
> simplify(%);
1 I2 }5 m- g( Q3 H6 K+ E0 z" {
8 a9 g5 s$ h! ?+ w4 a% Z1 p3) 在复数域上符号求值# i8 p. J! \( N$ A# R, m9 M2 n
操纵复数型表达式并将其分离给出expr的实部和虚部的函数为evalc, 命令格式为:
) l. \8 d- S: ]5 M+ ^evalc(expr);   & N$ a% `3 @  J8 Y8 P) ~
evalc假定所有变量表示数值, 且实数变量的函数是实数类型. 其输出规范形式为: expr1+I*expr2.
: {' [& T* o( P> evalc(sin(6+8*I));  _: q: W8 ~7 Q5 G& p2 _5 v$ ?, n
0 O9 q! C. e1 y8 g8 p. A  F
> evalc(f(exp(alpha+x*I)));, w: w6 j" f4 @3 l
# L. P* P9 x& O! @! N
> evalc(abs(x+y*I)=cos(u(x)+I*v(y)));
7 s. w6 Z* f, ?6 {$ ?2 Q& G# P5 [ 6 ?, v( X7 M' d
4) 使用浮点算法求值' b/ v  a. }5 ]% y9 L6 b
浮点算法是数值计算的一种基本方法,在任何情况下均可以对表达式expr使用evalf命令计算精度为n的浮点数(n=Digits), 如果n缺省, 则取系统默认值, 命令格式为: evalf(expr, n);     7 H2 S/ a( S# i3 W2 v
> evalf(Pi,50);   
7 G! r2 o' t+ R+ l( n
8 R, Y8 v5 G, j; ]8 f0 F3 ^+ D: V> evalf(sin(3+4*I));   
% Q. P3 j+ p: A
0 l* e0 }+ }% K# ^' Q% z6 T> evalf(int(sin(x)/x,x=0..1),20);
# f, l- ?" M: J: R& A8 u$ }
# R" L+ j; {9 k  b5) 对惰性函数求值
% H# V) B2 e* c5 j把只用表达式表示而暂不求值的函数称为惰性函数, 除了第一个字母大写外, Maple中的惰性函数和活性函数的名字是相同的. 惰性函数调用的典型用法是预防对问题的符号求值, 这样可以节省对输入进行符号处理的时间, 而value函数强制对其求值. 对任意代数表达式f求值的命令格式为: value(f);   
! u3 F( `* v' t9 w- O> F:=Int(exp(x),x);
! P& Y! u: n  x2 ]" [! A
2 U6 r* i5 j  }7 X/ d$ p> value(%);/ a. S+ q0 x1 C
3 `9 I' w; m% w1 M9 l1 h1 y
> f:=Limit(sin(x)/x,x=0);+ ^1 R1 F. }) ?6 \; A
0 K4 Z" }! Q5 n8 K# O5 F( t
> value(%);7 ^. g0 M- l) b& f; W4 N

8 y: Y7 J# @' ^0 {另外, 将惰性函数的大写字母改为小写字母亦即可求值. 如下例:   
' q6 L6 j0 o  V/ z> Limit(sin(x)/x,x=0)=limit(sin(x)/x,x=0);
9 I+ T6 Y2 e; ~, F2 g ; V5 m" v# X1 H% C% U7 x% w1 j4 F
4 数据结构- X" I4 s; `  p1 m) q8 P3 \! H
Maple中有许多内建的与FORTRAN、C或Pascal不同的数据结构. 主要的数据结构有序列(sequence)、列表(list)、集合(set)、代数数( algebraic number)、未求值或惰性函数调用、表(table)、级数(series)、串(string)、索引名(index)、关系(relation)、过程体(process)以及整数(integer)、分数(fraction)、浮点数(float)、复数(complex number)等数据结构, 而矩阵(matrix)在Maple中表示为阵列, 是一种特殊的表. + ]7 a2 Q3 p7 c+ J( u7 ^) v# k
4.1 数据类型查询2 t9 I7 E5 k5 I7 s9 I3 T; q2 y4 I
在Maple中, 用whattype指令来查询某个变量的数据类型或特定类型, 命令格式为:
; S$ _& N# n  w0 t( \/ V5 O% P' Nwhattype(expr)        # 查询expr的数据类型
9 v% |; c! [% P6 p$ j7 q1 ]type(expr, t)           # 查询expr是否为t类型, 若是则返回true, 否则返回false
* C) G9 {+ u$ s> whattype(12);4 h% [6 c9 |( V- A9 N! V9 D

( p: q. w' o" D/ P" A> whattype(Pi);
4 S* q6 f1 @; ~4 E7 r
/ T% G/ F3 h8 U- m; H> type(1.1,fraction);5 v( D/ k% o) n. V4 L( T- A

6 [$ A5 i. v$ a> whattype(1.1);
3 Q: \! N/ X! @# ` " v4 b" W4 B. y' H$ M
4.2 序列, 列表和集合; N% U: n/ {& x6 t7 y
4.2.1 序列8 s# `) q+ E9 L* q
所谓序列(Sequence), 就是一组用逗号隔开的表达式列. 如:   
$ Q" i" Y. S4 p5 h8 L> s:=1,4,9,16,25;
$ u6 H9 \- f% m+ o( F* ?
8 z- J% |: E1 s' ^. j( I: u> t:=sin,com,tan,cot;
/ @$ l7 c( b! p9 g
7 F# W, F& R5 a* O一个序列也可以由若干个序列复合而成, 如:   9 D, L5 h! S+ C9 J, @! F8 [( j
> s:=1,(4,9,16),25;7 L# y9 u: b; l' H6 K
+ U; g1 Q! ?: T! g8 d9 o
> s,s;& }4 _' i+ [; _& T% g2 A9 N: r

9 Z- F; x! L5 }$ q而符号NULL表示一个空序列. 序列有很多用途, 如构成列表、集合等. 事实上, 有些函数命令也是由序列构成. 例如:   0 Z: I; i+ c$ b1 h4 H
> max(s);
2 I3 y( q( Z% ]8 \, J, J
' L- j  h: z6 a2 L6 N4 }8 ~> min(s,0,s);
# t* J+ B$ S! ?! O. A+ e3 ^ 6 ?, D6 P& `! z( M! z, s- R
值得注意的是, op和nops函数命令不适用于序列, 如op(s)或nops(s)都是错误的, 如果要使用op(s)或nops(s)前应先把序列s置于列表中. - B- b8 _& |- C+ |
> s:=1, 2, abc, x^2+1, `hi world`, Pi, x -> x^2, 1/2, 1;8 I% k7 h4 f- ]% a; W6 L$ j) [8 f

. R2 d. ]- N$ U> op(s);
9 N% [. ~- Q3 E+ dError, wrong number (or type) of parameters in function op7 `% h7 X+ v# |% v/ Z( i2 @( l
> nops(s);
) z( B, Q2 U7 p4 KError, wrong number (or type) of parameters in function nops
# v& R9 P1 G- M- U! F) d: q( [> op([s]);* I( L/ U" l& c
. ~! O( l) j1 C5 `( W4 w
> nops([stuff]);( V4 L% p; U. p7 B* T( W; G
4 n; e( n. `; A" U0 w, {
函数seq是最有用的生成序列的命令, 通常用于写出具有一定规律的序列的通项, 命令格式为:   
' A$ L0 z% Q" J8 T! L4 zseq(f(i), i=m..n);  # 生成序列f(m), f(m+1), …, f(n) (m,n为任意有理数)
' ^- b8 A; j5 Q+ _seq(f(i), i=expr);  # 生成一个f映射expr操作数的序列( E& k9 {8 {, e
seq(f(op(i,expr)), i=1..nops(expr));  # 生成nops(expr)个元素组成的序列
1 G, m4 Y. X3 d  i> seq(i^2,i=1..10);# A- Z: E" Q% K: h& R) p

: [$ U/ u3 @% H' }' r) z, d4 g! A> seq(ithprime(i),i=1..20);
3 T' U2 \$ ]' X
# t) @' P6 ]  D. H! S9 k% v$ p> seq(i^3,i=x+y+z);
1 A9 R. y$ F3 V- @0 ?* A. X. g
8 R$ Q# L# Y1 D8 u, Z8 n> seq(D(f),f=[sin,cos,tan,cot]);
) c3 D* l1 c6 N
/ H0 h9 t. G# [2 e9 ?> seq(f(op(i,x1+x2+x3+x4)),i=1..nops(x1+x2+x3+x4));
0 J  v) G. D- \( F% s6 C  i! D
3 L4 E% ?$ @" Y$ q1 y  L5 U获得一个序列中的特定元素选用操作符[  ], 如:   . j- e' m" e. V# q1 Z+ m4 B1 Y
> seq(ithprime(i),i=1..20);
4 c; N: w: W9 D  X 2 v8 O5 |4 l1 C& a9 ?6 q4 Y* s
> %[6],%[17];
$ r- `9 B! v3 n( \+ u: b; z' s 6 t' b0 [8 C) n+ Y$ Q/ H
4.2.2 列表
2 b/ }% @) |; |& }( t+ ]列表(list), 就是把对象(元素)放在一起的一种数据结构, 一般地, 用方括号[  ]表示列表. 如下例:   
2 |( Y: G5 R9 g8 }> l:=[x,1,1-z,x];
# z% B; r# S9 F0 a0 J. l& n4 H
4 X0 j5 B0 O. ^% e> whattype(%);
+ l1 C: h9 f2 y0 T / q" _3 |4 r# Y+ r1 t& O: o# ]
空列表定义为[ ]. : U! n6 u9 t* p$ C2 Y
但下述两个列表是不一样的, 因为对于列表而言, 次序是重要的:   3 ^. x7 _2 c! w- p/ k
> L:=[1,2,3,4];& z3 T* n, G$ J9 I% X

: s$ n8 Z2 G) l5 c4 j; o$ H> M:=[2,3,4,1];+ S: ]2 O* j" z* z- c6 s. e
  Q# z  _& p6 e+ b1 w: g# Y, v
4.2.3 集合
- @4 G- M' N* ~  m% h" {! ]  r集合(set)也是把对象(元素)放在一起的数据结构, 与列表不同的是集合中不可以有相同的元素(如果有, Maple也会自动将其当作同一个元素), 另外, 集合中的元素不管次序. 一般地, 用花括号表示集合.
6 E; E" L  Q# m0 r$ s7 v> s:={x,1,1-z,x};
+ H, [& G, F: t# v) S4 o! s
1 z6 [/ x* ?. o> whattype(%);% u! @& R# i% {7 Y) E
% T4 j7 y6 P. ?& v! S1 t' Z6 p0 h
空集定义为{ }. ) ]- ]) T; T- i: q" s) o
函数nop返回列表或集合的元素数, 而op则可返回其第I个元素. 6 R5 O" c2 \  d7 S) f
> op(1,s);
. q' f$ v  a) d# l& S+ E. z " s3 u( c, _- J& b8 L+ @7 b# j
> s[1];
( C0 |7 t2 C0 M% y0 i" @ 0 T* W. {* ?4 E2 O& C) z' N+ _
> op(1..3,s);2 h6 ^8 V, u6 [9 U" z4 S" M  p) B
. H# i, {( K1 q1 P
> s[1..3];
$ A) z& [; P2 |; d
8 J8 I0 n- s& n. U8 z) Y9 C函数member可以判定元素是否属于一个列表或集合, 如果属于, 返回true, 否则返回false.
4 I  q  @% A4 A& _9 {, L> member(1+x,s);
! f( {( c4 T* N  y
9 Y1 z' P6 _% o- b% R& V+ {可以通过下述方法在列表中增减元素:   7 Y" @" a, O" N) `) h
> t:=[op(s),x];9 E$ V- U3 @1 w1 Y4 G
$ L3 _8 L/ w2 P" A5 n
> u:=[s[1..5],s[7..nops(s)]];% U7 M* o/ D/ T: ?- l1 g; z5 H( r

# R0 m- L# b* j8 r% gMaple中集合的基本运算有交(intersect)、并(union)、差(minus):   ( U( b% d3 h# }% o/ O
> A:={seq(i^3,i=1..10)};B:={seq(i^2,i=1..10)};( M8 d* i, `) \8 K$ v, l/ D

1 l) F0 Y; f) h+ K+ i  R3 T: T5 v' G- C , s4 P! }1 e+ G4 O, C  Q
> A intersect B; 9 X2 p2 U) v4 ?; t( a+ h" S. k
) ~' B! e+ T8 f
> A union B; ) r4 I2 z" j0 z  b7 t

& l8 n, {+ J3 Z' G, j( Z) X> A minus B;4 H; O# Y4 ^" v9 u( e5 F# l' F

( E% h) o) {, |6 \, U* s1 }  H/ b4.3 数组和表5 g& \6 D# Z8 A2 f& p- l
在Maple中, 数组(array)由命令array产生, 其下标变量(index)可以自由指定. 下标由1开始的一维数组称为向量(vector), 二维以上的数组称为矩阵(matrix). 数组的元素按顺序排列, 任意存取一数组的元素要比列表或序列快的多. 区分一个数据结构是数组还是列表要用“type”命令.
$ f6 s( E% M5 U) E    表(table)在建立时使用圆括号, 变量能对一个表赋值, 但一个在存取在算子中的未赋值变量会被自动地假定是表, 表的索引可以成为任意Maple表达式. 表中元素的次序不是固定的. ; s8 Q+ n7 Z3 }& E+ I5 t: d
> A:=array(1..4);
: J0 u- G! X9 f. v) Z% i2 b
6 _) p! O/ |( J3 i> for i from 1 to 4 do A[i]:=i: od:( Q2 t  e2 s9 N
> eval(A);1 P. r' d2 g) g: C
0 C' [1 t3 v0 ]4 d
> type(A,array);  G: f5 S0 K: W2 `; c
, v$ j, N; z0 U/ W
> type(A,list);
* M3 d/ K; h& B9 c: s( b) `
$ v" G  W8 \$ i7 j> T:=table();
; ~- |# v1 r- m 6 N* _1 K. @* I/ X0 p! ~0 W
> T[1]:= 1;% d: ], Z7 B8 F0 E4 J" f. O  h

: ^3 q0 v5 b8 K; }& V> T[5]:= 5;
7 O  c, \) b8 T+ k* e 2 `& X1 L. Q1 I/ Y/ a
> T[3]:= 3;
2 H, c7 y8 W9 c* q( z. ~: G# ?# r
0 G8 o' q' d9 r$ o> T[sam]:=sally;! _6 i% ]; o' U2 e" D

: J6 k8 Z( e' O% D% F* g, r% U, X> T[Pi]:=exp(1);
: [' M; z% [! Z* Q
1 |7 }* B% U0 @5 E# q> x:='x';
2 Y' \, h: u' z  R: C) m# e/ p7 Z / k; x: S$ {9 d5 W" K
> T[(1+x+x^3)*sin(x)] := 0;+ Y! k7 L8 ?' n: k5 u
% H- X. E9 l4 B# R1 h- i
> eval(T);/ G. h: K2 {  R1 r

# _/ L: `6 J- v3 F: A) O9 W> T[3]:='T[3]';/ g2 a4 |! j* j7 Y) K4 D  L0 E* p9 T: L
1 E# e2 `* ^  R/ C( X5 o
> eval(T);( D/ h" C4 g, w
* D) d: W7 h, O# r0 a
4.4 其他数据结构
/ g- ?* q: q# K! v串在Maple中是很重要的, 他们主要用于取名字和显示信息. 一个Maple的串可以作为变量名, 它们中的大多数是简单的、不需要加引号的串, 但是如果变量名中包含/. 例如“diff/T”则必须把变量名用引号括起来. 1 H, M% [4 o/ D# W, `( ~, j
索引名是像Database[1,2,drawer]或A[3]这样的对象, 在使用索引前不需要直接建立表, 如果不得不做, Maple会自动建立表. 索引名通常被用于矩阵和向量. 为了保证Maple建立表的正确次序, 建议在赋值前直接建立.
* d$ @3 k2 v  [( `- Q) R: Z3 {) r> x:=T[3];/ K8 B$ q5 S8 I1 _' s8 i' e* W! h

" I2 U: L. @9 S. _% h( i- _* \> eval(T);( P8 p5 ]  F9 }9 y! s4 q  C

5 F0 N& E$ \$ B. ^) V> T[5]:=y;
' J4 Q% J( e' L( d
! \" {4 T1 ?6 K" u/ E$ D> eval(T);
1 E+ F, i! K1 {2 k, N' W % `3 \9 U0 {* b4 C7 u9 B7 C
由此可见, Maple并不直接建立T的表, 直到给T[5]赋了值.     
; e0 M6 D% l  Q' y: X( K+ L7 [数值数据结构(整数、分数、有理数、浮点数、硬件浮点数和复数等)在它们的使用中是大量透明的. 浮点数是有传染性的, 这意味着如果数值结构中有一个是浮点数, 则整个结构自动转换为浮点数.
# M5 b- S5 O. q4.5 数据类型转换和合并; E& l0 M1 w3 S
convert是一个功能强大的类型转换函数, 它可以实现列表和数组的类型转换:   
  f4 S( t. R3 C> L:=[1,2,3,4];
/ W! U! G1 G# o: U8 [4 _ 9 x: f/ _1 R# Z, H: V; K
> type(L,list);
. S, J6 ^2 @) Q2 C. Y; J; c
, }& S/ j" z# k. }( k7 x! x! H( P> A:=convert(L,array);  C# ?# B' K; E- T4 I
  B. W+ ^" L- P1 ?& W& N
> type(A,list);& E2 B; R- A2 y- z8 y1 a

' k7 [  X0 Z; a9 X* E$ ]5 `> type(A,array);
5 l8 i3 ]) n7 A- @" O ! Y% G4 ^' K( W+ f, x
另一个有用的函数zip则可把两个列表或向量合并:   $ v+ {% B) G: g% z9 r
>L:=[seq(i,i=1..10)];1 B7 T" |0 U$ x& [* q7 X; L

9 N$ w& h7 R1 e' b0 {2 j> Sqr:=(x)->x^2;
3 b5 c' V0 [7 E) O2 |0 D/ e
' x! F; S8 f; \, \$ [6 c0 {> M:=map(sqr,L);+ X* I1 o2 p8 a8 D0 P5 I2 x
6 e2 y  {$ g8 U, x
> LM:=zip((x,y)->[x,y],L,M);  O; J7 d- N. Z+ A% n3 F

% M' e0 E1 ~4 @* F1 I) e> map(op,LM);$ s3 _3 k! n$ {: w  a

1 s$ l* n% S! y& Y) \5 Maple高级输入与输出操作% E7 Z. h6 ~+ R9 m
Maple提供了良好的接口来编辑与计算数学式. 许多时候, 我们可能需要把Maple的运算结果输出到一个文件中, 或者在一个文本编辑器里先编好一个较大的Maple程序, 再将它加载到Maple的环境里. $ O" [3 ^, u2 Q: t3 ~3 h  R: p" P
5.1 写入文件
4 ]0 }' D; f8 S; U5.1.1 将数值数据写入到一个文件$ m# X9 m0 @: G0 h4 l
如果Maple的计算结果是一长串的数值串行或数组, 而想把它写到一个文件时, 用writedata命令.
' w, M6 g; l2 M+ [( l若Maple的计算结果data为集合、矩阵、列表、向量等形式时, 将其写入名为filename的文件时命令格式为: writedata("filename", data);) y- D" l/ [, U/ H9 R% L/ V" L
> with(linalg):
+ t; I$ ]: ?8 r: W/ t> M:=matrix(3,3,[1,2,3,4,5,6,7,8,9]);" N. P5 E# @: P2 h* \# I3 F$ L$ B
; i% a' d( d2 |: N/ d5 O  D
> writedata("e:\\filename.txt",M);
/ u8 u* j) Z% k: A3 @7 ]而将结果附加在一个已存在的文件后时,使用命令: writedata[APPEND]("filename", data);
* }$ {! J7 l$ r' Z# \. e4 h( m> W:=matrix(2,2,[1,2,3,4]);
, C( C9 s$ w- J6 D6 F
. E( N3 @1 b* _& n' }> writedata[APPEND]("e:\\filename.txt",W);
8 U- s% g/ ~5 Y5 I; i需要注意的是, 这里的APPEND是必需的, 否则W结果将会覆盖M结果.
- M$ S8 c; W/ h6 d/ h另外, 若想将结果显示在屏幕上时, 用命令: writedata('terminal', data);5 [5 O7 n9 k; }7 e  }
> writedata[APPEND]("e:\\filename.txt",W);
# N4 Q8 g; R$ S0 j0 M> writedata('terminal',M);# t1 a: ^7 b% c3 W/ i% x. w
1                   2                   3           9 v3 `) E) `& r7 t1 k$ ?
4                   5                   6           0 i6 e; B/ W! U: J5 z0 E: A4 [$ U
7                   8                   9   
1 d6 x; ~$ d1 K: ^9 b) _5.1.2 将Maple语句写入一个文件
5 Q5 Z8 N  s( \3 F# F! |9 `如果所要写入文件的是表达式、函数的定义或者是一个完整的程序, 则使用命令save, 写入一个或多个语句的命令格式分别如下:
  N: |- p6 p4 n! b$ dsave name, "filename";7 \3 `* K; d, b
save name1, name2, …, "filename";
" r, d  O! C' _/ E" q1 P若filename的扩展名为.m, 则Maple会以内定的格式储存, 若扩展名为.txt, 则以纯文本文件储存. 以内定的格式储存的文件作纯文本编辑器无法读取, 但在大多数情况下, 它会比纯文本文件的加载速度更快, 且文件容量小.6 I$ w! T! |4 v6 N- e
> myfunc:=(k,n)->sum(x^k/k!,x=1..n);3 C2 k7 y# f2 d$ f6 o  F1 {
2 W1 R$ b  X) x3 ]1 |! H
> myresult:=myfunc(6,8);
8 v% h$ _9 a( f# D' I  l" H% Q
( t% O0 O0 b0 k1 J8 w> save myfunc,myresult,"e:\\test.m";
5 Q0 K0 y! I5 x* v调用已存m文件用命令read. 试看下述实验:" s9 h; {) o" M# t$ x$ b- I  l
> restart:, K5 N) C/ W9 U' H4 E4 `! {% ^
> myfunc(6,8);, D7 v5 V0 }; C3 ^3 O
9 |8 }6 z2 f+ o# R
> read "e:\\test.m";5 k3 Z; c: c0 ]9 z
> myfunc(6,8);1 ~2 K: X" J) a$ o/ h3 d  ]
& a& s5 _$ ^: `
> myresult;' M6 {( K8 e! A& z! \

2 @1 P+ v' F, \2 D  R9 s8 d1 X( o& d    而存为txt文件时则将整个语句存为一个文件:
" i# |9 Y1 i1 D% g- I> save myfunc,myresult,"e:\\test.txt";: v' |* q# s7 c1 o. S- L
> restart: read"e:\\test.txt";
" e, m. T1 E/ G0 K+ j: J; k, L $ s; t5 N( {. j( U5 |
9 M. o) U0 n- _. d
5.2 读取文件
( k' N6 J8 ~, O在Maple里最常用的两个读取文件的命令, 一个是读取数值数据, 另一个是是读取Maple的指令.
( Z! c8 a- y; u" S- Z! ~5.2.1 读取数值数据
7 N: t) V3 b, M如果想把大量的数据导入Maple里进行进一步的运算或者要运用大量的实验数据在Maple环境绘图时, 可以用readdata( )命令完成.4 P* n4 }- u4 h& [! a4 L5 H
从filename文件里读取n行数据时使用命令: readdata("filename",n);
# X) e) k/ Y& `5 e3 Q( B以指定的格式读取数据时使用命令: readdata("filename",[tyep1,type2,…]);" f8 P9 W! j, N5 e! \
> readdata("e:\\filename.txt",3);2 x9 k' f( y% A7 h
8 B# X6 T" L+ `* t
    读取filename的前三列, 第一列为整数形式, 第二、三列为浮点数形式:
0 {6 |: H  f! H  z> readdata("e:\\filename.txt",[integer,float,float]);
' ~+ D  C, H- G" _
' Z1 s& J) _0 F# c* m9 P, {( b下面再看一个运用大量的实验数据在Maple环境绘图的实验:
, d! }: X' }# i5 |> mypts:=[seq([x/1000,cos(x^2/100000)],x=1..1000)]:
: C1 c0 E7 {, u( u8 Y! J> writedata("e:\\data.txt",evalf(mypts));
; V& h5 _' D3 V; r* c% @( t! ^9 k/ G> dots:=readdata("e:\\data.txt",100):- X/ K* |+ B5 Y, `
> nops(dots);+ i, ~, X: s' P4 A
$ Z/ R$ a" |/ w% Z6 @2 S
> dots[1..4];5 u" L' t2 ^' G: B" h$ r6 O
+ y4 C. z$ j0 {. c2 B* [
> plot(dots,style=line);8 \' J: X& a$ r2 U

$ m, |" \) p% N1 h5.2.2 读取Maple的指令
4 M0 E: u- V1 f) i8 W1 s在编写程序时, 在普通软件中先编好程序再将其读入Maple环境中常常比直接在Maple中编写更为方便. 如果要将程序代码或Maple指令加载用read命令:
) N+ K/ w! o# U; oread "filename";
" T' T  r3 g6 @# U2 l: C+ R! o如下例:$ o; @' y/ B/ |/ E
> reatart:1 P* I2 a" h7 t* N2 W+ l* q" \0 e# m
> myfunc:=(a::list)->add(i,i=a);0 U3 T9 o) B' E2 d+ H% B( w$ u

6 Y# t# X2 I7 l  x" l. n+ G> avg:=(a::list)->myfunc(a)/nops(a);6 D- F) A, }# t) r& X4 d- L
/ S! l  [% g& p- ]3 c6 s
> save myfunc,avg,"e:\\function.m";( Y/ X2 R7 d" t' a2 e3 }
> restart:
7 |9 ~9 L% U  J& ?7 U5 Z) U> read "e:\\function.m";5 G  _7 S' S+ N" \, j
> myfunc([1,2,3,4,5,6,7,8,9]);1 P- h* ^# l: S/ C" ~, \

6 a  [0 r! B$ B0 F! g> avg([1,2,3,4,5,6,7,8,9]);4 E4 m' T9 S" ?( a' E

  ~5 z: P0 w2 z/ `5.3 与其它程序语言的连接, ~+ l# w" ]& O) T  a/ m7 r9 M* z
5.3.1 转换成FORTRAN或C语言; P, Q0 d" d" ?9 m. P, Q
调用codegen程序包中的fortran命令可以把Maple的结果转换成FORTRAN语言:9 }! b0 w$ N  W1 n  N) \4 o
> with(codegen,fortran):
5 B% V" d: G$ z+ m* `9 V5 Tf:= 1-2*x+3*x^2-2*x^3+x^4;
/ W0 f. }+ Q* F6 _- b: h* z1 q
- ]2 P+ t3 H; r> fortran(%);
0 e, t. W9 z( [& ?$ A      t0 = 1-2*x+3*x**2-2*x**3+x**4; f* f9 e, N5 M. J9 u
> fortran(f,optimized);# I/ P2 _2 e  ~4 C2 [
      t2 = x**2
- J' q' t  ^3 P2 o! s5 _- K: ]8 M% C% b      t6 = t2**2) R+ }8 ]% D+ y' {
      t7 = 1-2*x+3*t2-2*t2*x+t6
# R+ o0 r8 I' R0 K/ M$ Q> fortran(convert(f,horner,x));
4 l4 k# _5 R0 T4 z8 U3 b0 G* o: l' R      t0 = 1+(-2+(3+(-2+x)*x)*x)*x
3 G; O6 K3 k- j9 A而codegen程序包中的C命令可以把Maple结果转换成C语言格式:, S) i% C  Q+ o' d3 H
> with(codegen,C):8 V3 L7 h5 d" f
f:=1-x/2+3*x^2-x^3+x^4;
2 {4 M% o/ l/ |3 i( s 7 O0 p, {) G: x+ |; k* B
> C(f);' h+ M' w5 D" H* X: ~8 ?. p' p
      t0 = 1.0-x/2.0+3.0*x*x-x*x*x+x*x*x*x;. }2 y% s9 s4 I( K7 \
> C(f,optimized);
9 z1 s! u) R7 p/ @- Q4 ~3 r      t2 = x*x;
9 y7 O% {1 E: @. e4 P& D4 o      t5 = t2*t2;- L! q" k) h' X( P" `5 S
      t6 = 1.0-x/2.0+3.0*t2-t2*x+t5;0 B# h. h$ v& o8 e9 J
optimized命令表示要对转换的表达式进行优化, 如果不加此可选参数, 则直接对表达式进行一一对应的转换.- ^% y- h/ x$ E# W) r( _3 b# K
5.3.2 生成LATEX1 _0 Y/ t; }5 t; g
Maple可以把它的表达式转换成LATEX, 使用latex命令即可:) |: F$ l! Z" \, @
> latex(x^2+y^2=z^2);
8 K9 \2 X# c1 x" O9 M" a{x}^{2}+{y}^{2}={z}^{2}4 g' {9 ?- ?3 Y. ~# ~! \% t
    还可以将转换结果存为一个文件(LatexFile):
  ~0 L5 b( G- f9 x3 d5 n> latex(x^2 + y^2 = z^2, LatexFile);; v- P" p5 N8 ~5 H' C& U
    再如下例:( O+ n$ V$ v( Z; K1 ]& ^% v
> latex(Int(1/(x^2+1),x)=int(1/(x^2+1),x));! b$ d3 ]& B: X$ ]- P8 x* R5 m
\int \! \left( {x}^{2}+1 \right) ^{-1}{dx}=\arctan\left( x \right)
- S8 E0 J) O. ]/ @; \: Z
( Z/ e3 A% q  l9 B
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年!
    0 s5 u& h8 ]2 F/ ~. [* \
    / A( D9 w) b2 }1 \. ]2 q% Z
    * f: \9 H- \7 r/ i1 ?/ A) z, t
    回复

    使用道具 举报

    0

    主题

    2

    听众

    19

    积分

    升级  14.74%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    0

    主题

    4

    听众

    181

    积分

    升级  40.5%

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

    [LV.5]常住居民I

    群组学术交流A

    群组学术交流B

    回复

    使用道具 举报

    0

    主题

    13

    听众

    27

    积分

    升级  23.16%

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

    [LV.3]偶尔看看II

    社区QQ达人

    群组国赛讨论

    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2025-11-1 16:12 , Processed in 0.777530 second(s), 94 queries .

    回顶部