QQ登录

只需要一步,快速开始

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

maple基础

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

1

主题

5

听众

4

积分

升级  80%

该用户从未签到

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

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

2 O  h- ]+ N5 g  _ 1 b, v2 _; ^! Z$ s0 i7 d8 V4 }" u

& N9 G# [7 }5 t- T/ l. I
$ ^' ?4 x  _- I8 T7 V' Z& \
. n4 e" g. q) W7 N( u 2 h5 p/ v, k( v

1 H5 b) O2 N6 R: ?, E! Q- s ! x% f$ ~0 _* c5 K4 m

) U+ i# h1 \+ V  E$ N$ x" _/ O
# @2 c( `1 N" `. Z8 i6 D3 P! }
! T+ ?) W8 x! Y/ }. L
5 C! L; O3 G1 B! ~$ D9 B$ w
& Y, w, C; C5 }! [alpha        beta        gamma        delta        epsilon        zeta        eta        theta        iota        kappa        lambda        mu
& R4 e& Y. F& j2 l; i- V* |7 m$ W8 B4 [
) G$ o* |* I, H
& |5 z* ^6 @, p: b7 `3 K! w- c
2 H' P* C: W7 s2 }' F" c- a( l
+ X( m& L! a2 @" r3 i/ R- u
' k3 f3 x, E. e , w$ U5 g+ a/ y
! @" S0 y% Y* |* P, k3 N2 s/ [8 h
: o9 ]8 @4 I5 x$ s& @: R
, [* v- C4 @+ s& W! y
  F! W$ h2 y8 b: O+ F
# B2 J* U; |7 K. s% }2 N. @: w2 X
4 X4 n( A# {9 {
* k0 E! @4 e+ m4 @& u! N- w
nu        xi        omicron        pi        rho        sigma        tau        upsilon        phi        chi        psi        omega
" ]2 u+ v8 V, ~. q6 B, g4 }有时候为了美观或特殊需要,可以采用Maple中的函数或程序设计方式控制其输出方式,如下例:
; \( ^  U' U+ y7 F6 t4 A/ s+ I> for i to 10 do
7 ~' V( |6 b& }, jprintf("i=%+2d and i^(1/2)=%+6.3f", i, eval(sqrt(i)));
- V% l% x* o2 Eod;
/ b* b2 f( Z- T. u2 Vi=+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( b- t# s4 ]1 f* o8 w4 ~! g4 t  ]
+2d的含义是带符号的十进位整数,域宽为2. 显然,这种输出方式不是我们想要的,为了得到更美观的输出效果,在语句中加入换行控制符“\n”即可:3 q+ _; O( D* `0 g* X
> for i to 10 do
3 ^, D! ^$ q+ @: C. _, aprintf("i=%+2d and i^(1/2)=%+6.3f\n", i, eval(sqrt(i)));' t+ G& x% S6 p$ _2 i9 k
od;9 O+ w) c& I! [4 L! F' s
i=+1 and i^(1/2)=+1.000
: b3 @% `/ i, `2 k3 Yi=+2 and i^(1/2)=+1.414) h$ S5 i3 {5 p7 L+ A7 ~
i=+3 and i^(1/2)=+1.732
4 c( k1 ]+ a' f6 \9 C  w+ _: Ji=+4 and i^(1/2)=+2.000$ R& l2 J9 i# n$ F1 w3 P" W# {
i=+5 and i^(1/2)=+2.236* ~! s0 A+ p' b) s
i=+6 and i^(1/2)=+2.449/ e  u3 t' K# C
i=+7 and i^(1/2)=+2.646
0 H# I/ @  \) M" x2 |. Gi=+8 and i^(1/2)=+2.828: u; i9 l' U1 |/ y0 E/ [* _, D- e
i=+9 and i^(1/2)=+3.000
; g" c6 z  l" A9 d9 Q. h3 @: Bi=+10 and i^(1/2)=+3.162
7 m: f# B+ {! `  D6 ^- B1 @再看下例:将输入的两个数字用特殊形式打印:
; |8 G9 H; E7 ]/ X> niceP:=proc(x,y)
8 H1 R3 I% n9 U; g; |/ Pprintf("value of x=%6.4f, value of y=%6.4f",x,y);8 L1 J+ E4 B* B: a
end proc;0 Q7 o3 g$ I2 ^3 P
% E% x* Z; Q( u# [: U( j; h$ O
> niceP(2.4,2002.204);
+ q6 ^, r- m3 O5 W3 L1 \value of x=2.4000, value of y=2002.2040
) n% \; Q! T$ h) P$ |0 ^! g1 D1.4 Maple联机帮助" q  T& l% i* Y
学会寻求联机帮助是掌握一个软件的钥匙. Maple有一个非常好的联机帮助系统, 它包含了90%以上命令的使用说明. 要了解Maple的功能可用菜单帮助“Help”, 它给出Maple内容的浏览表, 这是一种树结构的目录表, 跟有…的词条说明其后还有子目录, 点击这样的词条后子目录就会出现(也可以用Tab键和up, down选定). 可以从底栏中看到函数命令全称, 例如, 我们选graphics…, 出现该条的子目录, 从中选2D…, 再选plot就可得到作函数图象的命令plot的完整帮助信息. 一般帮助信息都有实例, 我们可以将实例中的命令部分拷贝到作业面进行计算、演示, 由此可了解该命令的作用.
. R- }* V. n2 {0 r3 Z在使用过程中, 如果对一个命令把握不准, 可用键盘命令对某个命令进行查询. 例如, 在命令区输入命令“?plot”(或help(plot);), 然后回车将给出plot命令的帮助信息, 或者将鼠标放在选定的要查询的命令的任何位置再点击菜单中的“Help”即可.
  S' Y4 L. \9 S% {2  Maple的基本运算
% h( J1 j+ l# \# a2 m& R2.1 数值计算问题  [# O. @2 N0 Q  J$ q% i
算术是数学中最古老、最基础和最初等的一个分支, 它研究数的性质及其运算, 主要包括自然数、分数、小数的性质以及他们的加、减、乘、除四则运算. 在应用Maple做算术运算时, 只需将Maple当作一个“计算器”使用, 所不同的是命令结束时需加“;”或“:”. ) a% _' ?4 G3 b* F  x
在Maple中, 主要的算术运算符有“+”(加)、“–”(减)、“*”(乘)、“/”(除)以及“^”(乘方或幂,或记为**), 算术运算符与数字或字母一起组成任意表达式, 但其中“+”、“*”是最基本的运算, 其余运算均可归诸于求和或乘积形式. 算述表达式运算的次序为: 从左到右, 圆括号最先, 幂运算优先, 其次是乘除,最后是加减. 值得注意的是, “^”的表达式只能有两个操作数, 换言之,  是错误的, 而“+”或“*”的任意表达式可以有两个或者两个以上的操作数. + S2 t, J) G" o# S3 D4 C" P
Maple有能力精确计算任意位的整数、有理数或者实数、复数的四则运算, 以及模算术、硬件浮点数和任意精度的浮点数甚至于矩阵的计算等等. 总之, Maple可以进行任意数值计算.
. s1 K  l+ `  F3 e; ?但是, 任何软件或程序毕竟只是人们进行科学研究的一种必要的辅助, 即便它有很多优点, 但也有它的局限性, 为了客观地认识数学软件、认识Maple, 下面通过两个简单例子予以说明.
7 o6 @* y2 N6 }* \! B( j第一个简单的数值计算实例想说明Maple数值计算的答案的正确性:   
: }* p6 ?& s0 r* p> 3!!!;2 L- Y/ L  n  x4 d' T" U+ S; j4 ^
2601218943565795100204903227081043611191521875016945785727541837850835631156947382240678577958130457082619920575892247259536641565162052015873791984587740832529105244690388811884123764341191951045505346658616243271940197113909845536727278537099345629855586719369774070003700430783758997420676784016967207846280629229032107161669867260548988445514257193985499448939594496064045132362140265986193073249369770477606067680670176491669403034819961881455625195592566918830825514942947596537274845624628824234526597789737740896466553992435928786212515967483220976029505696699927284670563747137533019248313587076125412683415860129447566011455420749589952563543068288634631084965650682771552996256790845235702552186222358130016700834523443236821935793184701956510729781804354173890560727428048583995919729021726612291298420516067579036232337699453964191475175567557695392233803056825308599977441675784352815913461340394604901269542028838347101363733824484506660093348484440711931292537694657354337375724772230181534032647177531984537341478674327048457983786618703257405938924215709695994630557521063203263493209220738320923356309923267504401701760572026010829288042335606643089888710297380797578013056049576342838683057190662205291174822510536697756603029574043387983471518552602805333866357139101046336419769097397432285994219837046979109956303389604675889865795711176566670039156748153115943980043625399399731203066490601325311304719028898491856203766669164468791125249193754425845895000311561682974304641142538074897281723375955380661719801404677935614793635266265683339509760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
1 ?7 n( M7 \4 r. D; X# s7 K3 p上述运算结果在IBM PC机(1G, 128M)上计算只需要0.01秒, 得到如此复杂的结果(1747位), 一个自然的问题是: 答案正确吗?
3 [$ [% P  N- @! B' G为了回答这个问题, 我们借助于数值分析方法, 由Stiring公式; Z' \- A9 _7 R, ~& _- p

* Y& s! n& V) \+ l可得:  , 前三位数字与Maple输出结果相同, 且两者结果均为1747位. 另外, 在720!的计算中, 5的因子的个数为:   
1 c  f" M' z1 S, Y! y& U2 K; q- q - v3 A+ f0 L2 o
这些5与足够多的2相乘将得到178个0, 而Maple的输出结果中最后178位数为零. 由此, 可以相信Maple结果的正确性. 3 g3 a/ i9 O) W3 L3 p
另一个例子则想说明Maple计算的局限性:   
; O7 k0 u' u5 E. K0 K" Y% |  
/ X3 n) H4 c, k8 ZMaple在处理问题时, 为了避免失根, 从不求算术式的近似值, 分数则化简为既约分数. 因此, 在Maple中很容易得到:   ) j4 N3 x% c- l3 _; _! ]

- P9 p9 E- W+ ?2 y5 I* ]. Q: }显然这是错误的. 这一点可以从代数的角度予以分析.
  ?' M6 g- z$ y/ u' P3 h不妨设 , 则 , 即 , 显然 有3个结果, -2是其实数结果.
! n0 I' k( _2 e6 c. k另一方面, 设 , 则 , 即:9 t6 B3 H# j$ t" `5 M$ Z. M3 `

* U$ x; R3 s7 Q- X4 h' x/ g显然 有6个结果, -2、2是其实数结果.
/ d% k. r3 o% q& l2 W  v5 v( V这个简单的例子说明了Maple在数值计算方面绝对不是万能的, 其计算结果也不是完全正确的, 但是, 通过更多的实验可以发现: Maple只可能丢失部分结果, 而不会增加或很少给出完全错误的结果(如上例中Maple的浮点数结果皆为 ). 这一点提醒我们, 在利用Maple或其他任何数学软件或应用程序进行科学计算时, 必须运用相关数学基础知识校验结果的正确性. . }, \$ x8 o) A. @- A
尽管Maple存在缺陷(实际上, 任何一个数学软件或程序都存在缺陷), 但无数的事实说明Maple仍然不失为一个具有强大科学计算功能的计算机代数系统. 事实上, Maple同其他数学软件或程序一样只是科学计算的一个辅助工具, 数学基础才是数学科学中最重要的.
2 E3 o3 M9 w# z( |" P& w2.1.1 有理数运算
! ~. A5 l3 ?3 L( @7 c. ]作为一个符号代数系统, Maple可以绝对避免算术运算的舍入误差. 与计算器不同, Maple从来不自作主张把算术式近似成浮点数, 而只是把两个有公因数的整数的商作化简处理. 如果要求出两个整数运算的近似值时, 只需在任意一个整数后加“.”(或“.0”), 或者利用“evalf”命令把表达式转换成浮点形式, 默认浮点数位是10 (即: Digits:=10, 据此可任意改变浮点数位, 如Digits:=20). 4 f+ J3 k$ J8 k+ E6 z8 [6 I
> 12!+(7*8^2)-12345/125;
0 g1 g+ ]$ U# @: h! r& U 3 @4 A/ o+ g! r/ \
> 123456789/987654321;
, |- |' M9 H9 S3 g 3 R& l, P7 B% ~
> evalf(%);  p0 K5 i3 j& q# N& P

  ]$ D% ?# h2 F" W> 10!; 100*100+1000+10+1; (100+100)*100-9;
: `" ]/ J( o) t; S) }- e+ o" ?0 S: k
3 B( s2 C, t* A, V* w
7 x. I9 R* R- A' _0 h 7 g. B5 c0 ?2 j: n& l
> big_number:=3^(3^3);
8 V+ E9 d+ S; n) I5 R* Z  K 7 W. a2 x( q& ^' U, A2 A7 ?
> length(%);' f4 d' T0 ?" {6 y. e
& J  \  l' B6 W  ^# c  K1 a2 Y
上述实验中使用了一个变量“big_number”并用“:=”对其赋值, 与Pascal语言一样为一个变量赋值用的是“:=”. 而另一个函数“length”作用在整数上时是整数的十进制位数即数字的长度. “%”是一个非常有用的简写形式, 表示最后一次执行结果, 在本例中是上一行输出结果. 再看下面数值计算例子:   
# ]2 K% N, j& f! l    1)整数的余(irem)/商(iquo)
2 F4 H/ ?5 k9 ~6 y4 G0 T命令格式:   
9 _, g3 {3 Q: C# N3 |irem(m,n);        #求m除以n的余数
# p6 \( b& A5 V+ U( Airem(m,n,'q');    #求m除以n的余数, 并将商赋给q
% v! z& g9 B0 M' p4 I) \" qiquo(m,n);        #求m除以n的商数
1 K' e+ v( l3 S' w7 I& `6 A) riquo(m,n,'r');    #求m除以n的商数, 并将余数赋给r
( S; u6 J( L2 o% T其中, m, n是整数或整数函数, 也可以是代数值, 此时, irem保留为未求值.
$ c4 p6 ~& B; A  V, F4 O+ W- ?> irem(2002,101,'q'); # 求2002除以101的余数, 将商赋给q( Z" v; ^9 W) T7 W
, s+ G5 w' Q. y% T& j( J9 b
> q; #显示q
: N; o3 W& T7 d* d- U * n, e3 f8 m7 y( |7 B5 H# z
> iquo(2002,101,'r'); # 求2002除以101的商, 将余数赋给r$ e6 y. w5 M. C* w+ }8 \
- x* _7 T& t9 |4 X" f) z3 P
> r; #显示r
, V  g2 f& l; C! z ( B/ `1 K: {2 C, z" A& C
> irem(x,3);
* t( x# H3 b, ]9 U* K; [" I3 n 6 |, [8 T5 b* M& t6 K
2)素数判别(isprime)3 h' F/ k9 u# ?1 S
素数判别一直是初等数论的一个难点, 也是整数分解问题的基础. Maple提供的isprime命令可以判定一个整数n是否为素数. 命令格式: isprime(n); # [& d2 p- s! m& r% k$ e
    如果判定n可分解, 则返回false, 如果返回true, 则n“很可能”是素数. ) W5 O0 Y! i0 u( I2 E
> isprime(2^(2^4)+1);/ q' N$ t& Q% i3 H/ B- a; R

+ t* v4 \6 w4 O$ s: s: a) P% N3 h> isprime(2^(2^5)+1);8 v) z9 _8 u" p; c: g+ M

2 ]& _* o0 l9 r, {8 L( Y% D8 Y6 G上述两个例子是一个有趣的数论难题。形如 的数称为Fermat数, 其中的素数称为Fermat素数, 显然, F0=3、F1=5、F2=17、F3=257、F4=65537都是素数. Fermat曾经猜想所有的Fn都是素数, 但是Euler在1732年证明了F5=641•6700417不是素数. 目前, 这仍是一个未解决的问题, 人们不知道还有没有Fermat素数, 更不知道这样的素数是否有无穷多.
: \* I; x! e. {3) 确定第i个素数(ithprime)
/ i* s( Y8 B" D若记第1个素数为2,判断第i个素数的命令格式: ithprime(i);   
- D* c) N' `5 Y, ~. ]/ d0 Q> ithprime(2002);
- @* \6 j# q3 H" c* O) L+ @1 `7 s
. x3 _$ o% O$ e3 d/ W> ithprime(10000);
  c$ ]5 P4 n3 v# n- F7 [ 2 I2 t. Z* _1 c+ W
4) 确定下一个较大(nextprime)/较小(prevprime)素数
! s. f" N/ o& B2 P. h0 g9 D7 E当n为整数时,判断比n稍大或稍小的素数的命令格式为:   
1 |( @, A! ^* N' nnextprime(n);  6 ?" l0 q' Y6 n7 w* R# m) S& ~
prevprime(n); % g( S$ J" K0 ]: T$ z
> nextprime(2002);9 G2 z- I8 g- T8 Y* O- S

2 M9 `  k/ O, C& P2 k7 W> prevprime(2002);: m* Q7 p7 {. k3 _3 S) p5 k8 l
+ b% H' M' [6 C, Q" U
5) 一组数的最大值(max)/最小值(min)
8 q1 Z- m; t, m0 H命令格式: max(x1,x2,…,xn);   #求x1,x2,…,xn中的最大值6 S" g6 n+ A5 R( x: L$ |1 x
             min(x1,x2,…,xn);   #求x1,x2,…,xn中的最小值0 M( J% b; `( i# @9 N( j
> max(1/5,ln(3),9/17,-infinity);
+ M2 V9 }: \' ]9 W8 f' f6 H; ]
! m1 Z$ I+ h. l* A: B> min(x+1,x+2,y);) q1 k6 s4 {0 o

& F, Q* B5 G/ w! r. X6)模运算(mod/modp/mods)
/ F) \6 A2 F: ^, A0 j+ g命令格式:  e mod m;    # 表达式e对m的整数的模运算
/ u4 k) k" o- F' }. ?modp(e,m);  # e对正数m的模运算
+ C$ l) x7 n1 |; B6 l5 O- O' Omods(e,m);  # e对m负对称数(即 -m)的模运算$ k! Y  _* L# K( o
`mod`(e,m);  # 表达式e对m的整数的模运算, 与e mod m等价
- \' u% J. {/ C& _值得注意的是, 要计算i^n mod m(其中i是一整数), 使用这种“明显的”语法是不必要的, 因为在计算模m之前, 指数要先在整数(可能导致一个非常大的整数)上计算. 更适合的是使用惰性运算符“&^”即: i &^n mod m, 此时, 指数运算将由mod运算符智能地处理. 另一方面, mod运算符的左面优先比其他运算符低, 而右面优先高于+和-, 但低于*和/.
/ n" M9 W  \7 h9 K: W8 h9 |' l> 2002 mod 101;+ t& O* X' w" U: w

* q4 C# d( ?6 {3 ~/ g+ g- O> modp(2002,101);2 ]0 E% z8 J" x- h3 n/ v

7 h, `, P) |5 w3 R* l> mods(49,100);
# \0 p! R4 G3 `; m   M5 t/ E) ^& Z4 X8 l$ y
> mods(51,100);
+ q* P& D7 s7 _. `: W
8 Y5 b6 z/ K3 Y# m0 m  ^> 2^101 mod 2002;  # 同 2 &^101 mod 2002;
, i4 D0 N" `! Q0 y$ F
/ |! o+ B0 w& n1 k+ d- y, v7)随机数生成器(rand)
9 {8 Q' r1 u" x# d. Y1 {  `' j命令格式:   
/ J8 w1 O6 l3 q6 Z: V" s1 `& lrand( );    #随机返回一个12位数字的非负整数
  ]9 G. t- P# _. }+ mrand(a..b);  #调用rand(a..b)返回一个程序, 它在调用时生成一个在范围[a, b]内的随机数7 l2 o& p  s0 m7 f+ ?
> rand();
3 A/ B% X0 V7 {# B6 e$ `* B% u
; E. {! @1 |( `" c1 d3 E> myproc:=rand(1..2002):
3 o( D. X4 i0 t  {0 V7 v> myproc();3 b# T! e. s* w* V) n0 ~

7 o& t+ U  W# Z" r> myproc();
% `( m+ _; f1 U* C* H6 L& R 5 ]) V- |* e# W
    注意, rand(n)是rand(0..n-1)的简写形式.
7 @. Z( V4 _. J" S) I/ B2.1.2 复数运算$ D6 `* V/ J5 }% K. Z  ]$ s
复数是Maple中的基本数据类型. 虚数单位i在Maple中用I表示. 在运算中, 数值类型转化成复数类型是自动的, 所有的算术运算符对复数类型均适用. 另外还可以用Re( )、Im( )、conjugate( )和argument( )等函数分别计算实数的实部、虚部、共轭复数和幅角主值等运算. 试作如下实验:   $ U9 u( g: f5 s1 ?* {
> complex_number:=(1+2*I)*(3+4*I);
; k2 U& U, T$ d/ Y, I; f8 X
8 ]: g* L9 O3 E- w# c> Re(%);Im(%%);conjugate(%%%);argument(complex_number);! \! v9 k7 p9 S/ Y

3 i' u- ^5 T. N- t7 h) S/ y 4 t+ Q; t0 T; R5 O' b' G, o/ T

$ e" K; \5 e5 w. {( s2 _" N" L 0 |! G" q/ Q5 ^. H7 x
值得注意的是上行命令中均以“;”结束, 因此不能将命令中的2个%或3个%(最多只能用3个%)改为1个%, 因为%表示上一次输出结果, 若上行命令改为“,”结束, 则均可用1个%.
5 w  {+ B: H/ y( \2 q6 `为了在符号表达式中进行复数运算, 可以用函数evalc( ), 函数evalc把表达式中所有的符号变量都当成实数, 也就是认为所有的复变量都写成 的形式, 其中a、b都是实变量. 另外还有一些实用命令, 分述如下:   
& C2 o! x2 a' r, _- J; [% t' ]1) 绝对值函数
8 i! s5 {) l5 ]+ {命令格式: abs(expr);    t1 b) E: o3 I) F( i% ]
当expr为实数时,返回其绝对值,当expr为复数时,返回复数的模.5 }2 {6 A3 v! y2 f3 u' t
> abs(-2002);    #常数的绝对值
0 {4 c' ^1 O+ ?5 H. ^8 ]' i
! d" k/ h: M% _+ i6 W5 D> abs(1+2*I);   #复数的模0 G0 G  L4 s2 b% z% ]

8 i  w5 }  v- d) t> abs(sqrt(3)*I*u^2*v);  #复数表达式的绝对值
3 q, @- X& \. L. V 4 g+ ?- R/ i" G1 x/ z: Q
> abs(2*x-5);   #函数表达式的绝对值& R% E2 ?9 h' }+ I" l

1 g' F: _7 w3 a2)复数的幅角函数1 x, |' [3 n1 L8 r1 h
命令格式:   argument(x);  #返回复数x的幅角的主值
2 E, {  k$ ?% G1 o& ?> argument(6+11*I);! h$ Q3 D' U/ k4 D' k" _$ O

( s  G7 u4 y7 J& D! K8 W+ J> argument(exp(4*Pi/3*I));/ f  b( i- h3 k. O; F$ y! b# H/ e

& t# v5 h2 Q" v: Q3)共轭复数
& P- L; a) @" f) l( u( ?! y/ q命令格式:   conjugate(x);  #返回x的共轭复数4 r( m1 }: O1 _' R! s3 Q
> conjugate(6+8*I);( ~0 M$ U) [$ q3 D& Q; C& h& {

& I5 z/ g: `) C/ q% y> conjugate(exp(4*Pi/3*I));
; _+ N( Y0 Q" S, R 1 u# ], n/ O9 S4 \4 S2 j% T$ d2 M
2.1.3 数的进制转换7 g( I, M6 F3 i
数的进制是数值运算中的一个重要问题. 而在Maple中数的进制转换非常容易, 使用convert命令即可. 5 @* _7 l2 l/ L+ x* v& e9 @) }" g
命令格式:   convert(expr, form, arg3, ...);    , `0 `/ x. p# K" R$ O8 D" C* r
其中, expr为任意表达式, form为一名称, arg3, ... 可选项.
. c( |2 ?/ }1 K下面对其中常用数的转换予以概述. 而convert的其它功能将在后叙章节详述. : U. s' v0 ^, x0 q1 k" ^. L
    1)基数之间的转换
; `% y4 `: H, M; p" H命令格式:   
( F' u& E. p3 J# L' }( zconvert(n, base, beta);      #将基数为10的数n转换为基数为beta的数
* Q0 O$ @) U; b    convert(n, base, alpha, beta);#将基数为alpha的数字n转换为基数为beta的数
9 X. Y1 t2 P+ n" A/ f% G> convert(2003,base,7); #将10进制数2002转换为7进制数, 结果为: (5561)7
: C) I2 h4 U1 g! K8 O" n: _ 2 }) F% ]7 ]% I  i4 ]" v
> convert([1,6,5,5],base,7,10); #将7进制数5561转换为10进制数' h; |: v+ a+ o+ O
6 `4 ]' E( j8 k; m# o4 k
> convert(2002,base,60);       #将十进制数2002转换为60进制数, 得33(分钟)22(秒)) z8 D7 A" h5 \4 \& X
. G, ?, L4 F% Y1 p3 z0 s1 V% I
    2)转换为二进制形式
; w/ c& Z1 ?3 O) }  ~9 C命令格式: convert(n, binary);
( x# @1 G' A7 k6 H* d/ H, h# g其功能是将十进制数n转换为2进制数. 值得注意的是, 数可以是正的, 也可以是负的, 或者是整数, 或者是浮点数, 是浮点数时情况较为复杂. 5 s1 U5 A' S$ r  p$ q5 a5 F3 k
> convert(2002,binary);   
' |! @* `- b! c: ^" M; J5 Z
! }8 f% d5 S- G; ]0 V( v" o> convert(-1999,binary); , t8 `: h  ~/ M. {# o5 n, v

5 K; c0 ~/ H; v) k: K! b> convert(1999.7,binary);
) N( z5 p3 C0 d0 W+ F1 S
$ u$ H/ s! h: {8 l, w& j3)转换为十进制形式. @6 e  z8 }& P) p, U" ^4 \
其它数值转换为十进制的命令格式为:   " }0 v. b. J1 R' p6 b* ?
convert(n, decimal, binary);   #将一个2进制数n转换为10进制数6 }" M! t# h! Q' h- E
    convert(n, decimal, octal);    #将一个8进制数n转换为10进制数
* s  L5 r$ t/ g% g6 x$ C% G& \    convert(string, decimal, hex);  #将一个16进制字符串string转换为10进制数+ ~* |* l/ X9 D# ~3 x1 e& h
> convert(11111010010, decimal, binary);   
% B4 D4 `4 k* f 0 r8 h2 }7 O( y2 c, P
> convert(-1234, decimal, octal);           
5 C! Y2 t) f' q/ h7 Q, g
, K1 e9 s5 d! O+ O1 p- T> convert("2A.C", decimal, hex);         
, b# F4 q0 L6 E' ?$ l" r& X( G+ o( v 0 D9 t6 I; ~) E9 B
4) 转换为16进制数
5 ^+ Y: |6 D3 i; R将自然数n转换为16进制数的命令格式为: convert(n, hex);   
! a. ?9 G# O7 K> convert(2002,hex);  convert(1999,hex);
6 }- u2 |& Z% [3 F" V- W3 q. t & F  S! k1 B3 p

+ q8 C  R  q  J& e6 L, w5)转换为浮点数) f: U' Q) Z' |9 f
命令格式: convert(expr, float);- H) H6 l  l0 I) a3 Z/ T: Y+ W
注意, convert/float命令将任意表达式转换为精度为全局变量Digits的浮点数, 且仅是对evalf的调用. 5 k, s, h3 }( f7 C; z5 m7 t/ Y
> convert(1999/2002,float);
5 h9 |. K( }5 q: q2 ~2 v. h- } 8 {0 Z: Y4 d5 n0 Z# s  b8 s
> convert(Pi,float);! m& {5 w5 T5 R2 q( c2 Z
" V1 T+ S; e% d/ ]
2.2 初等数学. v" J$ l3 V( j: h5 l- [! z
    初等数学是数学的基础之一, 也是数学中最有魅力的一部分内容. 通过下面的内容我们可以领略Maple对初等数学的驾驭能力, 也可以通过这些实验对Maple产生一些感性认识.
2 F# r% L: G9 q( S8 g4 A# x1 T2.2.1 常用函数4 ^" \$ E& v$ k/ h# W
作为一个数学工具, 基本的数学函数是必不可少的, Maple中的数学函数很多, 现例举一二如下:   + L# j) f8 d6 ]% w6 @
指数函数: exp
. r, V( E' j1 h* Y) I: O  M+ b3 i一般对数: log[a]
8 |0 N! c6 {( t7 [# D; K自然函数: ln
5 Z" u1 e2 N' n; m$ S' K5 Y- L( X常用对数: log10
- R+ C) S% r2 L# g平方根: sqrt  j4 R0 ?5 @/ K
绝对值: abs
$ N; c% v/ C# j6 Z0 v三角函数: sin、cos、tan、sec、csc、cot  k# ~- S# K' w  a" Y: I$ k. r4 h
反三角函数: arcsin、arccos、arctan、arcsec、arccsc、arccot
. k- G# O1 m- b0 E5 Q4 ?4 A7 \8 a双曲函数: sinh、cosh、tanh、sech、csch、coth- W- U) }7 x% t; V3 I
反双曲函数: arcsinh、arccosh、arctanh、arcsech、arccsch、arccoth$ L1 t6 l/ ?. o: G  Y
贝赛尔函数: BesselI、BesselJ、BesselK、BesselY0 m. Q# x- P, q. W( T- w
Gamma函数: GAMMA% G" \6 a, M1 l( d5 a
误差函数: erf- E) w: p2 y2 ^( B5 g
函数是数学研究与应用的基础之一, 现通过一些实验说明Maple中的函数的用法及功能.   v/ q2 R' F0 x* R! ]
1) 确定乘积和不确定乘积8 v) }* n9 q2 r1 ~
命令格式: product(f,k);  
0 O( s* d* u7 f1 n, o$ Sproduct(f,k=m..n);  
- u: t  Y' b( G7 w# }product(f,k=alpha);
6 d( G6 L3 [1 c7 z5 S& w' q5 hproduct(f,k=expr);
7 ^( y9 y, k4 J  P/ T: I/ O其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—包含k的任意表达式. / Y; T% C* O! n$ A; k, V& a
> product(k^2,k=1..10);   #计算 关于1..10的连乘6 {: L1 k: q  \" k' B- P4 M

- b1 U7 b* u( j- J8 a( @9 g> product(k^2,k);         #计算 的不确定乘积, v3 I4 N8 R4 s* P
- P3 U4 [+ P) G8 s1 Q  Y
> product(a[k],k=0..5);    #计算ai(i=0..5)的连乘, y2 }) ?5 @/ v. o- E5 T
% N, s( V! L" @- f9 |. S
> product(a[k],k=0..n);    #计算ai(i=0..n)的连乘5 \6 K8 F! O. b* C) v( k
& z% }* h& N4 q! ~% |9 s
> Product(n+k,k=0..m)=product(n+k,k=0..m);   #计算(n+k)的连乘, 并写出其惰性表达式
" j& ]+ a" n  @3 y9 z8 f  N ) i6 z8 M% l3 j9 J8 q$ T
> product(k,k=RootOf(x^3-2));     #计算 的三个根的乘积
3 x' r4 w" w* C7 K- d. o0 e * T# M/ r8 G/ `5 o% p
    product命令计算符号乘积, 常常用来计算一个公式的确实或不确实的乘积. 如果这个公式不能求值计算, Maple返回 函数. 典型的例子是:   
$ h0 e$ F" `; q8 b> product(x+k,k=0..n-1);
* c0 T1 f" ?8 R$ m6 Y- _ ! N5 f9 g3 t! q' v
如果求一个有限序列值的乘积而不是计算一个公式, 则用mul命令. 如:   # ^* ]. r  I8 X4 Y# z
> mul(x+k,k=0..3);
9 G# K% V) |1 q# f " y$ Y6 i: d+ E7 G( m
2)指数函数. i( M: g. T1 C1 T) C* c
计算指数函数exp关于x的表达式的命令格式为: exp(x);
" X3 y0 \4 |+ K3 R" }+ g: ~> exp(1);
7 J9 X! S0 e1 r 0 a! V8 x; p1 q" Q& F5 l7 U
> evalf(%);
! _) P' U/ i% u3 f. \2 L2 K 1 E% Y# _8 ?% b. R6 M+ A( U
> exp(1.29+2*I);
7 m! b4 e7 I" U1 D9 e# Y. H % C$ i) Z4 R( }  Z6 ?1 N
> evalc(exp(x+I*y));4 d& H2 U7 ?) E5 t3 _4 R
# t7 C  Y" j0 d2 }
3)确定求和与不确定求和sum
1 ?" ?8 J9 g/ L, q0 C. T6 D* T* o; W命令格式: sum(f,k);  
9 M: m7 C9 o: z3 z9 P# u: U6 Jsum(f,k=m..n);  
! t- ~* p( X2 ~sum(f,k=alpha);
' h8 s! I0 i7 l0 i  osum(f,k=expr);5 y/ h- u- @% D5 g2 s1 o" r
其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—不含k的表达式.
+ P, n# }. r; X- k  r, z" B> Sum(k^2,k=1..n)=sum(k^2,k=1..n);& O8 D7 ^$ K( c1 K) e

' D7 u# N* Q. w> Sum(k^3,k=1..n)=sum(k^3,k=1..n);: [2 v+ y/ N7 {; K4 z9 I% S
. v- A( f& k% {% H- {
> Sum(k^4,k=1..n)=sum(k^4,k=1..n);4 S# G6 l* c/ ^( V2 q! ^" }
2 i% [" Z& q7 E1 j* \
> Sum(1/k!,k=0..infinity)=sum(1/k!,k=0..infinity);
: C* f4 o; x" R* @$ P + ~1 V: T+ e/ ]- [3 q
> sum(a[k]*x[k],k=0..n);" P5 F! i, n% c3 k' d

0 p9 \' M" @0 }4 j) T> Sum(k/(k+1),k)=sum(k/(k+1),k);
+ E" s6 j& D2 I! v3 n 3 x" O  \8 V, z8 b
> sum(k/(k+1),k=RootOf(x^2-3));* r6 o9 t7 R8 `  ?( L$ t

7 k2 ?8 O1 K( W) R4 |4 J- K' {, C5 Esum函数可计算一个公式的确定和与不确定和, 如果Maple无法计算封闭形式, 则返回未求值的结果. 值得注意的是, 在sum命令中将f和k用单引号括起来, 可避免过早求值. 这一点在某些情况下是必需的. ; ^# x1 W& h. J6 r
> Sum('k','k'=0..n)=sum('k','k'=0..n);" \: M. f6 F+ U5 O9 @
' D; Q. g- C. n% J# p/ W
如果计算一个有限序列的值, 而不是计算一个公式, 可用add命令. 如:   1 f, d' u) c" h1 w  Z
> add(k,k=1..100);
) \  s6 v; }* m. K * G# F+ ?' T) b5 r9 q* Y& {. f7 J
尽管sum命令常常用于计算显式求和, 但在程序设计中计算一个显式和应该使用add命令.
1 [' h# D% e1 H" ^; O* @另外, sum知道各种求和方法, 并会对各类发散的求和给出正确的结果, 如果要将求和限制为收敛求和, 就必须检查显式的收敛性. 8 j3 Y' K. D5 x4 o
3)三角函数/双曲函数
# E- W( |( i4 @0 f( B" h% ^3 n命令格式:   sin(x);   cos(x);   tan(x);   cot(x);   sec(x);   csc(x);
4 g& {& l, K& b  Z/ v* f0 p0 }          sinh(x);  cosh(x);  tanh(x);  coth(x);  sech(x);  csch(x);
4 ~) t8 g8 Q4 {3 y' W3 M其中, x为任意表达式. : y6 ~: @4 _" r' ^- X( J' Q& M& q
值得注意的是三角函数/双曲函数的参数以弧度为单位. Maple提供了利用常见三角函数/双曲函数恒等式进行化简和展开的程序, 也有将其转化为其它函数的命令convert.8 O; y1 K* I8 ?
> Sin(Pi)=sin(Pi);
' ]+ C8 [% X4 ]/ N7 ~ 7 O8 r0 A+ C, O1 d  }' X
> coth(1.9+2.1*I);
- U! N3 r  y7 N2 p) u' m % E) q5 W# {) q7 v7 o# h
> expand(sin(x+y));     #展开表达式
. D' x( T8 F. F; w6 c6 G' m6 ?. M2 ~
0 q! \# s% o6 ?" o: m> combine(%);        #合并表达式+ g+ u- E; O: z# u5 s

) v9 r8 P' N* h0 U/ Y8 [> convert(sin(7*Pi/60),'radical');1 H& v: q" p) Z# X% [2 s" Y$ U( x

2 ~+ n1 V9 D/ M: E5 A/ W> evalf(%);
) ^& d. x! N0 R: d0 g9 i
* c/ o- z6 j1 q2 o) ?但有趣的是, combine只对sin, cos有效, 对tan, cot竟无能为力.
" ?7 v+ }7 J3 V$ H3 U* G/ H* P4)反三角函数/反双曲函数- Q' W5 y; K4 i' I% X
命令格式: arcsin(x);   arccos(x);   arctan(x);   arccot(x);   arcsec(x);   arccsc(x);( i" I$ M  |8 U8 o. {! `" I* J4 v: I2 A& C
     arcsinh(x);  arccosh(x);  arctanh(x);  arccoth(x);  arcsech(x);  arccsch(x);   * n0 u0 i) t: B, \& u4 d; z0 G
arctan(y,x);8 q7 W) a% D! S( j+ K  U
其中, x, y为表达式. 反三角函数/反双曲函数的参数必须按弧度计算. ! F( }& v+ y3 p) r. T6 k% t3 m
算子记法可用于对于反三角函数和反双曲函数. 例如, sin@@(-1)求值为arcsin.
4 r8 R9 M# `3 b) A9 {> arcsinh(1);+ n% `8 G4 X& I& y+ d

4 c$ C! Z1 a; C! A# t> cos(arcsin(x));
) M) l6 C' i( x" \3 E0 |' i" j/ N& [ 3 q! c8 n/ B* M9 C$ s  F% {1 p
> arcsin(1.9+2.1*I);
* Y- i! L+ R% x: ]; _   f5 _+ H) V0 o; T, t. ^
5)对数函数) s8 I7 Z: T& y6 g4 p
命令格式: ln(x);           #自然对数
; E$ w/ t. K3 z2 I0 N; T4 Mlog[a](x);        #一般对数
$ l. v' V8 x9 W3 Qlog10(x);        #常用对数/ F5 Z: X: N/ I9 Y8 P
一般地, 在ln(x)中要求x>0. 但对于复数型表达式x, 有:   
9 I$ C0 b. N" L2 ?4 V3 Q7 \% |  (其中,  )
4 |# X; `% E0 U; L- _> ln(2002.0);
" }3 P6 Q% q' U6 t $ u4 i$ x: \# A% q  U7 b
> ln(3+4*I);$ R- d/ W4 t; k: X

) }% @4 @' l  d: a  ?+ y# E2 d> evalc(%);    # 求出上式的实部、虚部
1 i# _- C  q1 z- j0 U
) D$ @+ F' }6 g. m> log10(1000000);9 |0 V% L  l% X8 V7 D% }4 w
! O8 s; r+ @+ g/ S3 V
> simplify(%);   #化简上式
+ p4 g2 G. }2 m. A0 X
/ e" Y* R; V; S4 O2.2.2 函数的定义
6 V4 X: z+ S; X, J) H% o4 `) b/ EMaple是一个计算机代数系统, 带未知或者已知字母变量的表达式是它的基本数据形式. 一个简单的问题是, 既然表达式中可以包含未知变量, 那么它是不是函数呢?试看下面一个例子:   
" X+ F2 |" p& W5 {2 p; Q7 M> f(x):=a*x^2+b*x+c;4 a9 l) o3 M$ P" Z' h+ ?7 Z; |$ ~

7 ]  O0 S2 _+ r. `) c. `可以看出, Maple接受了这样的赋值语句, 但f(x)是不是一个函数呢?要回答这个问题,一个简单的方法是求函数值:   
& u3 j9 Y$ Q; I# x> f(x),f(0),f(1/a);, D/ `' O) v- i5 Y8 q
/ z5 a9 G, Y# {8 ?  f6 C: _8 m
由上述结果可以看出, 用赋值方法定义的f(x)是一个表达式而不是一个函数, 因为f(x)不能把所定义的“自变量”或者“参数”转换成别的变量或表达式. 但从赋值“过程”可以看出, f(x)虽然也算是一个“函数”, 但却是一个没有具体定义的函数:   
5 Y; [  M; P7 w$ y# `7 k> print(f);
, K# I+ J0 J1 M$ S: z+ L8 H* y
1 }1 v% ]9 H; p2 G2 x7 Q/ P( H% H$ d事实上, 我们所做的赋值运算, 只不过是在函数f的记忆表(remember table)中加入了f(x)在x上的值, 当我们把自变量换作0或1/a时, f(x)的记忆表中没有对应的表项, 所以输出结果就是抽象的表达式. . @. T5 U7 S& @4 O1 ?
在Maple中, 要真正完成一个函数的定义, 需要用算子(也称箭头操作符):   : a  l" U" R7 p, V
> f:=x->a*x^2+b*x+c;
* N7 G3 ?% L4 N' N$ F. L$ |
! ~& L$ |- l% X" y) S3 Y8 \> f(x),f(0),f(1/a);
2 H* ?/ f, U, d0 U8 J- d' c2 q # @5 z' U/ ~1 W6 B
多变量的函数也可以用同样的方法予以定义, 只不过要把所有的自变量定成一个序列, 并用一个括号“()”将它们括起来(这个括号是必须的, 因为括号运算优先于分隔符“,”). / ?' ?! ]* T/ |1 C/ t
> f:=(x,y)->x^2+y^2;  ]; ?' A1 {& {% e. P

& E" F2 Z3 B1 Y! m/ s0 N' H9 f& {% |> f(1,2);1 o# [* l7 `9 o# i) u% X
0 i; a' t! z0 Y
> f:=(x,y)->a*x*y*exp(x^2+y^2);
1 X" t( M/ L5 f2 H" P# U! g ( G4 [! d) z/ H& Q9 F$ }" l
综上所述, 箭头操作符定义函数的方式一般为:   " G6 X' v- s$ b/ {4 r
一元函数: 参数->函数表达式
' D& ?( F: o# j. }8 w- Y2 f多多函数: (参数序列)->函数表达式* z3 K: ^8 l' ^% R5 n9 _+ N
无参数函数也许不好理解, 但可以用来定义常函数:   
7 c% Y$ Q9 J/ i  B# }2 z> E:=()->exp(1);7 `  Q4 O+ V3 b4 N3 P" P

* Y) w1 e' o, i( i> E();/ w' S: X) i5 h1 l0 ]5 t

& u, P' G: Z1 o$ [' A' c; q> E(x);
5 G, c* E: d4 X. I# {" O2 P 2 w' t2 P3 ~' e7 j
另一个定义函数的命令是unapply,其作用是从一个表达式建立一个算子或函数. ! {* h2 B$ ]" T' ]' h- o
定义一个表达式为expr的关于x的函数f的命令格式为:  f:=unapply(expr, x);         
# `! V/ C0 q! e' ?4 p定义一个表达式为expr的关于x,y,…的多元函数f的命令格式为:  f:=unapply(expr, x, y, …);     " L5 M% s1 b* K3 V: }) [6 a: L- V' [' k
> f:=unapply(x^4+x^3+x^2+x+1,x);
& Y9 t: V0 ^7 y6 D0 K' K! R1 C, [ 2 {4 [7 ?, w0 m8 I, ~
> f(4);
, m7 P4 Y% m+ o/ k6 s- L$ {) F , u1 q. o! h# q# J  U4 X
> f:=unapply(x*y/(x^2+y^2),x,y);
& t5 m# }1 k5 d! p 7 m) ^  g' t, Z
> f(1,1);9 [! `. A8 H' v# j6 C( ]" b  s7 m

. J' {. ?4 P1 k9 n( z+ i4 @5 M; \借助函数piecewise可以生成简单分段函数:- K% @; X9 H- Y) m: z0 `8 k  e
> abs(x)=piecewise(x>0,x,x=0,0,x<0,-x);3 o5 F8 K3 g' A. `$ P  V! B! ]2 t
3 {' W- ]/ s% f5 U
清除函数的定义用命令unassign.
6 N5 [0 h2 A! T/ R> unassign(f);# G( n3 T) s* X
> f(1,1);
, C/ u3 z9 j" t$ g! ^: x1 B# p3 O   x) ]3 ^  C' m0 @4 \+ G- m" D
除此之外, 还可以通过程序设计方式定义函数(参见第6章).
: p4 W# `  X2 T定义了一个函数后, 就可以使用op或nops指令查看有关函数中操作数的信息. nops(expr)返回操作数的个数, 函数op的主要功能是获取表达式的操作数,其命令格式为:+ t6 |2 d! S' U" k1 o
op(expr);          : |& K1 A% l5 C
op(i, expr);         ( K' M2 n8 i0 y5 s, J  B
op(i .. j, expr);      
6 j% K9 u1 J+ b, ?- Ynops(expr);
7 [& P/ ]- `" _2 B2 ~; u如果函数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的类型. 7 Y6 D( w  |$ n$ \$ ]4 X* t: {
命令op(i .. j, expr); 执行的结果是expr的第i到第j个操作数, i..j中含负整数时的情形同上.
, p1 R3 m5 j; {2 w5 r1 s& b命令op(expr); 等价于op(1..nops(expr), expr); + u& H, ?# }0 h% d8 v6 U. S2 b
特别地, 当op函数中i为列表[a1, a2, ..., an], 则op([a1, a2, ..., an], expr); 等价于op(an, op(..., op(a2, op(a1, e))...));
0 G$ F. d$ w0 V而当expr为一般表达式时,nops(expr)命令返回的是表达式的项数, 当expr是级数时返回级数每一项的系数和指数的总和.   ?! b$ I& {2 r- n4 L  M+ h
> expr:=6+cos(x)+sin(x)*cos(x)^2;
8 T$ J$ {. Z6 {6 q  k0 r 8 F2 \: p( @4 S0 y) s
> op(expr);
  h7 F* z& a9 J* M9 ?( x
. i* A; }! l* Z( Z; s> nops(expr);
5 t& c% ]. g: x* v  M$ ^ * C5 [2 t* c, I! E& L5 q
> p:=x^2*y+3*x^3*z+2;2 y. D/ {; K5 `2 ?& f
7 U( n) ^( Q$ E, v/ c
> op(1,p);. K5 Z" k! K  R9 [0 u

" i6 V! {; ]8 F5 W> op(1..nops(p),p);
6 w% T1 r; A0 s# Z6 q; r. g1 C! { ; r. `0 q+ O7 p9 V- `
> op(op(2,p));" Z, Q3 B0 u% {7 y; a1 p

/ X% z/ i) w+ V. \( B* t3 Q> u:=[1,4,9];
: E# ~' f2 Z  v( ?/ C
4 S* U6 e' m" |: d* [> op(0,u);
5 n/ m9 G4 @  F) d) A 2 B- x* ]/ N, e& }
> s:=series(sin(x),x=1,3);6 u! e3 X2 Z' r- B. ?

4 h8 d# `0 t0 [> op(0,s);
$ W9 }" L$ S! y7 M7 y         * x+ `$ W5 s. E" }9 o
> nops(s);
9 W) i1 J- \  w( j. y
" q7 x  ^' M3 w9 g下面一个有趣的例子说明了Maple在处理算术运算时的“个性”:0 L; H  O! b- ]$ d  Y0 _# L# N
> op(x*y*z);
/ x* r6 C! q* h* p, v
" @8 W1 I4 h- p4 b+ H> op(x*y*z+1);
" p$ M6 |& B: ]0 Q; ?0 ~
* p2 ]3 Z% @; o3 X: ]2 f: A2.2.3 Maple中的常量与变量名$ _) N' T" F8 [5 E* E4 r, s7 `2 ]
为了解决数学问题, 一些常用的数学常数是必要的. Maple系统中已经存储了一些数学常数在表达式序列constants中:   
6 X) w0 K, T% I' W* g: E. U> constants;
0 c7 ]6 b& X8 a; C$ V; N% r0 D , T  I# G! W( d1 v( N
为了方便使用, 现将上述常数的具体含义列示如下:   
1 j7 C( x% {- n6 l' n$ w8 v: r' d常    数        名 称        近似值$ e; q1 T% }$ }6 \- g8 o6 }
圆周率
- X6 H. H7 H: |3 Q# \- O6 w5 ePi        3.1415926535; `- A& X2 J: d! h. C! A; k% M
Catalan常数
; N" ^' \3 e8 |% NCatalan        0.9159655942' h* w8 b7 O9 W
Euler-Mascheroni常数 7 m0 [, W$ Q4 D
gamma        0.5772156649
1 q" l7 u. h$ a! Z( r4 p/ k
$ F9 q% \3 U1 cinfinity        7 `5 g+ M  u8 \4 {+ x! K) M! f

* f! K3 s! z0 q& {3 a需要注意的是, 自然对数的底数e未作为一个常数出现, 但这个常数是存在的, 可以通过exp(1)来获取. , b8 f" V% D6 l
在Maple中, 最简单的变量名是字符串, 变量名是由字母、数码或下划线组成的序列, 其中第一个字符必须是字母或是下划线. 名字的长度限制是499个字符. 在定义变量名时常用连接符“.”将两个字符串连接成一个名. 主要有三种形式: “名.自然数”、“名.字符串”、“名.表达式”. 3 C$ H% Z3 z+ I' b% f
值得注意的是, 在Maple中是区分字母大小写的. 在使用变量、常量和函数时应记住这一点. 数学常量 用Pi表示, 而pi则仅为符号 无任何意义. 如g, G, new_term, New_Team, x13a, x13A都是不同的变量名.
6 p" b, X/ \" A' `5 ^在Maple中有一些保留字不可以被用作变量名:   
, t& n( N* D6 O0 Eby      do      done     elif     else     end        fi        for      ; m/ z1 ^: l) {5 v# a
from    if       in       local     od     option    options     proc         
: W0 B8 Q) |* n9 Q( {  Mquit    read     save     stop     then     to        while      D5 X7 r7 R5 ~) U9 {+ p
Maple中的内部函数如sin, cos, exp, sqrt, ……等也不可以作变量名.
3 K" W: P4 i& H另外一个值得注意的是在Maple中三种类型引号的不同作用:   4 G, T  ^9 o/ s! [
`  `:   界定一个包含特殊字符的符号, 是为了输入特殊字符串用的;   
& s4 j, H7 V% I0 c0 ~. M+ q'  ':   界定一个暂时不求值的表达式;   
$ e. p  ^: {5 q3 F; N( {0 j"  ":   界定一个字符串, 它不能被赋值.
! k9 D$ Y0 r5 \1 o+ F/ O2.2.4 函数类型转换           
+ [# s$ Y& v+ U3 _函数类型转换是数学应用中一个重要问题, 譬如, 将三角函数转换成指数函数, 双曲函数转换成指数函数, 等等. 在Maple中, 实现函数类型转换的命令是convert. 命令格式:  
% _5 z4 o' @: H1 Z4 s6 Y* |5 _    convert(expr, form);        #把数学式expr转换成form的形式
7 [' |& L5 z2 y/ [3 e! iconvert(expr, form, x);      #指定变量x, 此时form只适于exp、sin、cos; C0 Q% T, |8 R
convert指令所提供的三角函数、指数与函数的转换共有exp等7种:   
! D; E# V4 ~# J" c(1) exp: 将三角函数转换成指数
1 z8 |# H! t. q* v) H; G(2) expln: 把数学式转换成指数与对数" b6 w4 t; e0 z* [; V8 M0 P9 T
(3) expsincos: 分别把三角函数与双曲函数转换成sin、cos与指数的形式  N$ B3 `4 F, B" n  O  J7 }
(4) ln: 将反三角函数转换成对数, F" W$ b. z8 w1 {
(5) sincos: 将三角函数转换成sin与cos的形式, 而把双曲函数转换成sinh与cosh的形式
# w& v; ?8 E# b(6) tan: 将三角函数转换成tan的形式! |/ N" f* m6 n. W/ x# N3 j
(7) trig: 将指数函数转换成三角函数与对数函数. g9 j  `+ q1 H7 @8 E
> convert(sinh(x),exp);   #将sinh(x)转换成exp类型) U- U7 E) }5 m& p: c+ Z
9 e# n* }0 n4 k" Q
> convert(cos(x)*sinh(y),exp);8 a$ P% _1 F+ \: ^, f

) b8 {' f7 F. R/ v+ n# V* l$ W* _; l> convert(cos(x)*sinh(y),exp,y);- d, Z& O' X) A7 T; Y* \/ b
! [- S2 P2 [1 ~3 d- M) b
> convert(exp(x)*exp(x^(-2)),trig);
. E6 Y" i4 L' F+ R: ]
) O: o" |9 U% V- N% n- C( M/ `> convert(arcsinh(x)*cos(x),expln);; A* w" Z) H3 ^: [. g
) O( w( ?* X7 d. `
> convert(cot(x)+sinh(x),expsincos);
4 @* q/ d4 y: x  Y % V' z2 S  }7 v( ?& O0 `
> convert(arctanh(x),ln);, j: N4 |' K& _: j

0 }4 ]1 A& p; f( a5 rconvert在有理式的转换中也起着重要的作用. 在有关多项式运算的过程中, 利用秦九韶算法可以减少多项式求值的计算量. 在Maple中, 可以用函数convert将多项式转换为这种形式, 而cost则可以获取求值所需的计算量. 注意: cost命令是一个库函数, 第一次调用时需要使用with(codegen)加载. 例举如下:   ) Q2 L' E  W# s
> with(codegen):
$ P# ?  B. C4 @  n> p:=4*x^4+3*x^3+2*x^2-x;
2 L, T3 V) ^# p/ l* d( H 5 W; I# Q6 |. Q; f* D
> cost(p);
. ?/ z+ r" K3 Z. f+ _! Q$ |) z: } . S4 S+ S, z' ~, s7 Z. i
> convert(p,'horner');  #将展开的表达式转换成嵌套形式
' w/ d* I/ A( u! y4 E' S$ C4 ~  P# N 2 d3 R- x9 R- _* Q* e
> cost(%);
  M5 y* |/ t# P  R' ` 6 h/ S2 {3 s5 Y7 a" t7 t
同样, 把分式化成连分式(continued fraction)形式也可以降低求值所需的计算量.
* [( `1 F5 J- Q- C> (1+x+x^2+x^3)/p;/ B: C% j! t: R' S7 m- k
# i% ^2 Y! \/ F
> cost(%);
# F& l; U6 T; j 2 p- x  t, h- i' w  l8 ^% ?0 Y
> convert(%%,'confrac',x);  i6 F9 a6 g0 Y, u

9 O4 U) I; j) |6 G$ r. a> cost(%);
8 x& O: o% p- y9 D, I3 P
% {8 ?/ `8 c; G在某些场合下(比如求微分、积分时), 把分式化成部分分式(partial fraction)也就是几个最简分式的和式的形式也可以简化运算, 但简化程度不及连分数形式. 4 G6 x* x0 x6 _# a0 k0 W$ E  H
> convert(%%, 'parfrac',x);5 v: V4 P7 I/ m: C
, K5 n$ V& M' G0 R$ \4 D
> cost(%);' X+ m  b3 z% Z) o3 w" b; |+ U
$ E0 x' n# H, V' L- K4 W# f# W9 y
而把分数转换成连分数的方法为:  j( y+ y' F8 n
> with(numtheory):  {2 Q& i8 Q" x$ g
> cfrac(339/284);
  `' e& U/ s/ c% n" Q 5 [/ s3 P# |* j  [( L. p' S
2.2.5 函数的映射—map指令! ~2 j& Y( o7 S- }) |) e+ w
在符号运算的世界里, 映射指令map可以说是相当重要的一个指令, 它可以把函数或指令映射到这些结构里的元素, 而不破坏整个结构的完整性. 命令格式为:0 |+ w. n! n. R' q$ X+ r  ?
map(f, expr);      #将函数f映射到expr的每个操作数1 ]* r2 T3 P0 `, u) k. n8 f
map(f, expr, a);    #将函数f映射到expr的每个操作数, 并取出a为f的第2个自变量
# ~6 F, n4 F# T2 Rmap(f, expr, a1, a2,…, an); #将函数f映射到expr的每个操作数, 并取a1~an为f的第2~n+1个自变量
0 ^9 F6 a& l" Z* W& V$ Omap2(f, a1, expr, a2, …, an);    #以a1为第1个自变量, expr的操作数为第2个自变量, a2为
5 j/ P1 K. k) X7 ^第3个自变量…, an为第n+1个自变量来映射函数f( u5 |' r' Z. J0 g* n. |7 J3 X
> map(f,x1+x2+x3+x4,a1,a2,a3,a4);0 ~" w  A. C* F

& p( ?& w7 @8 W4 [) _; O> f:=x->sqrt(x)+x^2;
* Z2 Y" a, N! C. r # x% T4 k4 n! n* j
> map(f,[a,b,c]);4 K6 E& C) @( \9 P; T/ {" l7 l% ^

! c: X, ]2 r+ v1 k  e! q: s+ \> map(h, [a,b,c],x,y); % w+ S% m4 u0 P- S

) ]' |7 v5 k) y$ Y> map(convert,[arcsinh(x/2),arccosh(x/2)],ln);
: |3 d3 h7 Q5 Q) i/ J2 y
& q4 Z3 J% h; S8 v4 I. u> map(x->convert(x,exp),[sin(x),cos(x)]);
/ i0 K9 t- Z* {# p ' M! x! Z" z% `0 E* W
上式的映射关系可通过下式理解:! G9 g  E  F: R+ Y6 S8 G& y2 k" |
> [convert(sin(x),exp),convert(cos(x),exp)];
! s* d/ h' I2 @+ z- Q6 c% ]* X
% i% ~" j; `' A+ @1 E  z/ b> restart: , m0 s# d: C  d5 i8 ^
map2(f,a1,x1+x2+x3+x4,a2,a3,a4);
* U/ {, g, ]( k: N+ @8 G
# g- u0 s1 x# \! k* _4 M> map2(max,k,[a,b,c,d]); ) z2 T1 p, S: g7 R

  i0 F# ^: [' U" P再看下面示例:   
0 z1 Z& _* V* Y4 U> L:=[seq(i,i=1..10)];3 G8 F' {: G# q5 T! \; x
. i) n2 o" \& c4 ~5 c/ B
> nops(L);: C' d0 `. c9 p9 y' `- x- `7 X

+ d9 E& E( `; ^9 v8 o> sqr:=(x)->x^2;
1 I+ l; z0 o8 g; S& m! O ( V' G' U& Q. e( W
> map(sqr,L);5 y, D* v9 v. ~4 W: S& f

; _! h8 b9 z4 r$ ?3 y# ~) l> map((x)->x+1,L);
( I/ a! r8 [6 {$ D9 G
% j) p6 `: d$ V6 x; }> map(f,L);0 O$ S; ~$ e1 E

! z5 z% h6 T7 J/ u" J$ H% ^( |2 g8 H> map(f,{a,b,c});; W3 O' Y! V; @% G( o
6 u* X6 H8 G: z' H2 T$ G
> map(sqr,x+y*z);) r  s/ U3 T  ^9 a7 _( R

8 {! ?- {5 L/ I2 c4 l8 G0 \4 Y> M:=linalg[matrix](3,3,(i,j)->i+j);
6 D) J( _% e7 n2 P8 I
/ V/ D  l3 v1 F7 ]1 f> map((x)->1/x,M);
1 r8 B! z0 }. `; Y5 ~
4 |5 e" @; Q  X# `& [3 求 值$ i7 O- }. m. F+ D* s9 z
3.1 赋值
: a4 r9 o) y) r4 l在Maple中, 不需要申明变量的类型, 甚至在使用变量前不需要将它赋值, 这是Maple与其它高级程序设计语言不同的一点, 也正是Maple符号演算的魅力所在, 这个特性是由Maple与众不同的赋值方法决定的. 为了理解其赋值机制, 先看下面的例子.
8 I4 g; ]. `1 }  {$ A! d" j> p:=9*x^3-37*x^2+47*x-19;1 K! u: B  \. G* B
6 G- B6 `( L! G+ j2 i* v
> roots(p);
! U9 L. K% @9 g2 J! Y- M  @$ y( g
* `7 t' \1 ?/ Y' U2 a3 m> subs(x=19/9,p);, b$ K) A, u: n: [, e

2 K& y7 K" u7 T- v在这个例子中, 第一条语句是一个赋值语句, 它的作用是把变量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;”这样的简单语句即可验证.
  C  F1 B6 U. e& m1 e; {3.2 变量代换
3 k5 U' b0 D$ n5 v$ r1 _. p3 u在表达式化简中, 变量代换是一个得力工具. 我们可以利用函数subs根据自己的意愿进行变量代换, 最简单的调用这个函数的形式是这样的:   
: s/ u5 d' S9 o. l% z2 Jsubs ( var = repacedment, expression);
" c& r' n3 @9 J调用的结果是将表达式expression中所有变量var出现的地方替换成 replacement.
/ f. ^. Z( q2 n# S> f:=x^2+exp(x^3)-8;9 s/ V9 {& w$ b  q- X

8 {, @% O. ~- G> subs(x=1,f);8 c# H# ^, ~9 ?9 l& o

' t- A0 i) H& b: d5 U: a( D> subs(x=0,cos(x)*(sin(x)+x^2+5));: l4 N, c2 E$ u- {7 O: T
& W8 E0 n! M4 U4 X, d/ k" ?
    由此可见, 变量替换只得到替换后的结果, 而不改变表达式的内容, 而且Maple只对替换的结果进行化简而不求值计算, 如果需要计算, 必须调用求值函数evalf. 如:   
* @6 V" O, _* s: y- ^" S0 e> evalf(%);
/ u" u! b8 O2 p: Z 4 B0 ]& }5 `% c4 Q& `
变量替换函数subs也可以进行多重的变量替换, 以两重代换为例:     W7 Y- g* k  A
subs (var1 = repacedment1, var2 = repacedment2, expression)
/ m" c8 r, o# K  t7 u0 l调用的结果和按从左到右的顺序连续两次调用是一样的, 也就是先将expression中的var1替换成replacement1, 再将其结果中的var2替换成replacement2, 把这种替换称作顺序替换;    与此相对, 还可以进行同步替换, 即同时将expression中的var1替换成replacement1, 而var2替换成replacement2. 同步替换的调用形式为:   + q& Q. t! A3 _: }
subs ( {var1 = repacedment1, var2 = repacedment2 }, expression). v( B; {9 ]! P" o, Z2 N* e
下面通过例子说明这几种形式的替换.
- z  D, c1 s- G4 a. g* C> subs(x=y,y=z,x^2*y);              (顺序替换)! `5 s! o- ]0 g7 m6 q
3 Y  j/ }  w- s" [- J9 R2 h" W
> subs({x=y,y=z},x^2*y);            (同步替换)1 ?' w( Z) c2 A( O& g8 O
2 T- K7 O) D) n2 O
> subs((a=b,b=c,c=a),a+2*b+3*c);   (顺序替换)
, P+ F6 z' s/ |$ t' I: R1 \ ( @6 e7 m4 ~+ e+ Z
> subs({a=b,b=c,c=a},a+2*b+3*c);    (轮  换)5 @; [& o& \* ^: C& J
6 ]5 A; |) u6 f3 U5 v% Q( u, P
> subs({p=q,q=p},f(p,q));             (互  换)
1 O% t6 k, E; u7 C7 F: ? 4 v$ \2 i" a9 S  E; Z
3.3 假设机制3 m0 I9 j8 V0 k- m" U4 C
Maple是一种计算机代数语言, 显然, 很多人会尝试用Maple(或其他计算机代数语言)解决分析问题. 但由于分析问题与处理问题的考虑方法不同, 使得问题的解决存在某些困难. 例如考虑方程 的解. 如果k是实数, 结果显然是x=1, 但如果k是 的复根, 为了保证解x=1的正确性, 必需添加附带条件: 也就是当 时x=1. 这是一个对结果进行正确分析的例子. 然而从代数的角度考虑这个问题时就会把k当作不定元, 此时k没有值, 从方程两端去除k的多项式是合法的, 只要这个多项式不是零多项式即可(这一点是可以保证的, 因为其所有系数不全为0). 在此情况下x=1就不需要任何附加条件. 计算机代数系统经常采用这种分析的观点.
6 m' [: Q& L3 C$ n( X) q在Maple中, 采用分析观点解决这类带有一定附加条件的实用工具是函数assume, 其命令格式为: assume(x, prop);
8 J* |% o" u4 d! |- u函数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 ^- L$ C- T! Y: |- P
> Int(exp(-s*t),t=0..infinity);
: j- y5 \, m2 ?4 A/ x  l
1 |7 c; R  T, {3 h: b9 p> value(%);5 M; x. j: Z# X& K  B6 I, ]
Definite integration: Can't determine if the integral is convergent.8 ~5 ~3 w* k' I. c" u1 m: t
Need to know the sign of --> s
' e/ V4 d. `; L) ^5 x+ qWill now try indefinite integration and then take limits.+ @/ \1 b" O2 G( A$ ~, C* {
; M! @+ g( G) C3 g  o0 z$ f
> assume(s>0);1 f2 ^) @3 T1 X# O7 a/ f, y/ _
> Int(exp(-s*t),t=0..infinity);) p7 ?( F0 ]- p, a3 m! P
- m  g: d) P: c. H' z
> value(%);
: C# {1 L8 |% I4 B2 _0 z
( R8 x& N  _* {# W/ ]3.4 求值规则
& v! l5 T. ^" L4 ^6 o4 K" |1 l2 ]在多数情况下, Maple的求值规则设计为做用户期望的事情, 但要做到这一点很困难,因为不同的人在相同的情形下会有不同的期望. 在大多数情况下, 全局变量被完全求值, 局部变量被一层求值. 而由符号' '界定一个暂时不求值的表达式, 单步求值仅去掉引号, 不作计算, 这也是允许取消指定名字或清除变量的原因. 如下例:   
' P( r' N& Y* K9 ]7 h> x:=y;$ G) H/ ^, T/ n0 j, H# t0 C
9 q: A) N; d# j
> y:=z;0 T$ T2 ?  Z! p$ i9 g0 {

* B/ s: w; h" M7 }> z:=3;
! o8 @/ t9 ~2 x   t1 r* `! M5 ~6 T# P* C& M
> x;  b" W% F  \5 O, x, H- d: G

7 d7 z, t+ c' d0 A9 D! u. d+ N; s> y;7 [, R% ~) q' D! x6 p1 O
$ t$ n" p- f0 j/ D+ B
> x:='x';
( e$ U" }( _* S$ f 8 h* Z9 g4 d. {% O9 _
> x;
: z; e/ G+ A) k! x+ j5 F
' v6 T* h% b7 i! ~! j6 u( W> y;
+ b2 T4 ~" ]! G2 b/ Y' E( Z . Q/ J4 |9 L* w- y3 s& o
对于不同的问题, Maple设计了不同的求值命令. 现分述如下:   ' D- m1 d: ^. Q! ^1 Y
1) 对表达式求值
! z  N8 |% |( O  s1 v9 X. ~% N命令格式: eval(e, x=a);  #求表达式e在x=a处的值
$ J  D* T) U$ X# K5 C3 h             eval(e, eqns); #对方程或方程组eqns求值
4 x# g/ W6 F& Z- [! C* @) o0 G/ M             eval(e);      #表达式e求值到上面两层" l* j% x; A0 y
             eval(x,n);    #给出求值名称的第n层求值9 m/ t" O# l9 D) t. @
> p:=x^5+x^4+x^3+x^2+x+73;
, H5 q! n4 A' T
0 O% n- M& W, l+ x! `> eval(p,x=7);
9 P7 W$ X: J' b3 }% e : c! g# C. h- n% z, ?$ o* D  v
> P:=exp(y)+x*y+exp(x);
/ P% L+ Y4 W( i$ h; [$ `9 i
( a' H0 o8 X" i6 x0 A> eval(P,[x=2,y=3]);
8 G; v6 a% H8 O% q1 `% E7 G
4 S3 |8 K& \( R2 U7 W* L# G    当表达式在异常点处求值时, eval会给一个错误消息. 如下:   0 T3 A3 ?& i: O/ I& b
> eval(sin(x)/x,x=0);
' W* q" i. k" z# ?$ P8 Z. G7 TError, numeric exception: division by zero( {6 ]  U- b( T6 f+ D* g
    下面再看使用eval进行全层求值或者对名称几层求值的示例:   1 {% `0 t, o! w4 J! a! z4 B1 ~, Q5 I
> a:=b: b:=c: c:=x+1:$ o4 v% Q6 s" a9 s( E
> a;              #默认的全层递归求值* D5 G' _8 ^: K
0 S# p3 y" J9 [1 r6 _8 M0 X$ O
> eval(a);        #强制全层递归求值
% k9 ?! p- x, r( ?( f: S( O  b
- V5 e7 N$ N0 Z. k4 n# O> eval(a,1);       #对a一层求值* t- j" f/ Q: H1 c9 K  t; O

0 C/ q0 I1 g) M  s> eval(a,2);       #对a二层求值* t$ D( ~: f" p" L
$ V7 B: P- q* t9 ]  G
> eval(a,3);       #对a三层求值/ K' X/ k) i8 H- m& A# r

. a. ]$ |0 e% M: s5 ~6 o  i/ A> eval(a,4);       #对a四层求值
4 F6 e: G( X2 s% i5 v( s0 S 8 y/ t: S; e. J+ D" I& T( t- X1 \
    2) 在代数数(或者函数)域求值
5 j/ w  h. K# H5 w2 u命令格式: evala(expr);       # 对表达式或者未求值函数求值5 Z2 U; C% F' D
             evala(expr,opts);   #求值时可加选项(opts)
6 l0 s. l% _: g8 d所谓代数数(Algebraic number)就是整系数单变量多项式的根, 其范围比有理数大, 真包含于实数域, 也就是说任意实数都是整系数多项式的根(如 就不是任何整系数多项式的根). 另一方面, 代数数也不是都可以表示成为根式的, 如多项式 的根就不能表示成为根式的形式.
* D4 E$ K3 C: [, O3 m& ~代数数的计算, 算法复杂, 而且相当费时. 在Maple中, 代数数用函数RootOf()来表示. 如 作为一个代数数, 可以表示为:   ) @+ e7 G" M6 @
> alpha:=RootOf(x^2-3,x);( J9 P+ U$ @8 @( S* r
1 P& j$ V2 }. X& V- i6 ?- G
> simplify(alpha^2);
$ _  `+ E4 j$ g 2 G+ V% ~8 m8 _+ _  Z( b
在Maple内部, 代数数 不再表示为根式, 而在化简时, 仅仅利用到 这样的事实. 这里, Maple用到一个内部变量_Z. 再看下面一个例子,其中alias是缩写的定义函数,而参数lenstra指lenstra椭圆曲线方法:/ |1 f, i4 Y: m' ^' O' k  W' s- O0 m
> alias(alpha=RootOf(x^2-2)):$ g" i+ m& \9 Q& |$ r) ?
> evala(factor(x^2-2,alpha),lenstra);+ _9 N. b  ~2 H3 T! P
3 u4 ~+ l' R3 X0 {/ x
> evala(quo(x^2-x+3,x-alpha,x,'r'));
8 I& `4 z! [0 v/ f; b5 X$ k
* n) f0 K2 T( C- o6 a> r;# q' Z5 o& G8 ^, c+ L1 W/ D% X! E

* |# x* P8 A/ n! w> simplify(%);
: v2 F) E) b" j! Y7 u3 z) o 4 g0 Q( \2 q5 b/ f: ]' y5 s
3) 在复数域上符号求值4 X" V# m) r/ u; b; c
操纵复数型表达式并将其分离给出expr的实部和虚部的函数为evalc, 命令格式为:5 A& T7 y5 W, V  ?3 O
evalc(expr);   6 H. S+ o' ?2 W
evalc假定所有变量表示数值, 且实数变量的函数是实数类型. 其输出规范形式为: expr1+I*expr2.
4 ?2 K( M! e3 K: j8 t- k> evalc(sin(6+8*I));/ Q& P; |$ m4 m* w

7 L$ l3 c/ ^; |6 W& G. V' j> evalc(f(exp(alpha+x*I)));. E+ G0 a! z. g- O9 e
9 H" K0 j/ C8 s9 C! y
> evalc(abs(x+y*I)=cos(u(x)+I*v(y)));2 n" t# d! P7 b; |2 p% X9 g' a% l
/ e( w# Z) M+ z% ^5 q9 [
4) 使用浮点算法求值
6 ?6 q3 Y7 p: d2 h% R# r5 K; H浮点算法是数值计算的一种基本方法,在任何情况下均可以对表达式expr使用evalf命令计算精度为n的浮点数(n=Digits), 如果n缺省, 则取系统默认值, 命令格式为: evalf(expr, n);       l3 T" r, w  y# r6 a9 [" O% d
> evalf(Pi,50);   
; F) h4 o# s9 e8 d# {: r1 b1 ?+ C ' T2 G" M6 ?8 e0 r! x0 T
> evalf(sin(3+4*I));   : J6 r6 J# R8 t2 W7 n) d

* l. f& m9 ~# ^> evalf(int(sin(x)/x,x=0..1),20);
; S1 \; F( |0 K( j8 k/ V1 [; N - C2 P* t: u2 y7 H& r
5) 对惰性函数求值
8 ^+ \" b5 u- @9 O把只用表达式表示而暂不求值的函数称为惰性函数, 除了第一个字母大写外, Maple中的惰性函数和活性函数的名字是相同的. 惰性函数调用的典型用法是预防对问题的符号求值, 这样可以节省对输入进行符号处理的时间, 而value函数强制对其求值. 对任意代数表达式f求值的命令格式为: value(f);   
) j6 g3 j" F. ^3 d  X> F:=Int(exp(x),x);$ q" H: c: V% j, U8 z2 v
! ]  s5 h" X- Q! w. g0 D0 n
> value(%);
% a+ ?# W" @. U  d( U
6 {' ^- f7 }" w5 J; Q' [> f:=Limit(sin(x)/x,x=0);
. R9 u( B! c. }3 p' {
) F5 L2 n& d* W: v1 i3 h$ a> value(%);. k* ?5 c) i: z" z9 ]

& P! L  X. `& A另外, 将惰性函数的大写字母改为小写字母亦即可求值. 如下例:   0 o; y8 }1 M% M0 v% V& ~/ \9 f, I$ A
> Limit(sin(x)/x,x=0)=limit(sin(x)/x,x=0);
! v+ M- L( _: j' ~3 s
5 B! N  Z& D6 B" K7 L: H* p) O4 数据结构
( p4 D+ Q, U5 v) Z8 CMaple中有许多内建的与FORTRAN、C或Pascal不同的数据结构. 主要的数据结构有序列(sequence)、列表(list)、集合(set)、代数数( algebraic number)、未求值或惰性函数调用、表(table)、级数(series)、串(string)、索引名(index)、关系(relation)、过程体(process)以及整数(integer)、分数(fraction)、浮点数(float)、复数(complex number)等数据结构, 而矩阵(matrix)在Maple中表示为阵列, 是一种特殊的表. 8 |1 i8 u4 h0 K9 v9 `9 _
4.1 数据类型查询& \2 c% R8 l# Q* O1 u. u
在Maple中, 用whattype指令来查询某个变量的数据类型或特定类型, 命令格式为: 3 F% w2 s3 _* E
whattype(expr)        # 查询expr的数据类型
+ l. h2 R; f8 o7 ^, u' f" \type(expr, t)           # 查询expr是否为t类型, 若是则返回true, 否则返回false8 k! w4 I, A* J# v( v* _) K
> whattype(12);
# h/ ^5 X" H: q% M
% B+ U6 ~& B9 J( S% @$ X> whattype(Pi);# p2 s( [( j0 L6 i' t: ?, ^# d

7 x5 p0 _9 c: R* d' [8 e> type(1.1,fraction);
3 [2 Y) U: Q) H, R- c- J- k9 F
8 r+ f' z1 l* T- g3 n) i9 S> whattype(1.1);/ s6 w/ o# s, u( Y) D' i

" n8 L4 }+ _) t# c- s+ S4.2 序列, 列表和集合
3 \! z& @1 r- r9 N% M0 b: }" j4.2.1 序列# b# W7 y3 Z* N) T2 S; D
所谓序列(Sequence), 就是一组用逗号隔开的表达式列. 如:   2 f( y% Y' ?1 w( q
> s:=1,4,9,16,25;
  ^% ^6 t4 s& R8 x0 y* L 6 N+ o9 ?! a2 N7 t
> t:=sin,com,tan,cot;; ~! h. |! O9 K, y
# K7 Q9 V: W" A. i0 r% \
一个序列也可以由若干个序列复合而成, 如:   
* D( K! n0 f  u. c> s:=1,(4,9,16),25;5 `6 Y# S. p. ?" Q! i  N
( Q2 {4 W+ `* |& [
> s,s;
6 x3 B. u$ H6 j: T3 e2 b
3 Y# W% {- p" _! j. u7 \而符号NULL表示一个空序列. 序列有很多用途, 如构成列表、集合等. 事实上, 有些函数命令也是由序列构成. 例如:   
3 u, P  y# [; ~( i/ |: `, L> max(s);
: d- A' M/ @# o- {( q ; E" V, p3 @9 q
> min(s,0,s);( c. [" ~% S, v" j9 z
$ K* A9 }% F- R7 x' E& _- _
值得注意的是, op和nops函数命令不适用于序列, 如op(s)或nops(s)都是错误的, 如果要使用op(s)或nops(s)前应先把序列s置于列表中. 2 E3 ~5 |% S1 t# @/ d! V4 ~
> s:=1, 2, abc, x^2+1, `hi world`, Pi, x -> x^2, 1/2, 1;9 n( L6 |- y4 k+ S6 S- L
# Z1 N' Y# J* A9 j% u- w7 r4 ?
> op(s);
8 S8 P; i0 m& k, P; dError, wrong number (or type) of parameters in function op
+ G: `$ B! P- d4 O> nops(s);% D) q4 J' g) r" I  @$ j5 N0 d
Error, wrong number (or type) of parameters in function nops+ e& }! u' Z9 I2 i) I0 g
> op([s]);
: `4 u6 K, Y" O, t1 N * U5 P# d! `, |4 K/ l
> nops([stuff]);7 Y! h% S3 F8 i# L7 u

3 C" f. z( F' i5 [+ U' P$ s) x4 V- y函数seq是最有用的生成序列的命令, 通常用于写出具有一定规律的序列的通项, 命令格式为:   , a! m3 n3 O. f4 K6 D8 B
seq(f(i), i=m..n);  # 生成序列f(m), f(m+1), …, f(n) (m,n为任意有理数)8 b$ Y. v& q# ?+ ]; l5 k0 ]
seq(f(i), i=expr);  # 生成一个f映射expr操作数的序列3 H( I0 S+ m6 _' @* o/ v: ~
seq(f(op(i,expr)), i=1..nops(expr));  # 生成nops(expr)个元素组成的序列/ E, {! J) P; Y. B9 D/ G( @" U6 b
> seq(i^2,i=1..10);7 a, P3 X0 ~) Q7 h! h: N0 ]$ W. H

3 _7 `5 L3 w) ~/ O* h> seq(ithprime(i),i=1..20);0 i5 `7 A/ m; x

# X7 p" x& v4 L' V5 ?! i3 W( s> seq(i^3,i=x+y+z);
0 l# F  J& N. Z9 [" V
7 l6 X/ b5 m3 L; ]1 f/ S% x> seq(D(f),f=[sin,cos,tan,cot]);
# S. G. ?7 @- X  p 0 f1 Z. F" i4 w4 s* F
> seq(f(op(i,x1+x2+x3+x4)),i=1..nops(x1+x2+x3+x4));7 g2 \1 h6 Y8 q# g% J% D# [

2 D) }8 {0 @$ _+ ~获得一个序列中的特定元素选用操作符[  ], 如:   
) k# ]# D1 j" y: t> seq(ithprime(i),i=1..20);
; r+ B; L$ h% i: J, ?9 y
! l. g/ L$ X5 Z4 u3 S- G> %[6],%[17];  i9 G/ a6 U8 W0 `% G% P. i
- ~1 |- Y- n+ _5 i
4.2.2 列表8 C* x# m2 x# [1 S' G( S
列表(list), 就是把对象(元素)放在一起的一种数据结构, 一般地, 用方括号[  ]表示列表. 如下例:   
! K) X8 {3 X: g9 U, X9 f/ v( `; V0 f> l:=[x,1,1-z,x];
, x7 V  ]* O) v
, V  S5 Q! d9 U, ~- @$ w> whattype(%);5 E- i/ ^7 K2 l) W; C

0 s! g- L  z7 m. ~空列表定义为[ ].
0 d& O! B9 \0 z- ]! I( c但下述两个列表是不一样的, 因为对于列表而言, 次序是重要的:   - T5 ]# @& B, ^. ?' }0 u  X$ G
> L:=[1,2,3,4];4 F8 T4 R& H  |3 R

7 ^6 V" h( u$ e  e* _. U> M:=[2,3,4,1];/ N$ {- B% ^5 a9 B/ z

; {* H1 |4 O$ |% i4.2.3 集合6 f5 W7 P4 H& P- a: F1 X
集合(set)也是把对象(元素)放在一起的数据结构, 与列表不同的是集合中不可以有相同的元素(如果有, Maple也会自动将其当作同一个元素), 另外, 集合中的元素不管次序. 一般地, 用花括号表示集合.
0 _. [6 J" H2 Q) |- _> s:={x,1,1-z,x};) [( N7 [3 i2 h4 j3 D+ G- t
! V( L* R- p. T
> whattype(%);
9 z/ n" F# y* e3 D. |, G$ T % ?1 U4 W/ `$ T5 A* S; a9 p. N
空集定义为{ }.
' m1 t' I4 ~" z! _' h3 ?( I函数nop返回列表或集合的元素数, 而op则可返回其第I个元素.
0 E+ F. C- j- D7 V  `/ D> op(1,s);7 E4 a" p0 N- [, N
5 f) U: l, P. \6 p, @
> s[1];9 Q, n, ~5 @* q1 z$ K
% f. i0 c* U# d. T
> op(1..3,s);
5 g  v3 ]- ^' z) e & t! P) N! ?% G1 V
> s[1..3];  f) B$ D. p9 Y, j% x/ c

1 P9 `) v8 Y% J. R$ @函数member可以判定元素是否属于一个列表或集合, 如果属于, 返回true, 否则返回false. % ?7 j2 K* }: \5 b- w3 X
> member(1+x,s);7 N& C( e0 c. |

+ S: ^1 h7 t" s* I7 G5 m0 Y可以通过下述方法在列表中增减元素:   
' x7 i% a8 i! j1 O) v; z> t:=[op(s),x];
8 n( f4 Y1 r. \4 m- W, i' P- S4 G
( {. d* `3 N1 h; T' c6 c) r9 o> u:=[s[1..5],s[7..nops(s)]];& V# O+ g4 W; m

. n5 I% L* e+ d; k" D3 P, uMaple中集合的基本运算有交(intersect)、并(union)、差(minus):   6 m6 b7 W% V% N/ R( j9 p# n
> A:={seq(i^3,i=1..10)};B:={seq(i^2,i=1..10)};
4 e; E) t) K; w  X  y) ~, y
1 Y, O, S! T* o: [0 X9 Q
& r- \) H$ ~8 ?- o3 I> A intersect B; . Q+ \$ D0 Q% T. ~# E3 y; i

; o! ?* a9 Y6 o5 p> A union B; - V, I+ J( j. s4 z1 y0 y
- M, \/ l4 K+ x; d, j6 o
> A minus B;
) a4 B- y- O. C  l
+ p2 x8 z: _+ Q4 T% F! L4.3 数组和表
* Q; r( Q2 ]& K& {: f+ ~在Maple中, 数组(array)由命令array产生, 其下标变量(index)可以自由指定. 下标由1开始的一维数组称为向量(vector), 二维以上的数组称为矩阵(matrix). 数组的元素按顺序排列, 任意存取一数组的元素要比列表或序列快的多. 区分一个数据结构是数组还是列表要用“type”命令.
! i5 ~# ?; v, s1 L    表(table)在建立时使用圆括号, 变量能对一个表赋值, 但一个在存取在算子中的未赋值变量会被自动地假定是表, 表的索引可以成为任意Maple表达式. 表中元素的次序不是固定的. 8 r& o# b+ [. q# u3 Y
> A:=array(1..4);, z' j) K! C2 @
  |$ x* ]; e# d0 B+ a
> for i from 1 to 4 do A[i]:=i: od:
) s# g! S2 V  J8 p/ o) n, h> eval(A);/ C7 P/ @& ^( E/ m

: Z3 x, u2 a5 k' ]  L" E. A> type(A,array);
% H% n7 m' c- z7 Y. @! g; |: G
/ t. \6 F% v  k- G> type(A,list);
# J- k- Y3 N9 U  ~0 c. S" j+ w6 _
8 f  H4 ?- r$ v8 O. @! m( i> T:=table();. T" |4 v+ K3 V+ b. y" {" j/ ~8 `
8 G2 ]9 E0 D9 p/ _" c( F
> T[1]:= 1;  h% ], ~& K2 O- x. E9 K1 F0 m
1 H% p; [; i  B, ~4 a- f- m4 p  R! X
> T[5]:= 5;& H7 O- E4 Q/ d% L5 v
! ?0 A' j, ~/ m/ e# b; F7 H+ P  l
> T[3]:= 3;# Y' M, }% }4 x  F+ K0 [
! l5 A8 d% k5 Q; `  n
> T[sam]:=sally;
, L* T' f$ h# ~% ?1 k: E ' l( m2 t; `) h! X5 r% Q( O3 k
> T[Pi]:=exp(1);
" @( y1 z% _8 } 8 @' Z* g/ H/ e* b
> x:='x';
- u$ l, Q4 L/ f3 q- w6 n1 @8 g + K1 A& Q  M/ \8 i" J4 a$ [
> T[(1+x+x^3)*sin(x)] := 0;
& G) Z; e& x4 J3 c( k3 @$ h 9 t8 L# J6 u' [
> eval(T);
( ]( e- @4 l: \( Q1 v% ]+ E- _
; ~+ ^$ j: ]$ {; g0 E5 O> T[3]:='T[3]';
' V0 w/ c4 \6 @4 A
3 u  H1 U& }% [/ A> eval(T);
, L1 W/ H, v; ~. c& _7 I; h 5 G. M. @8 D0 l* l- o* d  D1 \
4.4 其他数据结构
/ g+ Q/ I" g0 C* f! V! {/ }串在Maple中是很重要的, 他们主要用于取名字和显示信息. 一个Maple的串可以作为变量名, 它们中的大多数是简单的、不需要加引号的串, 但是如果变量名中包含/. 例如“diff/T”则必须把变量名用引号括起来. ! Q7 g7 K: B% d7 N2 M- ]& c
索引名是像Database[1,2,drawer]或A[3]这样的对象, 在使用索引前不需要直接建立表, 如果不得不做, Maple会自动建立表. 索引名通常被用于矩阵和向量. 为了保证Maple建立表的正确次序, 建议在赋值前直接建立.
2 P/ d* h9 c3 F5 Y7 A3 L: [5 I+ r> x:=T[3];, H6 i" k+ z- A3 @0 B
, O+ @2 h! x- o( v  |$ a& Q
> eval(T);9 F/ G! z+ |6 o: m2 L/ \

/ `2 x- u0 t3 G+ A+ n> T[5]:=y;
! @2 C9 @& V" h, ]
! D! v: H# T# f8 Z> eval(T);) U, ^+ `; C" ~8 z" z  l
- E) S+ l; ~- Z- w* O
由此可见, Maple并不直接建立T的表, 直到给T[5]赋了值.     . G4 o# X- X; C, j
数值数据结构(整数、分数、有理数、浮点数、硬件浮点数和复数等)在它们的使用中是大量透明的. 浮点数是有传染性的, 这意味着如果数值结构中有一个是浮点数, 则整个结构自动转换为浮点数. 9 |' ~( N% A& g" H7 p
4.5 数据类型转换和合并
% |4 v8 t' x! p# ^' Sconvert是一个功能强大的类型转换函数, 它可以实现列表和数组的类型转换:   
0 F5 F  E* ?# f% i9 \> L:=[1,2,3,4];4 T* B6 g% v2 d+ A* U' m, z

- r. c7 v1 E* ]> type(L,list);' L9 Q6 Z9 p/ g

# `5 _% I% l* v/ B> A:=convert(L,array);: V& D5 w( J8 k: y7 E, W$ ]) F
* e. Q! w% k! t' g" @
> type(A,list);( p1 g3 ^% Z( y3 G! o
! P3 X  @! E5 Q
> type(A,array);6 R4 J4 q: k7 D
! V3 m0 E+ A) S9 Z# ~/ H
另一个有用的函数zip则可把两个列表或向量合并:   
3 B1 b, i+ O' i5 l) W, X6 q>L:=[seq(i,i=1..10)];
; B( R0 H& U. D/ G8 ?6 a
  T! Q/ U9 `- ?# y> Sqr:=(x)->x^2;
, z% Z0 j8 u' { ' `5 V1 a& c0 k* `$ t$ E$ ]
> M:=map(sqr,L);4 f5 z. w4 j0 ~
2 F) H5 e8 }) I2 l
> LM:=zip((x,y)->[x,y],L,M);
, O) F6 p6 @1 r9 y+ B' h0 C
' T6 z- I* G# [> map(op,LM);# f7 Q' Z& W0 `; I8 _
& K- ]# @! l- c& Y
5 Maple高级输入与输出操作
1 [+ V) D! Z6 W1 dMaple提供了良好的接口来编辑与计算数学式. 许多时候, 我们可能需要把Maple的运算结果输出到一个文件中, 或者在一个文本编辑器里先编好一个较大的Maple程序, 再将它加载到Maple的环境里.
' Q9 [* b* {1 N2 F5.1 写入文件
$ ^7 d% H6 |: |9 G9 G" ~3 n5 O5.1.1 将数值数据写入到一个文件/ l) k& J* K/ R; }! Y
如果Maple的计算结果是一长串的数值串行或数组, 而想把它写到一个文件时, 用writedata命令. 8 A! x: ^! [1 c4 O; }1 L
若Maple的计算结果data为集合、矩阵、列表、向量等形式时, 将其写入名为filename的文件时命令格式为: writedata("filename", data);
6 R# Y/ Y. o2 v+ A# f: t> with(linalg):
# x* S$ ^6 \! P7 m+ j$ A> M:=matrix(3,3,[1,2,3,4,5,6,7,8,9]);% |6 l; N4 B2 E, y+ _: u

; [6 R# Y" P. o" s> writedata("e:\\filename.txt",M);
, V% g8 F. \/ P  Z而将结果附加在一个已存在的文件后时,使用命令: writedata[APPEND]("filename", data);
% h  o4 C+ G2 f# r/ g/ c> W:=matrix(2,2,[1,2,3,4]);* M" s( v. y  A9 j* W4 h
$ O- {6 p6 w7 ~; z3 c" E2 m4 l3 E
> writedata[APPEND]("e:\\filename.txt",W);" O; C& M5 b4 Y
需要注意的是, 这里的APPEND是必需的, 否则W结果将会覆盖M结果.
1 Y3 b3 v5 i# D. W5 r. ?另外, 若想将结果显示在屏幕上时, 用命令: writedata('terminal', data);
' [3 [" e8 v5 |6 `2 W> writedata[APPEND]("e:\\filename.txt",W);
/ i* i3 t* n9 f9 i0 @: ?1 `> writedata('terminal',M);4 K. g- Q6 a) p/ ?, a
1                   2                   3           : y2 i, ^' o" b7 R  k- u$ |3 h
4                   5                   6           
6 r) Q; i0 x4 I  n* B1 p$ y5 [, u1 O7                   8                   9   
8 x5 b3 o0 ^8 @, k6 [5.1.2 将Maple语句写入一个文件
. G0 ^7 m4 Z$ c如果所要写入文件的是表达式、函数的定义或者是一个完整的程序, 则使用命令save, 写入一个或多个语句的命令格式分别如下:+ t: ^, L% u  N
save name, "filename";( h* |- l' a+ E3 R. \9 N
save name1, name2, …, "filename";
! Y* f8 y  }7 j/ g( H% ^若filename的扩展名为.m, 则Maple会以内定的格式储存, 若扩展名为.txt, 则以纯文本文件储存. 以内定的格式储存的文件作纯文本编辑器无法读取, 但在大多数情况下, 它会比纯文本文件的加载速度更快, 且文件容量小.
! h+ u1 j) G* U. b+ _8 v8 m+ N> myfunc:=(k,n)->sum(x^k/k!,x=1..n);0 K& S1 ?) o5 L; _6 d

& H# e# l& B% y# {( i9 A/ C/ R5 B* i> myresult:=myfunc(6,8);. q) o$ E6 ~) f; d- `
9 o, i6 t8 k% P3 X3 P
> save myfunc,myresult,"e:\\test.m";; h: K/ B/ W+ n/ J/ O8 W
调用已存m文件用命令read. 试看下述实验:
7 r: U6 i9 V+ n6 h: ~$ j> restart:
- M3 F9 |4 g$ |) e/ ^0 Q> myfunc(6,8);
* _2 S( S8 L/ }0 ?
% }2 J) a& o3 p5 K: M1 S> read "e:\\test.m";# v0 d0 X2 U$ q
> myfunc(6,8);/ _* x/ T" C3 I$ [) }- `& j
/ W% q' `& Y5 j5 B
> myresult;& s9 s* F1 G/ q- S# Y1 R

9 B: H6 z, Y: q/ z7 C' @    而存为txt文件时则将整个语句存为一个文件:
' J4 A1 [9 d' R* ]> save myfunc,myresult,"e:\\test.txt";
: f1 q) Q- w, W6 o- m$ P> restart: read"e:\\test.txt";; F3 {% d- `& {5 _

% h5 c4 d$ l7 _2 c   f9 v1 N& D6 U$ Z. g0 M3 V; G* [
5.2 读取文件
5 K8 A% M, p, l* W& M5 i% T在Maple里最常用的两个读取文件的命令, 一个是读取数值数据, 另一个是是读取Maple的指令.5 h- d( r) O& x" Y; `" F; o
5.2.1 读取数值数据1 d" C+ u* w* w- V  Y
如果想把大量的数据导入Maple里进行进一步的运算或者要运用大量的实验数据在Maple环境绘图时, 可以用readdata( )命令完成.
. b: |1 E4 M; c从filename文件里读取n行数据时使用命令: readdata("filename",n);
4 o1 h4 u1 v" i* X以指定的格式读取数据时使用命令: readdata("filename",[tyep1,type2,…]);  U" h( d9 M- |" \- P
> readdata("e:\\filename.txt",3);3 s2 P1 c! W5 U

3 V6 g* d: J# \    读取filename的前三列, 第一列为整数形式, 第二、三列为浮点数形式:
0 I0 W: ^& L& b$ S* `* d> readdata("e:\\filename.txt",[integer,float,float]);
) `& C  F, s6 _
8 d# d$ k. n& b3 \下面再看一个运用大量的实验数据在Maple环境绘图的实验:8 U8 C7 ?: h8 K" ?- J
> mypts:=[seq([x/1000,cos(x^2/100000)],x=1..1000)]:" V# H+ U- n9 \& l4 ?7 {! `+ J
> writedata("e:\\data.txt",evalf(mypts));
. c1 [% }5 w; a> dots:=readdata("e:\\data.txt",100):6 `* r* q& k9 \4 X! f! V1 L
> nops(dots);
/ E" G) I  v( s0 J5 @' { ) U' J1 ^$ ^8 y9 N* G
> dots[1..4];' i% B% \7 `! D) I
; U% k: L+ h+ E: x& {4 Y
> plot(dots,style=line);  S+ m& R/ u1 N
' y: r9 L8 F2 T% O0 z7 R# c
5.2.2 读取Maple的指令2 I: f4 M$ O: ~. g
在编写程序时, 在普通软件中先编好程序再将其读入Maple环境中常常比直接在Maple中编写更为方便. 如果要将程序代码或Maple指令加载用read命令:
% x# M+ F* F5 O( V- Hread "filename";8 z7 Z: |! V/ n/ d) W% B
如下例:
7 ?$ a( f" ^8 N/ p) h4 X> reatart:
% a! s, V2 p/ {4 ^> myfunc:=(a::list)->add(i,i=a);
6 g3 u: r  H9 D/ n  i: B! y  w
+ j3 U: x6 Y  Z2 g> avg:=(a::list)->myfunc(a)/nops(a);) C- }- I+ w8 f( [, m

, f9 |  b5 z( j; E& d% p> save myfunc,avg,"e:\\function.m";
4 U! I+ @0 a8 i' Q% H& g; }: V8 n> restart:
  X  I3 V9 \- s, Q" V> read "e:\\function.m";
' }; E- X, b. d$ o# O4 B. a> myfunc([1,2,3,4,5,6,7,8,9]);
, O$ v0 U! P+ c2 p  Q
- `1 ]9 w4 O  `: y, c> avg([1,2,3,4,5,6,7,8,9]);1 r8 ?% g1 Y" r' [  H
: E/ \9 E4 Q4 D' v5 h  [
5.3 与其它程序语言的连接! r5 b% v5 g- t% Z
5.3.1 转换成FORTRAN或C语言
4 ?/ j5 i7 f' g调用codegen程序包中的fortran命令可以把Maple的结果转换成FORTRAN语言:
  U+ J$ W3 Q, p# g, ^> with(codegen,fortran):
3 h3 z+ f7 ]9 q& t- x: \: Nf:= 1-2*x+3*x^2-2*x^3+x^4;
  v: q! G0 s+ |( E8 j # y7 |* M9 ]' L% l) d
> fortran(%);9 ^' b7 K7 c6 T
      t0 = 1-2*x+3*x**2-2*x**3+x**4
4 M* K, M# z! a% \ > fortran(f,optimized);
8 N: _! r  h2 q" I) I- T' u* s# L4 G$ K0 p      t2 = x**2
* {- g3 I  Q1 @4 X( n      t6 = t2**2
" z2 H+ A7 n& E& V2 m! C      t7 = 1-2*x+3*t2-2*t2*x+t6
( a' o2 L. ^8 y& `' [/ l" l+ _0 L> fortran(convert(f,horner,x));' f8 i; m1 i6 j9 {
      t0 = 1+(-2+(3+(-2+x)*x)*x)*x
- i# F1 y. R- `% U而codegen程序包中的C命令可以把Maple结果转换成C语言格式:4 J, n. Z/ a' Z3 I8 O% _+ B  G
> with(codegen,C):
% a; h) Q- w( Y. E+ \7 If:=1-x/2+3*x^2-x^3+x^4;2 V+ F6 U& `. r9 }0 n* Q# H

( `5 g' `# A, H! L: H4 ^+ o> C(f);
% M6 z5 O! \: ~      t0 = 1.0-x/2.0+3.0*x*x-x*x*x+x*x*x*x;. p+ n+ j7 @: K( i
> C(f,optimized);, d7 i+ q+ O1 `1 N4 m
      t2 = x*x;& @& [% }" B- R* J- l# z
      t5 = t2*t2;
# k/ u# @2 |( ?5 c      t6 = 1.0-x/2.0+3.0*t2-t2*x+t5;
' t+ `% |8 w; S8 [8 G; _optimized命令表示要对转换的表达式进行优化, 如果不加此可选参数, 则直接对表达式进行一一对应的转换.- Y( v+ [: f1 V% A, _6 G
5.3.2 生成LATEX
2 B+ L9 P4 `8 [1 ?  VMaple可以把它的表达式转换成LATEX, 使用latex命令即可:
; u5 w7 ]! x% U7 F. K> latex(x^2+y^2=z^2);
" I8 A6 D  `& [1 `$ |{x}^{2}+{y}^{2}={z}^{2}2 b! F& g/ \8 z6 s
    还可以将转换结果存为一个文件(LatexFile):: L: l  [" F0 [0 s
> latex(x^2 + y^2 = z^2, LatexFile);; H( I1 \% M* u
    再如下例:
- }1 P) j& l' P+ y! t  H6 B> latex(Int(1/(x^2+1),x)=int(1/(x^2+1),x));
' ]) _/ s) c5 i: t( A\int \! \left( {x}^{2}+1 \right) ^{-1}{dx}=\arctan\left( x \right)
6 O7 n, E" C2 P' |" k
6 |7 F) {: l, p) |! q( T
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年!9 ^8 m8 ]8 ~3 ~7 C) t! ?# ~/ w

    " ~$ d* f0 X% J6 @" [: C( H
    / d  t- T+ V; v* X+ F2 H
    回复

    使用道具 举报

    0

    主题

    2

    听众

    19

    积分

    升级  14.74%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    0

    主题

    4

    听众

    181

    积分

    升级  40.5%

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

    [LV.5]常住居民I

    群组学术交流A

    群组学术交流B

    回复

    使用道具 举报

    0

    主题

    13

    听众

    27

    积分

    升级  23.16%

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

    [LV.3]偶尔看看II

    社区QQ达人

    群组国赛讨论

    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-4-21 05:02 , Processed in 0.573741 second(s), 101 queries .

    回顶部