QQ登录

只需要一步,快速开始

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

maple基础

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

1

主题

5

听众

4

积分

升级  80%

该用户从未签到

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

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

/ r$ v" q1 |4 Y  B5 D- K. ~0 g; Y3 D
* A- L0 r$ F1 t+ ~5 E
) X5 f2 Z- @6 Q3 Y
! @; y; v6 Z: q" l
& K. }* d$ g7 o4 Z , U% p3 ^, t5 G) M4 l
# Z8 v9 P9 @, a5 V1 C

& A9 ]& W! D* V6 `' P( J  W
, }: r4 M3 S9 b, i& z+ J4 L0 P% F3 b/ _8 D/ s+ w/ v
alpha        beta        gamma        delta        epsilon        zeta        eta        theta        iota        kappa        lambda        mu
  C5 P9 T. X9 f6 a: f
2 |4 @& p& Q# Z  K+ ~7 c / s. U# y$ K' ~9 Q
6 O/ y& X, d" G# O, X

" q5 d' |" G: \2 {
" Z* N5 M5 f0 i  i  X
) B8 a7 d6 d, @" I7 F: m5 w
6 Z8 w0 t# j+ l ) F' i2 d* z9 Q  ]+ E3 m

: d7 W( a7 L( l8 _5 ]/ r2 ?* R 3 l2 t0 Q0 {: N$ V  w" u4 L1 {
8 V  q0 G7 |/ n  g9 _& n
4 h/ ]3 n+ I# g& H; c
) M6 O  T0 ^; M! |1 E# [' F$ ?; S
nu        xi        omicron        pi        rho        sigma        tau        upsilon        phi        chi        psi        omega. |& q0 |. a# d+ R1 a0 k
有时候为了美观或特殊需要,可以采用Maple中的函数或程序设计方式控制其输出方式,如下例:
4 C4 M/ _% _5 K4 l8 x0 ~: X5 E> for i to 10 do   H0 ~& W/ w/ C& R/ m
printf("i=%+2d and i^(1/2)=%+6.3f", i, eval(sqrt(i)));
: K, G+ Y  n. z: f( l( {2 N& Jod;
" H0 h, @1 N9 C1 M9 q: ei=+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
3 g8 ^& T0 z4 l, V% R% T+2d的含义是带符号的十进位整数,域宽为2. 显然,这种输出方式不是我们想要的,为了得到更美观的输出效果,在语句中加入换行控制符“\n”即可:& w! N# d" K5 o
> for i to 10 do 8 B5 W+ d2 u' k" L' h% l
printf("i=%+2d and i^(1/2)=%+6.3f\n", i, eval(sqrt(i)));
! x! J1 `" h5 q8 W1 w- wod;7 |( X3 X1 h: @! Q
i=+1 and i^(1/2)=+1.000
  E' W2 v: H( C0 B, hi=+2 and i^(1/2)=+1.414
  `0 N# O# m% u( X9 ki=+3 and i^(1/2)=+1.732
- m; Q$ W6 l2 z7 Qi=+4 and i^(1/2)=+2.000
5 U5 _  ^2 G& ?  Y" b& b& Ti=+5 and i^(1/2)=+2.236
! ]- X6 R0 Y6 T  _, e; k8 Fi=+6 and i^(1/2)=+2.449
1 I% q/ [* f- \1 K" C; v) T/ l1 bi=+7 and i^(1/2)=+2.6463 h/ L- H( |$ v2 w0 ?, a# G# ?
i=+8 and i^(1/2)=+2.828* a) X% d+ r" r1 \2 B! E7 l
i=+9 and i^(1/2)=+3.000  q5 e5 m3 o, z# {! d) t
i=+10 and i^(1/2)=+3.162
5 a% b6 ?7 m3 K( J5 \4 @6 F* b再看下例:将输入的两个数字用特殊形式打印:: J% A0 O" b: U- N
> niceP:=proc(x,y)+ u+ E. M: K' z4 c6 B& K! z3 _5 s# A3 e
printf("value of x=%6.4f, value of y=%6.4f",x,y);
' v. R1 F- O/ p, J) Qend proc;
+ {4 D9 s4 `# A8 h: e7 T , J6 a- `& Y/ f1 f1 i7 E" t
> niceP(2.4,2002.204);8 L8 N" f2 b* ^  S% N+ @. ~
value of x=2.4000, value of y=2002.20409 E7 r6 @, p3 L: z6 O3 A) o
1.4 Maple联机帮助: V9 o: U+ `  @1 j' M4 T
学会寻求联机帮助是掌握一个软件的钥匙. Maple有一个非常好的联机帮助系统, 它包含了90%以上命令的使用说明. 要了解Maple的功能可用菜单帮助“Help”, 它给出Maple内容的浏览表, 这是一种树结构的目录表, 跟有…的词条说明其后还有子目录, 点击这样的词条后子目录就会出现(也可以用Tab键和up, down选定). 可以从底栏中看到函数命令全称, 例如, 我们选graphics…, 出现该条的子目录, 从中选2D…, 再选plot就可得到作函数图象的命令plot的完整帮助信息. 一般帮助信息都有实例, 我们可以将实例中的命令部分拷贝到作业面进行计算、演示, 由此可了解该命令的作用.
+ V% H3 s( v  I( I9 m在使用过程中, 如果对一个命令把握不准, 可用键盘命令对某个命令进行查询. 例如, 在命令区输入命令“?plot”(或help(plot);), 然后回车将给出plot命令的帮助信息, 或者将鼠标放在选定的要查询的命令的任何位置再点击菜单中的“Help”即可.
% l2 ]6 O0 |. Y1 @5 I2  Maple的基本运算
6 p" W. z. f( \) _0 f2.1 数值计算问题- k  t+ M( w' J' p9 G8 K5 K; \
算术是数学中最古老、最基础和最初等的一个分支, 它研究数的性质及其运算, 主要包括自然数、分数、小数的性质以及他们的加、减、乘、除四则运算. 在应用Maple做算术运算时, 只需将Maple当作一个“计算器”使用, 所不同的是命令结束时需加“;”或“:”.
9 w" \# u. Y. f& _在Maple中, 主要的算术运算符有“+”(加)、“–”(减)、“*”(乘)、“/”(除)以及“^”(乘方或幂,或记为**), 算术运算符与数字或字母一起组成任意表达式, 但其中“+”、“*”是最基本的运算, 其余运算均可归诸于求和或乘积形式. 算述表达式运算的次序为: 从左到右, 圆括号最先, 幂运算优先, 其次是乘除,最后是加减. 值得注意的是, “^”的表达式只能有两个操作数, 换言之,  是错误的, 而“+”或“*”的任意表达式可以有两个或者两个以上的操作数.
% y" g: @/ a' ?6 |Maple有能力精确计算任意位的整数、有理数或者实数、复数的四则运算, 以及模算术、硬件浮点数和任意精度的浮点数甚至于矩阵的计算等等. 总之, Maple可以进行任意数值计算.
# Y" e  w) G# H+ `- z5 @! ]但是, 任何软件或程序毕竟只是人们进行科学研究的一种必要的辅助, 即便它有很多优点, 但也有它的局限性, 为了客观地认识数学软件、认识Maple, 下面通过两个简单例子予以说明.
7 m$ F/ K, h8 w8 m2 Q第一个简单的数值计算实例想说明Maple数值计算的答案的正确性:   : {% T1 y& X2 g: o, I3 o- e4 {. K
> 3!!!;
) k1 }  k# |" p' N3 ?2601218943565795100204903227081043611191521875016945785727541837850835631156947382240678577958130457082619920575892247259536641565162052015873791984587740832529105244690388811884123764341191951045505346658616243271940197113909845536727278537099345629855586719369774070003700430783758997420676784016967207846280629229032107161669867260548988445514257193985499448939594496064045132362140265986193073249369770477606067680670176491669403034819961881455625195592566918830825514942947596537274845624628824234526597789737740896466553992435928786212515967483220976029505696699927284670563747137533019248313587076125412683415860129447566011455420749589952563543068288634631084965650682771552996256790845235702552186222358130016700834523443236821935793184701956510729781804354173890560727428048583995919729021726612291298420516067579036232337699453964191475175567557695392233803056825308599977441675784352815913461340394604901269542028838347101363733824484506660093348484440711931292537694657354337375724772230181534032647177531984537341478674327048457983786618703257405938924215709695994630557521063203263493209220738320923356309923267504401701760572026010829288042335606643089888710297380797578013056049576342838683057190662205291174822510536697756603029574043387983471518552602805333866357139101046336419769097397432285994219837046979109956303389604675889865795711176566670039156748153115943980043625399399731203066490601325311304719028898491856203766669164468791125249193754425845895000311561682974304641142538074897281723375955380661719801404677935614793635266265683339509760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
' t& |+ K3 s% {6 g0 s) ]+ X上述运算结果在IBM PC机(1G, 128M)上计算只需要0.01秒, 得到如此复杂的结果(1747位), 一个自然的问题是: 答案正确吗?+ s; D# p& U3 x& P7 {) D% {
为了回答这个问题, 我们借助于数值分析方法, 由Stiring公式3 }( x. @" \0 Y( V" L7 k

5 G6 Y  x$ L. e7 n$ y8 m& C; {可得:  , 前三位数字与Maple输出结果相同, 且两者结果均为1747位. 另外, 在720!的计算中, 5的因子的个数为:   
& W/ `0 r. {: |+ J
! Z! j9 c9 \5 T: r( O这些5与足够多的2相乘将得到178个0, 而Maple的输出结果中最后178位数为零. 由此, 可以相信Maple结果的正确性. 1 G4 V, X! X; [
另一个例子则想说明Maple计算的局限性:   
6 h* c8 M8 ]2 }% q! Y9 F  J2 S  
: V% o7 W" }4 X* H0 @( ~Maple在处理问题时, 为了避免失根, 从不求算术式的近似值, 分数则化简为既约分数. 因此, 在Maple中很容易得到:   
: S9 N3 e8 B& L! w, n8 n- `   m! p8 f: Y1 n
显然这是错误的. 这一点可以从代数的角度予以分析.
' q1 @: b3 [" f; w不妨设 , 则 , 即 , 显然 有3个结果, -2是其实数结果. 4 y. Y; y) p( u( ?
另一方面, 设 , 则 , 即:
* P# L- x+ g2 h' M4 m! L  d" f
3 B! c6 z' g$ }/ E( R/ R显然 有6个结果, -2、2是其实数结果. . D6 E0 r' e2 {; \; c: S
这个简单的例子说明了Maple在数值计算方面绝对不是万能的, 其计算结果也不是完全正确的, 但是, 通过更多的实验可以发现: Maple只可能丢失部分结果, 而不会增加或很少给出完全错误的结果(如上例中Maple的浮点数结果皆为 ). 这一点提醒我们, 在利用Maple或其他任何数学软件或应用程序进行科学计算时, 必须运用相关数学基础知识校验结果的正确性.
, ^7 |/ Y; i5 O# Z. a- c; C尽管Maple存在缺陷(实际上, 任何一个数学软件或程序都存在缺陷), 但无数的事实说明Maple仍然不失为一个具有强大科学计算功能的计算机代数系统. 事实上, Maple同其他数学软件或程序一样只是科学计算的一个辅助工具, 数学基础才是数学科学中最重要的. / z# V+ d% {0 t! h4 F1 s9 D$ ]
2.1.1 有理数运算
( ?8 m2 a, _* \% N  `3 M# B作为一个符号代数系统, Maple可以绝对避免算术运算的舍入误差. 与计算器不同, Maple从来不自作主张把算术式近似成浮点数, 而只是把两个有公因数的整数的商作化简处理. 如果要求出两个整数运算的近似值时, 只需在任意一个整数后加“.”(或“.0”), 或者利用“evalf”命令把表达式转换成浮点形式, 默认浮点数位是10 (即: Digits:=10, 据此可任意改变浮点数位, 如Digits:=20). * J; ^% a! S# j  b2 N
> 12!+(7*8^2)-12345/125;/ p2 n2 L+ Y# H- d# [1 W' f

+ H0 ?' t# h2 m$ ~& t> 123456789/987654321;
$ D( y3 S/ R0 I% H 5 N; s& y' {& m0 h9 |( ]8 |
> evalf(%);
# ~0 B' }" p" @3 s: u/ c
. L. M& _" x; `& n8 B7 o; O> 10!; 100*100+1000+10+1; (100+100)*100-9;
* \" T! O, Q( n* S+ F
; {' J, P- F( _( P3 h/ I ' U9 r# a) G" z/ H* S' w9 i

0 X# p8 o' E! v$ \5 E> big_number:=3^(3^3);4 ?& @% ]% B* ?1 Y# g$ m$ K

0 E% T4 v0 [1 ?; E0 _5 E> length(%);# p7 {: P" D8 A  [; F
+ ^2 L. ~: S$ K
上述实验中使用了一个变量“big_number”并用“:=”对其赋值, 与Pascal语言一样为一个变量赋值用的是“:=”. 而另一个函数“length”作用在整数上时是整数的十进制位数即数字的长度. “%”是一个非常有用的简写形式, 表示最后一次执行结果, 在本例中是上一行输出结果. 再看下面数值计算例子:   3 Z. g9 b( s) C1 L
    1)整数的余(irem)/商(iquo)
: d# @( ?1 M: y1 z2 Q* h命令格式:   9 F3 G; ]+ \4 j: m) z5 J4 }
irem(m,n);        #求m除以n的余数
4 ~1 N# `1 ^* R1 Wirem(m,n,'q');    #求m除以n的余数, 并将商赋给q5 g* F8 k9 ~6 F, m! F
iquo(m,n);        #求m除以n的商数( j/ H7 m/ M8 |! \" S2 i4 D
iquo(m,n,'r');    #求m除以n的商数, 并将余数赋给r. i3 H+ M$ S5 \1 d7 e0 s$ P8 T
其中, m, n是整数或整数函数, 也可以是代数值, 此时, irem保留为未求值.
, h* p7 j4 v7 N1 \- e> irem(2002,101,'q'); # 求2002除以101的余数, 将商赋给q7 w' t" R( F- j$ c& |
6 x2 j" ]( d3 f
> q; #显示q
" j' I5 y# ]% l- _1 @$ u3 o
4 Z% s" {% M+ h$ R& ^1 v* L7 t> iquo(2002,101,'r'); # 求2002除以101的商, 将余数赋给r0 V9 h& z3 U; b6 D$ T! j
3 P( J9 l) P+ t+ f& M
> r; #显示r
/ L% @; Z; w2 G4 S6 A  f 8 j9 A1 {) h# x5 b) j& i
> irem(x,3);
/ r9 Z3 _/ P( W: @0 | # x$ y. W$ p) X$ G$ x7 g
2)素数判别(isprime)
5 v) O/ Y) e1 q, }% x素数判别一直是初等数论的一个难点, 也是整数分解问题的基础. Maple提供的isprime命令可以判定一个整数n是否为素数. 命令格式: isprime(n);
4 P9 b' m) `+ g7 x( r) S6 Y7 |+ h    如果判定n可分解, 则返回false, 如果返回true, 则n“很可能”是素数.
9 H; C# V' l* I2 X> isprime(2^(2^4)+1);
! q$ y2 l5 u* e) K; e* ?
. _8 Y7 r3 w8 p6 N! A% Z5 R> isprime(2^(2^5)+1);3 ?3 e5 k& X. o& S0 r0 T

, f. c# f9 r1 H9 b& l9 y1 u上述两个例子是一个有趣的数论难题。形如 的数称为Fermat数, 其中的素数称为Fermat素数, 显然, F0=3、F1=5、F2=17、F3=257、F4=65537都是素数. Fermat曾经猜想所有的Fn都是素数, 但是Euler在1732年证明了F5=641•6700417不是素数. 目前, 这仍是一个未解决的问题, 人们不知道还有没有Fermat素数, 更不知道这样的素数是否有无穷多. + i( x: x9 e* @* G$ i& \
3) 确定第i个素数(ithprime), o- C( ]! i7 I2 H
若记第1个素数为2,判断第i个素数的命令格式: ithprime(i);   
  B! |1 a7 _, R0 V5 [; O; y> ithprime(2002);
7 a6 ]' |% P" d# J) Z1 m9 o + ]6 E" a3 B# J
> ithprime(10000);& m5 b+ h/ a' ?0 A
1 K3 s' `& X4 i# a( y" V/ B  I
4) 确定下一个较大(nextprime)/较小(prevprime)素数' B4 s- R2 [0 N+ t3 _
当n为整数时,判断比n稍大或稍小的素数的命令格式为:   
1 K) V' \9 H8 ]- xnextprime(n);  
) O' ]) C/ q  t: W/ f' l0 Kprevprime(n); . h5 B' g1 t, z! E2 ~$ R7 O
> nextprime(2002);
: {( q! u9 Y* T5 y. k$ R3 v3 g + y0 K: Y( P: t' G
> prevprime(2002);
7 ~1 f5 X; c5 _8 g* e# q
' r0 ~1 ?( w# ~5) 一组数的最大值(max)/最小值(min)
7 x; ]7 r: C8 f9 R& D  C$ q& C命令格式: max(x1,x2,…,xn);   #求x1,x2,…,xn中的最大值: c3 V& t( }& M2 }, x4 w
             min(x1,x2,…,xn);   #求x1,x2,…,xn中的最小值$ v2 t, U( a% H0 o8 s
> max(1/5,ln(3),9/17,-infinity);, w- p' {0 N1 @' @% f9 d$ N! k

# W6 C/ j; \* v& a* f3 e> min(x+1,x+2,y);
: s. _+ p( g" Z$ l$ x
' s# S+ v# m6 D* T6)模运算(mod/modp/mods)
& s6 h0 Q9 C0 e9 |: n命令格式:  e mod m;    # 表达式e对m的整数的模运算+ y- n7 O$ `1 k0 h/ v# h* {
modp(e,m);  # e对正数m的模运算
! ?% g2 t- y' i' n0 U. O' ymods(e,m);  # e对m负对称数(即 -m)的模运算
$ z& h8 L+ A* P% Q2 t) P6 r/ j: p`mod`(e,m);  # 表达式e对m的整数的模运算, 与e mod m等价2 E8 `# U9 _# L3 Z; P- n& A
值得注意的是, 要计算i^n mod m(其中i是一整数), 使用这种“明显的”语法是不必要的, 因为在计算模m之前, 指数要先在整数(可能导致一个非常大的整数)上计算. 更适合的是使用惰性运算符“&^”即: i &^n mod m, 此时, 指数运算将由mod运算符智能地处理. 另一方面, mod运算符的左面优先比其他运算符低, 而右面优先高于+和-, 但低于*和/.
: z9 P) W; \+ b) {- {% m$ B> 2002 mod 101;/ O3 h# M5 Y1 e: f! I5 I- F4 a% |

  x  n* G% a  x+ z! ?> modp(2002,101);
$ V- C- w/ E& k% j1 W. G0 {3 }4 O 7 x0 o6 x2 j5 P* S; a' s
> mods(49,100);
" H8 s+ L; i( B3 E: L( W: }  k) \ 9 H% p8 [, P; x' f
> mods(51,100);
; L* T, O# s6 l8 ] ; m. B+ A7 U' A4 w: Y3 i
> 2^101 mod 2002;  # 同 2 &^101 mod 2002;
2 w; Q0 Z) ?& |- J2 I  I$ a
# M* g! m. C! I" ~7)随机数生成器(rand)
2 t' `& p2 ?4 w3 P+ i8 h9 }命令格式:   
: U; U: B. C7 Y- \9 G0 R  Arand( );    #随机返回一个12位数字的非负整数
# {2 r6 d% C' q. Z) P  J' }rand(a..b);  #调用rand(a..b)返回一个程序, 它在调用时生成一个在范围[a, b]内的随机数# @/ m0 Z4 s) o# [& l* W
> rand();4 ]# l$ M- k# l) c: h7 d/ x6 k
5 t9 v. J7 e3 S; k" S4 ?. h: J
> myproc:=rand(1..2002):4 d2 x( y" f! o0 M3 K
> myproc();9 t, d1 k* ]3 @2 v- c$ k# @

. x( |) {8 L2 e0 ]$ O3 @> myproc();
  v1 E7 y" n4 `8 V
' @" q" p  S* `9 S1 g, k0 y    注意, rand(n)是rand(0..n-1)的简写形式.! [* a) {. R9 ?+ K; F
2.1.2 复数运算
# u+ \1 K8 ~% B) |1 f& w6 u8 D复数是Maple中的基本数据类型. 虚数单位i在Maple中用I表示. 在运算中, 数值类型转化成复数类型是自动的, 所有的算术运算符对复数类型均适用. 另外还可以用Re( )、Im( )、conjugate( )和argument( )等函数分别计算实数的实部、虚部、共轭复数和幅角主值等运算. 试作如下实验:   - B7 b# }% D9 o* h
> complex_number:=(1+2*I)*(3+4*I);$ V# I- L6 b; y, B5 i

: h9 p. c: e3 P2 s% l' H> Re(%);Im(%%);conjugate(%%%);argument(complex_number);2 H. f+ W0 ]* S$ A* b
( `0 \  m6 h2 j/ E

) e0 W/ z8 c( j! K) ?( X
, V4 n1 u. A3 Z$ O( g7 ~ 7 i  w. q8 t% x! b. ^1 ]
值得注意的是上行命令中均以“;”结束, 因此不能将命令中的2个%或3个%(最多只能用3个%)改为1个%, 因为%表示上一次输出结果, 若上行命令改为“,”结束, 则均可用1个%.   X0 U. J3 A: K
为了在符号表达式中进行复数运算, 可以用函数evalc( ), 函数evalc把表达式中所有的符号变量都当成实数, 也就是认为所有的复变量都写成 的形式, 其中a、b都是实变量. 另外还有一些实用命令, 分述如下:   ( d% {( F* v4 I2 y' H# {$ s
1) 绝对值函数
  d8 A' q- U% X' b/ B' z命令格式: abs(expr);  ) S% S* Q: x% l& r5 O
当expr为实数时,返回其绝对值,当expr为复数时,返回复数的模.
& u' J1 M" i% U9 \0 F> abs(-2002);    #常数的绝对值
9 t8 x) K$ U( x# ~0 ?$ g; t7 u # j3 r5 o/ }6 W
> abs(1+2*I);   #复数的模
$ z3 m  A# f& ?1 o; Q9 K6 ^; a 0 O. @/ C% ]6 ?5 _& @4 c2 s8 K
> abs(sqrt(3)*I*u^2*v);  #复数表达式的绝对值. D# S3 w- h0 J; j) f0 _. I( [
& g4 [& {0 U: L! l; ?) C
> abs(2*x-5);   #函数表达式的绝对值
# k+ C* C3 u7 R; _2 C  g0 C. V
8 m+ F  w5 G, e2)复数的幅角函数( C3 H# k) F, [
命令格式:   argument(x);  #返回复数x的幅角的主值
+ e& a) d/ n& N9 r8 Z$ M> argument(6+11*I);2 O$ I7 H: e2 Y+ m
1 q5 z  `5 Y, Y# N( l
> argument(exp(4*Pi/3*I));
, i2 u7 U/ a/ }- M0 ?: `- M" |& p/ P9 I # j% [( O: n5 O7 B! p. i
3)共轭复数; \9 q% Z1 w1 H" Y4 \
命令格式:   conjugate(x);  #返回x的共轭复数
3 H- W  M  S) r/ F% }> conjugate(6+8*I);7 d# ~3 Q) w5 w0 ?& e

5 \" P- U9 |' q7 \- H4 w* Q4 I> conjugate(exp(4*Pi/3*I));, \) O; e. v5 M) W9 T. i

: I$ y9 h6 ^/ B0 s2 u6 U8 i$ W2.1.3 数的进制转换0 m1 r+ b+ M& N9 \
数的进制是数值运算中的一个重要问题. 而在Maple中数的进制转换非常容易, 使用convert命令即可. ! a: E  `. ]5 D7 r9 L+ i
命令格式:   convert(expr, form, arg3, ...);    6 E: E* q) u; v
其中, expr为任意表达式, form为一名称, arg3, ... 可选项. % g+ G. R2 i5 E" t5 o; P
下面对其中常用数的转换予以概述. 而convert的其它功能将在后叙章节详述.
6 I7 {/ P4 A5 W6 ]4 m    1)基数之间的转换
8 z' G$ q$ z5 c4 P9 O  f- n) `命令格式:   . Z$ ]* u: r' C) R' c
convert(n, base, beta);      #将基数为10的数n转换为基数为beta的数/ o9 ]* E3 x3 {6 b, K2 C
    convert(n, base, alpha, beta);#将基数为alpha的数字n转换为基数为beta的数
3 `/ B# w$ M& b2 M/ x> convert(2003,base,7); #将10进制数2002转换为7进制数, 结果为: (5561)7
  g# L: t& G, R , l' t1 B! W2 ~, k! r3 L
> convert([1,6,5,5],base,7,10); #将7进制数5561转换为10进制数- v% E- y3 z$ O: F3 d% X

: ]7 r( _* c( Z4 s3 Q> convert(2002,base,60);       #将十进制数2002转换为60进制数, 得33(分钟)22(秒)3 [0 v9 M' ]+ x- u% r& Z
! s0 V6 I  _" A' a0 I6 S2 H
    2)转换为二进制形式
$ J. N  z$ D6 A命令格式: convert(n, binary);0 `8 F) ?$ h) w7 N# @
其功能是将十进制数n转换为2进制数. 值得注意的是, 数可以是正的, 也可以是负的, 或者是整数, 或者是浮点数, 是浮点数时情况较为复杂.
0 T* |8 g+ F9 h% D' E5 f+ r> convert(2002,binary);   6 }& ^" r- A- C! Q, u" a# A

) ~* M. S$ v2 v' W. j. D> convert(-1999,binary); 9 B, z/ M$ K2 S
" D6 A9 [8 x7 U6 S: z6 D
> convert(1999.7,binary);
4 O, {/ ]: R; t# D5 H- z' p
8 b  ~1 s2 w6 J! i0 L3)转换为十进制形式* J6 I1 }4 }; Y" X' D5 G
其它数值转换为十进制的命令格式为:   
# K: D" a- f! M3 N! W8 qconvert(n, decimal, binary);   #将一个2进制数n转换为10进制数4 u2 ]1 @0 g% m$ b" L2 D- ^
    convert(n, decimal, octal);    #将一个8进制数n转换为10进制数! ?0 g* X0 P" P
    convert(string, decimal, hex);  #将一个16进制字符串string转换为10进制数
& }6 f# z3 m8 R4 x, ]> convert(11111010010, decimal, binary);    ) ]: [# y! t& R4 v# E, P$ p/ h

# E6 Q% Q! E) q; A- t9 M6 k> convert(-1234, decimal, octal);           
4 {* @6 Q  \* ]) @) _2 Q6 p
( P% {$ N: ?- ?8 u+ X> convert("2A.C", decimal, hex);          5 A9 q) Y6 z% ^: l+ o0 m/ p
3 B) u$ b, ~* ]! |
4) 转换为16进制数: e2 M7 P$ Z+ p  V. P% W
将自然数n转换为16进制数的命令格式为: convert(n, hex);   
5 n  G+ A+ a' G8 y3 z> convert(2002,hex);  convert(1999,hex);% ~3 V) O+ J, O2 m9 S3 e" I" ~7 N% P( |
: @2 N$ P2 c" g6 S
+ t$ N$ Y, j- @. T: e
5)转换为浮点数
9 |( i% L# U( g! u( F. m3 q' T+ J" v# T命令格式: convert(expr, float);
. Z- _/ E0 c6 A, G注意, convert/float命令将任意表达式转换为精度为全局变量Digits的浮点数, 且仅是对evalf的调用. $ c- D+ l/ S( N% y4 U
> convert(1999/2002,float);
( h$ X, D9 v8 a/ A" r8 i: b
3 `& e& X" P- J> convert(Pi,float);
8 Y9 m( b+ t* d. W. N: I8 [" Z' s
) D2 t3 v! p6 V# N! ~, F8 _2.2 初等数学
2 K0 Z  F% f; ~    初等数学是数学的基础之一, 也是数学中最有魅力的一部分内容. 通过下面的内容我们可以领略Maple对初等数学的驾驭能力, 也可以通过这些实验对Maple产生一些感性认识.
1 ~. J1 Y2 H3 j7 }/ M8 b2.2.1 常用函数
) _/ S2 Z: {5 W6 |; L; O& i8 C作为一个数学工具, 基本的数学函数是必不可少的, Maple中的数学函数很多, 现例举一二如下:     }$ x6 P4 A) w0 r
指数函数: exp# E" O5 H3 f8 t* n: S0 N: ]1 ]$ S
一般对数: log[a]' n1 M' Z" f# L5 s4 ?1 V! J; G% |) Q
自然函数: ln
+ l* l& c1 m1 z* P常用对数: log104 \  a2 S# p: y( U! B- {9 V. C' P
平方根: sqrt+ M/ a/ Q  ^* k5 K
绝对值: abs, X3 }* w9 W" X1 I& m) @, K
三角函数: sin、cos、tan、sec、csc、cot! o. z# ^; j2 |. ~6 H* Z1 ~9 T
反三角函数: arcsin、arccos、arctan、arcsec、arccsc、arccot9 q9 _4 J7 z# z* c
双曲函数: sinh、cosh、tanh、sech、csch、coth! t; l; _; O* s( {& ]2 B
反双曲函数: arcsinh、arccosh、arctanh、arcsech、arccsch、arccoth
  h+ |  C$ s4 z, o6 R& y3 p, u贝赛尔函数: BesselI、BesselJ、BesselK、BesselY
3 h7 k9 w6 e% f5 h2 |) sGamma函数: GAMMA
9 h7 d( _: m2 |1 f2 ~误差函数: erf
0 X6 Q6 y1 Y0 Q: V函数是数学研究与应用的基础之一, 现通过一些实验说明Maple中的函数的用法及功能.
" z5 S) x" }" ~" R# F: K! @3 m4 h1) 确定乘积和不确定乘积
. v6 c( B/ ^5 D% m2 s0 V* y! v命令格式: product(f,k);  
( Y! W- @9 q# e/ D" N4 d, Q' d6 \product(f,k=m..n);  $ f& y! {  R  |# B  Z8 q7 @
product(f,k=alpha); ) M5 v; e0 ~4 [
product(f,k=expr);- I( y/ a7 `# z4 c
其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—包含k的任意表达式. . [0 |7 f* Z0 }1 D
> product(k^2,k=1..10);   #计算 关于1..10的连乘
5 _4 U  S1 n# T9 s 4 h& c. e8 W0 m
> product(k^2,k);         #计算 的不确定乘积
" _. n$ k3 ~) D 3 }  W# p( g7 [% o
> product(a[k],k=0..5);    #计算ai(i=0..5)的连乘
# s( L1 L3 L& O8 R4 W 0 k& F0 V5 w3 m) l1 F' @* `0 i! N
> product(a[k],k=0..n);    #计算ai(i=0..n)的连乘9 a) F: _' i* O/ b
% j4 T3 C. n: @# B2 |' v
> Product(n+k,k=0..m)=product(n+k,k=0..m);   #计算(n+k)的连乘, 并写出其惰性表达式  n' W" J" ]5 m! C/ P

8 T5 V/ m& [  `$ U8 K> product(k,k=RootOf(x^3-2));     #计算 的三个根的乘积
; g5 h& i) G6 ~# A) Q / g! _1 _. X) o3 q
    product命令计算符号乘积, 常常用来计算一个公式的确实或不确实的乘积. 如果这个公式不能求值计算, Maple返回 函数. 典型的例子是:   , ^: S6 m5 i1 h
> product(x+k,k=0..n-1);1 K5 G8 j- R5 i1 P# w% V3 r6 i
" i2 y8 T" {1 N+ }7 b& r1 m
如果求一个有限序列值的乘积而不是计算一个公式, 则用mul命令. 如:   
* d* ?) Q0 [! ?> mul(x+k,k=0..3);6 @6 N% M2 M5 \" v7 |* L
* S1 a( G+ p1 Z( z) S- D! S0 ^, S
2)指数函数
8 ~6 C; d$ h1 n( T: O计算指数函数exp关于x的表达式的命令格式为: exp(x);
0 I1 o& ?7 H" I0 L. U+ y> exp(1);
, n" A% U' F0 |- D) }. m
7 c9 c8 ?6 G9 N: ]. B! g6 I) Z8 @> evalf(%);
& Z' i$ u8 x$ H1 W. D5 l& V1 L
, H% O/ ~& b9 ~> exp(1.29+2*I);
+ t9 S3 D0 j5 @% r  o2 a ; i: _  g* M; D5 d0 d0 y3 J2 T* ]. [
> evalc(exp(x+I*y));
  o. q9 @; q4 \. M; p
! u+ i1 p5 T& D) H1 ^  a! d3)确定求和与不确定求和sum
5 L/ Z3 M/ h$ Z# g命令格式: sum(f,k);  
3 L# r! [( Y( s! l9 ]; w* }- fsum(f,k=m..n);  
* w' O; t1 y' C3 p9 U6 p- m+ `3 {sum(f,k=alpha);
4 ~7 ^" X2 w  c) W2 wsum(f,k=expr);
: G0 e( u7 c- C) b6 B5 {其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—不含k的表达式.
1 L* k) ], f# a( S7 A> Sum(k^2,k=1..n)=sum(k^2,k=1..n);0 V( x5 @4 K$ H2 `
" p+ Y/ n/ l# b0 [/ z8 E
> Sum(k^3,k=1..n)=sum(k^3,k=1..n);1 T$ \! Z, V8 Q! _5 Z' u

' r* y4 ~$ ~+ z$ |6 o' d) |/ y4 ^9 w> Sum(k^4,k=1..n)=sum(k^4,k=1..n);
% L5 O2 I3 }) O7 I $ U9 q* X2 U2 |( b2 L" T" A
> Sum(1/k!,k=0..infinity)=sum(1/k!,k=0..infinity);
# z' R, h) o+ t+ v/ Z
' V; w+ \) _# V5 d> sum(a[k]*x[k],k=0..n);9 A2 j7 @) k  o
  {4 v: }/ }$ c. _- l
> Sum(k/(k+1),k)=sum(k/(k+1),k);8 A, t$ z( Q2 H! w
: G% G! }) T4 H2 a- @
> sum(k/(k+1),k=RootOf(x^2-3));* V7 s4 Z7 |4 a# k: |( {, x
- m0 a' b8 K  J8 }# N
sum函数可计算一个公式的确定和与不确定和, 如果Maple无法计算封闭形式, 则返回未求值的结果. 值得注意的是, 在sum命令中将f和k用单引号括起来, 可避免过早求值. 这一点在某些情况下是必需的.
" _1 e- z  n9 c! u0 T> Sum('k','k'=0..n)=sum('k','k'=0..n);+ z5 ^" X' }/ a9 Q0 a
* t4 I' e/ w) Y. f* o* t
如果计算一个有限序列的值, 而不是计算一个公式, 可用add命令. 如:   
5 f  x* h% n; [0 i. y> add(k,k=1..100);; `& Z3 ~- P( |+ Q; V1 Q
( f9 O7 z$ e4 ]7 L5 l
尽管sum命令常常用于计算显式求和, 但在程序设计中计算一个显式和应该使用add命令.
3 ?/ K* }& i: ^7 ?+ \% K另外, sum知道各种求和方法, 并会对各类发散的求和给出正确的结果, 如果要将求和限制为收敛求和, 就必须检查显式的收敛性.
. |2 L. z$ n. H! w# @% i5 F3)三角函数/双曲函数8 v; R! \1 b% {, o2 j
命令格式:   sin(x);   cos(x);   tan(x);   cot(x);   sec(x);   csc(x);
1 c% G1 \0 r; k  Q7 t# c5 w          sinh(x);  cosh(x);  tanh(x);  coth(x);  sech(x);  csch(x);
  C; s% S" n2 a其中, x为任意表达式. 2 i- S* `) M9 k- U
值得注意的是三角函数/双曲函数的参数以弧度为单位. Maple提供了利用常见三角函数/双曲函数恒等式进行化简和展开的程序, 也有将其转化为其它函数的命令convert.
& ?# H+ y& U/ n$ z# w> Sin(Pi)=sin(Pi);
$ T; |% m' ]2 o; s) }& J 5 M+ {. g. T1 {, ~! X8 ^! e
> coth(1.9+2.1*I);) x3 I" }% u" [. Z$ a
7 D$ C7 Z' l% S. C8 B) u
> expand(sin(x+y));     #展开表达式6 [# Q8 H7 t* X% S
; {9 U$ d1 F; N2 J. @
> combine(%);        #合并表达式
5 q; d: J, r$ s6 V* i1 ?
7 o$ o9 M7 H* C$ X. D3 k  j0 j> convert(sin(7*Pi/60),'radical');0 n5 f- I& o# K/ n5 ^
4 e- e% t; z) F1 I, Y: G# _) v
> evalf(%);
& |4 Y8 ]/ G: h$ h
0 m, i" H$ p: z# j# a# v但有趣的是, combine只对sin, cos有效, 对tan, cot竟无能为力.* o9 R/ _0 @7 g# B) Z7 o0 n1 C
4)反三角函数/反双曲函数
) r3 t4 E6 d1 K& J- }5 @命令格式: arcsin(x);   arccos(x);   arctan(x);   arccot(x);   arcsec(x);   arccsc(x);
4 O% m- Z. b. ]1 a7 n1 Z& l+ E     arcsinh(x);  arccosh(x);  arctanh(x);  arccoth(x);  arcsech(x);  arccsch(x);   2 z0 k+ a7 _& M; `. K
arctan(y,x);
8 }" p& e' q: O; Y其中, x, y为表达式. 反三角函数/反双曲函数的参数必须按弧度计算.
7 w. D) s6 W# G* a( }4 N3 g算子记法可用于对于反三角函数和反双曲函数. 例如, sin@@(-1)求值为arcsin.
/ q9 B$ [$ f6 |4 d1 f" v> arcsinh(1);
  ~3 H- }9 K# K6 T: o2 o' ~ 1 V6 z/ s$ X7 m
> cos(arcsin(x));
' @+ S* J. [% v
- ^, m6 q2 Y: @$ r! F> arcsin(1.9+2.1*I);
. `) N! ^- Z' G) o) k
- ^4 m; q9 P# G# w# _/ ?1 q, w5)对数函数: o# \% e8 |3 l7 [2 O7 ^/ E
命令格式: ln(x);           #自然对数
3 L1 `. {/ F  J8 }7 D8 ^! c% Glog[a](x);        #一般对数
6 W# i1 P. Z+ g$ k! elog10(x);        #常用对数4 V9 g6 ]/ U( t. g' ?5 P
一般地, 在ln(x)中要求x>0. 但对于复数型表达式x, 有:   
/ G, L+ N  L2 H& Y, ?: k) l0 p2 n  (其中,  )
* r$ W+ @/ F6 \  k+ O> ln(2002.0);
4 |5 S# n" Y8 d4 i; W. d/ f
! }4 L; c- |! Y8 a/ {0 S, X- v1 |> ln(3+4*I);+ G/ f- t6 _3 L
  U* M1 S6 ?" D1 F! `
> evalc(%);    # 求出上式的实部、虚部
0 A  s7 b+ w7 v9 y3 F  h" ~( V , p' n" A* {- t- Q8 ]
> log10(1000000);
- z7 l! H2 T+ {6 x0 W# c& ^   D' U+ ^' O- n3 y
> simplify(%);   #化简上式$ ?0 o0 X2 T8 ?& N$ D* D+ G

1 [2 k; K4 e9 ~& X2 B: ~! j2.2.2 函数的定义
1 n$ v, y  Z' F, j; }3 @+ W- DMaple是一个计算机代数系统, 带未知或者已知字母变量的表达式是它的基本数据形式. 一个简单的问题是, 既然表达式中可以包含未知变量, 那么它是不是函数呢?试看下面一个例子:   
7 f* y: y1 a) n- Y2 |5 J> f(x):=a*x^2+b*x+c;6 _. e; Q  S: K- Q& b* z
# N* i0 p% Z8 U; P( K
可以看出, Maple接受了这样的赋值语句, 但f(x)是不是一个函数呢?要回答这个问题,一个简单的方法是求函数值:   2 [# B0 D8 {; h; ]2 g, L1 F( Z5 X$ j) Y
> f(x),f(0),f(1/a);" v7 I/ B5 D. a8 h, u4 J* @

+ w% k3 O: k  r  x" U由上述结果可以看出, 用赋值方法定义的f(x)是一个表达式而不是一个函数, 因为f(x)不能把所定义的“自变量”或者“参数”转换成别的变量或表达式. 但从赋值“过程”可以看出, f(x)虽然也算是一个“函数”, 但却是一个没有具体定义的函数:   
4 |- a7 w8 [( U> print(f);+ N3 E9 {) y( O" f7 X! `' J
( k, }- t' a$ h! k( A9 U
事实上, 我们所做的赋值运算, 只不过是在函数f的记忆表(remember table)中加入了f(x)在x上的值, 当我们把自变量换作0或1/a时, f(x)的记忆表中没有对应的表项, 所以输出结果就是抽象的表达式. : G. ]; b1 _) O1 L+ {7 _
在Maple中, 要真正完成一个函数的定义, 需要用算子(也称箭头操作符):   
: B; S* Q9 f1 b( m* O& j; _$ e> f:=x->a*x^2+b*x+c;
- G6 J4 r% @0 {( I  A0 D$ O6 t
) C$ Y' V7 `3 P, C! X" G' C# x> f(x),f(0),f(1/a);0 X5 ], i4 e4 g, g$ {  M- x3 s) E' `

! u9 U6 m$ N; x, a/ s; p多变量的函数也可以用同样的方法予以定义, 只不过要把所有的自变量定成一个序列, 并用一个括号“()”将它们括起来(这个括号是必须的, 因为括号运算优先于分隔符“,”). 8 T; ?6 W7 T2 r" B' Z' b; H
> f:=(x,y)->x^2+y^2;
- T  o  b: H' F" t $ ^) }. \! K! i' {  v  }2 \
> f(1,2);4 S4 `& x! J$ r  Z3 y) {( D

! t9 k% @3 g6 c+ k> f:=(x,y)->a*x*y*exp(x^2+y^2);- C* X! x# {' Y

0 R, E* X+ G  P; C" o1 y- r7 d综上所述, 箭头操作符定义函数的方式一般为:   7 }5 S7 N. }  ~* U  c
一元函数: 参数->函数表达式
6 ?* c  _# T) U. ~* K! s" v多多函数: (参数序列)->函数表达式
+ X) ^9 C) q/ a0 J3 J9 _5 U无参数函数也许不好理解, 但可以用来定义常函数:   7 n; H3 v- a! v6 y: N( H8 Y- w! D
> E:=()->exp(1);
* r* l( N; ~4 W# S " U7 h1 ?* @1 V1 i
> E();/ E6 V6 ~# z* X" I8 C. P0 `, z
0 P% b7 H  K+ H% J
> E(x);
/ x4 P: d% B# s7 P3 y+ K 7 ^' ?! ?) c/ Y
另一个定义函数的命令是unapply,其作用是从一个表达式建立一个算子或函数. : ~% S) m; L$ S) p8 X: G5 S
定义一个表达式为expr的关于x的函数f的命令格式为:  f:=unapply(expr, x);          3 Z$ {1 U! n. ^) N  S7 k% v* N5 b: V
定义一个表达式为expr的关于x,y,…的多元函数f的命令格式为:  f:=unapply(expr, x, y, …);     , J' x- ~6 L" n0 f" Z6 H
> f:=unapply(x^4+x^3+x^2+x+1,x);& P2 f' P2 h1 O, m
: X4 w2 N3 N5 `9 q. y8 V
> f(4);
2 r$ ?3 H9 T: h4 M  M/ N6 Z3 ] 1 w& a6 g$ q5 ]8 z& T
> f:=unapply(x*y/(x^2+y^2),x,y);+ L1 x* Q: P+ G9 w6 F

% C- {" r  L2 Z- z$ [5 K1 d: w> f(1,1);
  F: x! K1 [  K8 _
/ ~: Z9 f9 S. ^) _0 ^借助函数piecewise可以生成简单分段函数:/ n9 m  `& \; P. v5 c' H* @& {; T8 I
> abs(x)=piecewise(x>0,x,x=0,0,x<0,-x);4 W8 h# Q5 S6 T
& B0 M5 U3 ]' H/ z# E/ @
清除函数的定义用命令unassign. ; V6 k. b. b* N5 V
> unassign(f);
& `/ i' E* {& T! B2 m7 R> f(1,1);
& s+ B* N7 X: M# y) Q. l
+ a) I0 k+ ?" E除此之外, 还可以通过程序设计方式定义函数(参见第6章).
& r+ o* V" l8 m, N7 h2 }" `定义了一个函数后, 就可以使用op或nops指令查看有关函数中操作数的信息. nops(expr)返回操作数的个数, 函数op的主要功能是获取表达式的操作数,其命令格式为:% G* d' i; G8 E' S
op(expr);         
# J; k5 M4 z  |" W0 h; U* Bop(i, expr);         
! a( t7 }' g7 I  r) B0 T9 \" B' @op(i .. j, expr);      
# I2 h  g. z$ _nops(expr);
4 I4 f* W7 I3 D) z如果函数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的类型. ! `) {$ m8 u4 ^
命令op(i .. j, expr); 执行的结果是expr的第i到第j个操作数, i..j中含负整数时的情形同上.
2 U; ]! e. ]; s/ A/ ^' `命令op(expr); 等价于op(1..nops(expr), expr);
* S' M/ d# N0 p5 t  y特别地, 当op函数中i为列表[a1, a2, ..., an], 则op([a1, a2, ..., an], expr); 等价于op(an, op(..., op(a2, op(a1, e))...));
8 O" i$ F, p$ ~; N+ o/ V0 p/ @' M而当expr为一般表达式时,nops(expr)命令返回的是表达式的项数, 当expr是级数时返回级数每一项的系数和指数的总和.
7 N5 v+ N& T+ ]1 z: F> expr:=6+cos(x)+sin(x)*cos(x)^2;
8 m6 n8 M' r+ |8 l; m, p& c
1 }4 Y( f( r: Y. r2 A> op(expr);/ }( c; C; z" ]& h0 b, m! i# E: u5 Q

+ C6 l* E2 n: Z) s+ R$ k8 N8 ?> nops(expr);; ~  f# c- N' s3 C% X/ c

9 U  I, @% |% ~7 i7 \' \> p:=x^2*y+3*x^3*z+2;* C, T2 E0 I4 p; n* R  H/ Z
3 W# I- B7 `, Y' k& W3 l# [% p
> op(1,p);
0 q+ T3 B! W* W6 L+ K5 ~ 3 F1 Y0 p+ M" F3 W) ~
> op(1..nops(p),p);+ T9 ]* ~0 k5 ~/ e7 l, `
; p8 Q0 V$ C3 e& l/ y9 ^' S
> op(op(2,p));
& ^% x9 @# v, }$ N' e4 Y  H5 v0 y
& Z! z$ {" M& O4 `# r% w! Q> u:=[1,4,9];
+ g1 D( W; N9 f+ R7 W' {
4 z+ N7 n& N$ C> op(0,u);
' o! B: z) X, Q# V; d: z) ]6 o  q
( {3 u  s# j; d, F> s:=series(sin(x),x=1,3);8 m0 I2 J% U& ?3 t7 Z. z- r" L# k2 U
* o0 F7 ]) h1 G$ h. S% U( ~
> op(0,s);" L' U+ i8 |( l' D8 N% f
       
2 L0 L3 J% i, h' L> nops(s);* h7 a9 N  Z, B8 a5 a4 x- {5 T6 L4 k
9 ~2 s) E" ?. G- a2 v1 M
下面一个有趣的例子说明了Maple在处理算术运算时的“个性”:
  j, B, q% e: h3 H- t( R1 ?> op(x*y*z);+ c$ @5 n- b9 W% Z. P6 v

& M8 c# C$ m' L4 O! j/ j) ?> op(x*y*z+1);
6 G" G2 b$ [: o7 {& H3 [4 M% U3 ?
; X+ f1 I. Z- r  o" T2.2.3 Maple中的常量与变量名
, f  Y  d# s5 z. a5 @为了解决数学问题, 一些常用的数学常数是必要的. Maple系统中已经存储了一些数学常数在表达式序列constants中:   
: I6 ?' }7 C* ]5 x+ l1 {" W+ ~> constants;7 r) p# i* B( c5 @7 m6 H
$ `* d5 o3 Q; a
为了方便使用, 现将上述常数的具体含义列示如下:   
+ P8 M/ G: }+ T9 ~( A! F3 D0 t常    数        名 称        近似值
( t% b  u$ o5 P圆周率 # W7 }6 p+ K" \/ z5 k9 {3 Y
Pi        3.1415926535, H3 l- K' J* O5 M9 y
Catalan常数
1 @: o" w0 [! mCatalan        0.9159655942' q4 R2 M' J0 J9 Y8 y4 ~( r. u
Euler-Mascheroni常数 - T" V! j" w3 ]% V8 j! P$ D
gamma        0.5772156649
2 w2 C( A3 e; _+ z" z  V+ f. v; K
) R# |; G4 E9 O+ C8 |8 Minfinity        . g/ h! j  l) r; K' ]5 m4 a( `0 [# C# ?

6 {2 |  K& `" ]: [+ R7 a' n9 ~需要注意的是, 自然对数的底数e未作为一个常数出现, 但这个常数是存在的, 可以通过exp(1)来获取.
+ |+ e1 ^3 h% k& ?在Maple中, 最简单的变量名是字符串, 变量名是由字母、数码或下划线组成的序列, 其中第一个字符必须是字母或是下划线. 名字的长度限制是499个字符. 在定义变量名时常用连接符“.”将两个字符串连接成一个名. 主要有三种形式: “名.自然数”、“名.字符串”、“名.表达式”.
8 g! l" ~! _/ E: y值得注意的是, 在Maple中是区分字母大小写的. 在使用变量、常量和函数时应记住这一点. 数学常量 用Pi表示, 而pi则仅为符号 无任何意义. 如g, G, new_term, New_Team, x13a, x13A都是不同的变量名. : S( G( J7 K% @' @# {9 T
在Maple中有一些保留字不可以被用作变量名:   4 i5 y: L( e  n/ ^- d
by      do      done     elif     else     end        fi        for      
. f% [% W' H; B5 S. `. Tfrom    if       in       local     od     option    options     proc         . F  s0 M* v- ~" M+ S( B: U
quit    read     save     stop     then     to        while      D
: e9 u, u7 S8 O. b- x/ L4 ^' y0 ^Maple中的内部函数如sin, cos, exp, sqrt, ……等也不可以作变量名.
: l# D# l) a8 j! {+ w) K另外一个值得注意的是在Maple中三种类型引号的不同作用:   3 d3 |! G, W( C8 }* M8 |
`  `:   界定一个包含特殊字符的符号, 是为了输入特殊字符串用的;   
5 Y: w1 h  B- t- u9 x, e: V'  ':   界定一个暂时不求值的表达式;    * J% d* n0 g; g& n( T! ~
"  ":   界定一个字符串, 它不能被赋值. : L2 }2 D4 z0 J  |$ m. x
2.2.4 函数类型转换           4 f9 l! h" W! Q# T8 B
函数类型转换是数学应用中一个重要问题, 譬如, 将三角函数转换成指数函数, 双曲函数转换成指数函数, 等等. 在Maple中, 实现函数类型转换的命令是convert. 命令格式:  % S$ B3 I6 e- K/ q% \9 \$ l" v( ~) t
    convert(expr, form);        #把数学式expr转换成form的形式
) p7 t6 W! B3 ~* ?& p6 |convert(expr, form, x);      #指定变量x, 此时form只适于exp、sin、cos6 y+ B1 M  V, E5 U2 n5 V5 U
convert指令所提供的三角函数、指数与函数的转换共有exp等7种:   & l/ ~1 S. Z# X3 w
(1) exp: 将三角函数转换成指数% _+ r. {7 h9 q2 B1 ]! S1 n
(2) expln: 把数学式转换成指数与对数
4 c& g( p9 U  F( m6 B* g(3) expsincos: 分别把三角函数与双曲函数转换成sin、cos与指数的形式
9 [6 f6 b( O, }% x7 \(4) ln: 将反三角函数转换成对数
  r  {* n9 I- H4 p(5) sincos: 将三角函数转换成sin与cos的形式, 而把双曲函数转换成sinh与cosh的形式
2 ]; r( v! V/ h! l(6) tan: 将三角函数转换成tan的形式% b& L" s. ]) h( Q+ r, |, y" ]
(7) trig: 将指数函数转换成三角函数与对数函数  E, r8 p& k6 V# [, r
> convert(sinh(x),exp);   #将sinh(x)转换成exp类型
& K* s" l# f& r& f/ \- L3 e
9 S" l* x* U2 M, e6 ?( i+ a/ N> convert(cos(x)*sinh(y),exp);, g) M  r, s; Z7 c  Y7 u
$ Q* X0 c9 }0 v& U( U% E
> convert(cos(x)*sinh(y),exp,y);
& w% t( ~! _) Y6 q! t
/ R- [) u7 I! D) M- Z& G> convert(exp(x)*exp(x^(-2)),trig);  L/ Z% c" L1 [. C

  t/ t8 S" q, p- S, {> convert(arcsinh(x)*cos(x),expln);
) V% R5 g5 n7 d* O) S 4 q9 m8 X6 h  ^8 e
> convert(cot(x)+sinh(x),expsincos);
% Y: \% u$ r8 c& a
' |: g! I- s- ?9 n> convert(arctanh(x),ln);" K7 A: s  C9 H

) `4 r! M8 r+ P9 Y7 Z, w7 Jconvert在有理式的转换中也起着重要的作用. 在有关多项式运算的过程中, 利用秦九韶算法可以减少多项式求值的计算量. 在Maple中, 可以用函数convert将多项式转换为这种形式, 而cost则可以获取求值所需的计算量. 注意: cost命令是一个库函数, 第一次调用时需要使用with(codegen)加载. 例举如下:   / r0 P9 ^3 j) e- D$ L* o  N5 S
> with(codegen):
' l' t! b* j" l  d3 q5 J+ ?> p:=4*x^4+3*x^3+2*x^2-x;
% ]9 M/ T% }- W2 z4 N4 W& C9 Z
" A0 U- p" O$ o! C> cost(p);
5 m& a: {# _  m6 `6 @, h: t8 X" r 9 n# `+ v- J% c# y  ]$ A
> convert(p,'horner');  #将展开的表达式转换成嵌套形式
  A# T/ G/ C3 ]# p: G ' s$ Y$ v- T) G1 A  Z7 Z2 _9 p
> cost(%);! Z. C" n, ^2 l8 K( S, Z" A2 P
+ u/ |( [# I( H) Y- M9 t7 A) h, k
同样, 把分式化成连分式(continued fraction)形式也可以降低求值所需的计算量. 5 ?- k- e) D* M; _/ i- o) E
> (1+x+x^2+x^3)/p;  m  P2 [  o# `2 J, s

9 C9 i) B" B+ i8 P% U* N> cost(%);
2 ?! @- q/ ?, c: O* }
. M5 T% P  o7 S# o> convert(%%,'confrac',x);5 @2 v$ K) m# ~9 g
" k8 x6 v# [9 Q3 M" U- U. D" E! F
> cost(%);
" k( _; @; l/ h! o: K: {# n3 k , U' i6 \5 e* r7 w! I% I
在某些场合下(比如求微分、积分时), 把分式化成部分分式(partial fraction)也就是几个最简分式的和式的形式也可以简化运算, 但简化程度不及连分数形式.
' a- Q; ]& i. I" ~- k> convert(%%, 'parfrac',x);3 r, w+ u9 c, B% V
7 G0 r) `* z( z  d
> cost(%);2 r. X) D0 o; [2 {
  k' M) b& R4 f( K# Q+ m1 m7 ?' g
而把分数转换成连分数的方法为:
5 j3 v! `0 ?4 n, J& P> with(numtheory):
4 x' L. G6 H/ ]9 _( b3 z> cfrac(339/284);
4 V; ?* q' f8 W6 C8 z ; d( ~; o; _, a7 w# e
2.2.5 函数的映射—map指令1 l" E0 h- K- ~1 y
在符号运算的世界里, 映射指令map可以说是相当重要的一个指令, 它可以把函数或指令映射到这些结构里的元素, 而不破坏整个结构的完整性. 命令格式为:
0 i/ Z/ F( b- x. p7 T2 Ymap(f, expr);      #将函数f映射到expr的每个操作数; L6 D9 _1 A1 y$ N
map(f, expr, a);    #将函数f映射到expr的每个操作数, 并取出a为f的第2个自变量) c0 J0 m% b" X& \8 B
map(f, expr, a1, a2,…, an); #将函数f映射到expr的每个操作数, 并取a1~an为f的第2~n+1个自变量- o/ D- |  `4 k1 W* r! Z' ~
map2(f, a1, expr, a2, …, an);    #以a1为第1个自变量, expr的操作数为第2个自变量, a2为
7 }* d3 j& f6 h2 X第3个自变量…, an为第n+1个自变量来映射函数f/ U5 g3 S8 y$ s
> map(f,x1+x2+x3+x4,a1,a2,a3,a4);
. ~. p' }, {' }$ H+ k9 G( ]
7 W7 j  r9 a; _5 a. U8 A' L! z> f:=x->sqrt(x)+x^2;9 C8 V1 _1 V3 b, I1 D& n

% [" H" P/ w  U' C> map(f,[a,b,c]);$ s# O7 w- B: k- t: q; a

' V7 b7 P6 H" c. V9 T> map(h, [a,b,c],x,y);
2 J2 ~& N. a, c: A  v 1 I: }1 ]7 f& J8 T# \
> map(convert,[arcsinh(x/2),arccosh(x/2)],ln);
9 Q6 u' Q% V5 e( A- a
% `6 k5 G/ E( A+ N> map(x->convert(x,exp),[sin(x),cos(x)]);
/ R+ [0 I/ L- H9 W' n
' W3 t' q" b6 ]* P4 h2 S上式的映射关系可通过下式理解:
! l9 I$ k. T# p- f5 o5 ^# O> [convert(sin(x),exp),convert(cos(x),exp)];: _9 o7 F# v8 G' j
; z- Z+ P, M$ f# W) n
> restart:
# H, q% ~! B- k, vmap2(f,a1,x1+x2+x3+x4,a2,a3,a4);& I0 `  X9 G# h0 G% ?* c, T

1 E  K* i0 Y6 s' O+ t. p. c> map2(max,k,[a,b,c,d]); ! o1 {; ]; _( m8 ], ^
6 }- ~; N" a: E# N6 K, ]5 U9 v) m
再看下面示例:   * L4 _# I' s: e+ J" n3 [2 X/ ~0 }
> L:=[seq(i,i=1..10)];3 A% M5 ?5 `' g; |1 Q$ Y
- D8 e& p. u# H4 a
> nops(L);8 V# r: G. _/ I, j1 l

* Q* `& c$ T3 D' R- C7 a. C% j6 n> sqr:=(x)->x^2;/ [6 k' g* I% p7 t
* y6 N2 O* W& D$ Z( l
> map(sqr,L);
" [3 s) ?* z4 f- ` , k6 h7 N; y1 V1 ?- I
> map((x)->x+1,L);1 ]$ p! _9 T( X' }( q) E
/ i: i6 p) D7 f. K1 W; M
> map(f,L);; Y+ W" t  `! q) X4 D' g' J

- ^2 k2 F; g. u& z4 H> map(f,{a,b,c});
. G& F( z% S2 V# h2 l8 j
, `/ y! C% z5 O2 @6 i> map(sqr,x+y*z);
+ y8 i" l0 X; Q0 t+ m
+ Q5 _8 e! k' U4 e! Z> M:=linalg[matrix](3,3,(i,j)->i+j);& n: K/ [7 [4 ]* O3 b

9 H0 X# B% ~& o3 g> map((x)->1/x,M);
5 W! X0 B+ }# n
+ x2 A# b2 Y; c1 e& M1 g" ^3 求 值
/ [/ s+ W: L8 X/ R$ A3.1 赋值
, H5 Q8 H7 N1 c9 L7 r在Maple中, 不需要申明变量的类型, 甚至在使用变量前不需要将它赋值, 这是Maple与其它高级程序设计语言不同的一点, 也正是Maple符号演算的魅力所在, 这个特性是由Maple与众不同的赋值方法决定的. 为了理解其赋值机制, 先看下面的例子. ' C) v1 c" u4 ]
> p:=9*x^3-37*x^2+47*x-19;8 q. Q$ v) B: z4 h2 W
4 f. w' [5 M* i0 t$ v% @5 M6 `
> roots(p);' Z) B& t- L' E) d/ ^$ l% s$ W! P5 H
4 `8 `2 X# \% B4 D. c6 \/ l. m# V
> subs(x=19/9,p);
) r5 s3 E& I  P
  ^& C' ]* o3 }4 ]: s0 F在这个例子中, 第一条语句是一个赋值语句, 它的作用是把变量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;”这样的简单语句即可验证. ( _/ {! n, Q. b9 B& M, U& {; }
3.2 变量代换
  r  e$ f1 Z! F% h  S2 h在表达式化简中, 变量代换是一个得力工具. 我们可以利用函数subs根据自己的意愿进行变量代换, 最简单的调用这个函数的形式是这样的:   
* Q! U% B0 }0 e. t: d! R( Psubs ( var = repacedment, expression);, r; O  p: |7 P% w# s
调用的结果是将表达式expression中所有变量var出现的地方替换成 replacement.
8 b% l, ^: f( j+ c8 e: d+ A> f:=x^2+exp(x^3)-8;
3 F; K) B7 [9 o* h2 B3 m# L* l- Y , X: G/ z; J7 f( L  \
> subs(x=1,f);
: x* W0 X* `  J0 \+ m; I& ]
1 v/ s+ j1 g- N! N> subs(x=0,cos(x)*(sin(x)+x^2+5));! `( [, x/ G2 I  k: S* [5 J

! i/ \& M* S0 I8 ~    由此可见, 变量替换只得到替换后的结果, 而不改变表达式的内容, 而且Maple只对替换的结果进行化简而不求值计算, 如果需要计算, 必须调用求值函数evalf. 如:   % F! w! x. w9 I* I7 F. `' H
> evalf(%);
! \9 q5 C1 S; U" ^: ~, w$ B
# |% @* W9 Y! N- U! H. m8 H4 \变量替换函数subs也可以进行多重的变量替换, 以两重代换为例:   9 Z- h  z- [) G4 `7 M
subs (var1 = repacedment1, var2 = repacedment2, expression)
2 e$ s. {; t. v- u& p5 I调用的结果和按从左到右的顺序连续两次调用是一样的, 也就是先将expression中的var1替换成replacement1, 再将其结果中的var2替换成replacement2, 把这种替换称作顺序替换;    与此相对, 还可以进行同步替换, 即同时将expression中的var1替换成replacement1, 而var2替换成replacement2. 同步替换的调用形式为:   
% Y& f7 f) m; N6 s' j1 s: w: D% osubs ( {var1 = repacedment1, var2 = repacedment2 }, expression)
: T1 y6 v$ T; H2 \+ E! k下面通过例子说明这几种形式的替换.
6 r) x6 Q+ m5 o* x6 D! a> subs(x=y,y=z,x^2*y);              (顺序替换)9 k5 V( v' |" [% \; N) {! f
  I+ r" q+ A- e
> subs({x=y,y=z},x^2*y);            (同步替换)
% t  ^( u8 G; I; c, G3 A: L0 I2 s
$ O$ @. q. d" e> subs((a=b,b=c,c=a),a+2*b+3*c);   (顺序替换)
: q* H. g1 x# m " ~' T4 W! S( H
> subs({a=b,b=c,c=a},a+2*b+3*c);    (轮  换)0 L$ Q" u& e6 B
3 R2 j: Z) [/ D7 \! A
> subs({p=q,q=p},f(p,q));             (互  换)( @* z3 h. `: r: ~9 P6 e' W
6 h4 ^3 F" d9 y1 C3 Y
3.3 假设机制
' \: E7 S" b8 {: U, a0 g1 e4 M. c! CMaple是一种计算机代数语言, 显然, 很多人会尝试用Maple(或其他计算机代数语言)解决分析问题. 但由于分析问题与处理问题的考虑方法不同, 使得问题的解决存在某些困难. 例如考虑方程 的解. 如果k是实数, 结果显然是x=1, 但如果k是 的复根, 为了保证解x=1的正确性, 必需添加附带条件: 也就是当 时x=1. 这是一个对结果进行正确分析的例子. 然而从代数的角度考虑这个问题时就会把k当作不定元, 此时k没有值, 从方程两端去除k的多项式是合法的, 只要这个多项式不是零多项式即可(这一点是可以保证的, 因为其所有系数不全为0). 在此情况下x=1就不需要任何附加条件. 计算机代数系统经常采用这种分析的观点.
1 {2 L4 H( ]& L2 y- a& ~& b在Maple中, 采用分析观点解决这类带有一定附加条件的实用工具是函数assume, 其命令格式为: assume(x, prop);
$ I' X' i  h" H- Q函数assume界定了变量与变量之间的关系式属性. assume最普遍的用法是assume(a>0), 该语句假设符号a为一个正实常数; 若假定某一符号c为常数,使用命令assume(c,constant); 另一方面, assume可以带多对参数或多个关系式. 当给定多个参数时, 所有假定均同时生效. 例如, 要定义a<b<c, 可以用assume(a<b, b<c); 同样地, 要定义0<x<1, 可以用assume(0<x,x<1). 当assume对x作出假定时, 以前所有对x的假定都将被删除. 这就允许在Maple中先写“assume(x>0);”后再写“assume(x<0);”也不会产生矛盾. , J( _- @+ N8 Q! i( S/ f+ a
> Int(exp(-s*t),t=0..infinity);$ g5 X: s8 W2 l" w
# F3 U: ]! z8 o8 O- z
> value(%);
1 T! t2 h" d% `" nDefinite integration: Can't determine if the integral is convergent.# Q% a+ P" L; ?! j8 h: N, b2 a$ D
Need to know the sign of --> s
/ X- \" t6 E" F/ t4 d- bWill now try indefinite integration and then take limits.$ ~) z  O/ q, R! W

7 M; X3 ~0 \; g" U> assume(s>0);
9 U: B! m) x, b5 u> Int(exp(-s*t),t=0..infinity);
' v; t) D. X/ _" N  ~4 J; t: n# ^ ! E; y( j% [2 P+ C& c1 F
> value(%);
0 b4 u: e. b1 ~2 n
! F0 O  A5 m$ J0 z, g4 {) E1 T3.4 求值规则# v6 @+ {( f5 i; l5 J6 d6 z
在多数情况下, Maple的求值规则设计为做用户期望的事情, 但要做到这一点很困难,因为不同的人在相同的情形下会有不同的期望. 在大多数情况下, 全局变量被完全求值, 局部变量被一层求值. 而由符号' '界定一个暂时不求值的表达式, 单步求值仅去掉引号, 不作计算, 这也是允许取消指定名字或清除变量的原因. 如下例:   
7 D6 N* C* N" B6 L7 R$ U4 T7 i: E> x:=y;
  W: y1 s6 `+ l8 f; Y' H8 O 5 v2 c/ N! M* Y1 J. V
> y:=z;% P/ D4 ]' o0 F1 @. `
# y1 k0 ~( K" F) A1 e9 f4 A9 Y! d
> z:=3;
3 w5 P- ~4 b' p$ K% g ) J; C, J& K# _9 s  X! G! D
> x;4 R* O2 ]$ [7 e/ p
/ V5 ~: E! @1 Y. x7 D2 h' M
> y;' B+ d, W# m* l$ q; C

! {- _5 ]6 E: t' j& O> x:='x';  Y3 T' c' r( R, C
& r; ^( V6 r2 ~& }# B0 H. L
> x;
$ n2 x7 h/ s/ D$ {2 e9 j1 Y$ u $ u  m  T3 q+ w: d/ e1 P9 C' d
> y;
5 _* O( o0 @& H# M* R, U 1 E1 G, H6 d) X* C
对于不同的问题, Maple设计了不同的求值命令. 现分述如下:   7 j: M5 d2 s  p1 U$ A
1) 对表达式求值
6 E0 A1 Q1 a* U' t' o  m- {命令格式: eval(e, x=a);  #求表达式e在x=a处的值  Q3 v& y$ C* q+ U
             eval(e, eqns); #对方程或方程组eqns求值
: W3 z5 h  z* ]1 H' |             eval(e);      #表达式e求值到上面两层+ w2 o. f& Q) H# {; V* t) X. a
             eval(x,n);    #给出求值名称的第n层求值: F, q" C/ g  l7 f1 ]
> p:=x^5+x^4+x^3+x^2+x+73;
' h8 `  c4 \0 {# ~2 u . A4 k( I- q4 r9 V# Y
> eval(p,x=7);- I0 U4 x- N" s3 U

. _. X) P; l: L, ~& H> P:=exp(y)+x*y+exp(x);
$ C1 B+ t! T9 A& O5 L2 I
! A  }6 H$ z" ~9 w' p) U' V% |> eval(P,[x=2,y=3]);/ T8 W4 g7 M$ m0 p- t, b+ N- \, O- k
: P9 g- p6 n+ }" T" i
    当表达式在异常点处求值时, eval会给一个错误消息. 如下:   
# X$ S# b2 P  _* ]: _> eval(sin(x)/x,x=0);
- v! h" I5 Y9 B6 h9 ZError, numeric exception: division by zero( c2 F; B) `& o1 Y
    下面再看使用eval进行全层求值或者对名称几层求值的示例:   ; u; G  Z1 S6 i2 W& b
> a:=b: b:=c: c:=x+1:
8 F% ~) d# Z# J" }+ m4 F" l; b> a;              #默认的全层递归求值" b% U4 x$ D. I* _4 B6 P# b4 i+ V

4 F* w' S4 Q3 p. d> eval(a);        #强制全层递归求值; R. f( m- P$ b  g7 u
  ~& V+ W. G( a. @+ G& `
> eval(a,1);       #对a一层求值/ S& n9 g7 h/ k

; ^6 A/ p- q; q) O( y- r3 z2 E> eval(a,2);       #对a二层求值
; {4 x4 n% q& D! V* B
; @2 E3 C" Q2 e) r> eval(a,3);       #对a三层求值& G# ~0 L8 ?, L% X% q' H

$ f7 S: q! \9 E> eval(a,4);       #对a四层求值3 F4 O' g5 X; f) E5 ^* t. {
) Y( @7 z+ r0 ]% U" O: b% q4 @! D  C( f# H
    2) 在代数数(或者函数)域求值( [5 s8 Y/ L! b/ z' b6 I" {
命令格式: evala(expr);       # 对表达式或者未求值函数求值% t% k1 U5 ~3 Z
             evala(expr,opts);   #求值时可加选项(opts)
3 X8 b) @* }$ f+ D* y/ T# Y* N所谓代数数(Algebraic number)就是整系数单变量多项式的根, 其范围比有理数大, 真包含于实数域, 也就是说任意实数都是整系数多项式的根(如 就不是任何整系数多项式的根). 另一方面, 代数数也不是都可以表示成为根式的, 如多项式 的根就不能表示成为根式的形式. , l, g1 P1 y8 T$ c) t
代数数的计算, 算法复杂, 而且相当费时. 在Maple中, 代数数用函数RootOf()来表示. 如 作为一个代数数, 可以表示为:   5 q7 {& e1 H. W  U' V
> alpha:=RootOf(x^2-3,x);3 [9 i- t: e$ M7 a

7 Z% d# Q4 ~5 ~5 {: u% V5 [> simplify(alpha^2);+ a1 O+ }6 b# c# e$ _
5 H$ A1 Z. e6 @6 V2 T
在Maple内部, 代数数 不再表示为根式, 而在化简时, 仅仅利用到 这样的事实. 这里, Maple用到一个内部变量_Z. 再看下面一个例子,其中alias是缩写的定义函数,而参数lenstra指lenstra椭圆曲线方法:
( ^! w8 U; H, T$ D+ r% }> alias(alpha=RootOf(x^2-2)):
+ o' m- a9 I3 i> evala(factor(x^2-2,alpha),lenstra);; T; l. G; g5 j. p4 u  M  s

4 j; _' s* ]8 p6 n> evala(quo(x^2-x+3,x-alpha,x,'r')); / F$ d! w" J1 [" S  L. V! Z

. k+ E( {0 w' o& I( q7 y> r;
% S+ W+ d# V, j! x: [
: ?' x% h' t: ~) H> simplify(%);
" f  V" L; C% U ' Y1 U: ]6 {3 g
3) 在复数域上符号求值) Y$ X  h+ r9 V: F) U4 M
操纵复数型表达式并将其分离给出expr的实部和虚部的函数为evalc, 命令格式为:% D8 ?' l, V# i3 s8 J
evalc(expr);   . R. B5 I6 h. i4 [9 E5 ]9 w
evalc假定所有变量表示数值, 且实数变量的函数是实数类型. 其输出规范形式为: expr1+I*expr2.
9 E6 L. a, P  R/ E, {: {' ]: \> evalc(sin(6+8*I));
( T$ f9 ~5 s8 L( [- M . Q  s; p* V& u+ v
> evalc(f(exp(alpha+x*I)));6 m  x/ D2 R: X! _7 @/ b5 \

3 P  ?9 Y- i+ A7 r( G> evalc(abs(x+y*I)=cos(u(x)+I*v(y)));
" E8 U- C* x- D; A " v2 r! j6 Q5 ^. [1 c8 K
4) 使用浮点算法求值
) H4 c- Q3 r  y( f1 o( I0 z" H浮点算法是数值计算的一种基本方法,在任何情况下均可以对表达式expr使用evalf命令计算精度为n的浮点数(n=Digits), 如果n缺省, 则取系统默认值, 命令格式为: evalf(expr, n);     
: q" D( c' d2 A$ H> evalf(Pi,50);    * b( y3 ?% Z) {
# c5 X, y; x* O, ^* J
> evalf(sin(3+4*I));   ' g% f6 P: G1 a$ F3 S# ~. W5 M: w
0 ^- P5 Q8 Z6 [  k6 B
> evalf(int(sin(x)/x,x=0..1),20);
, E5 M) L  A+ P% b" W! o& ]& v$ v & T% B/ B+ G' }7 g
5) 对惰性函数求值# _+ O4 u- D; V4 j
把只用表达式表示而暂不求值的函数称为惰性函数, 除了第一个字母大写外, Maple中的惰性函数和活性函数的名字是相同的. 惰性函数调用的典型用法是预防对问题的符号求值, 这样可以节省对输入进行符号处理的时间, 而value函数强制对其求值. 对任意代数表达式f求值的命令格式为: value(f);   + t6 Q# H( ~& }
> F:=Int(exp(x),x);3 w# c; N! h6 a. W$ w7 G
+ x: x- S/ |/ Z2 B
> value(%);
' E6 Z% ]2 Z/ _
& t- b, ~) q9 i0 ~/ \3 {/ S, I> f:=Limit(sin(x)/x,x=0);
; N& V" F  p8 x+ |0 v# _
7 l  `, g) G" G6 |+ a  W> value(%);0 x/ F, ~7 p; l8 A8 s& k: F
! K/ F( `9 k: D. u4 N" |
另外, 将惰性函数的大写字母改为小写字母亦即可求值. 如下例:   3 Y' \! v" \- ^- _, t
> Limit(sin(x)/x,x=0)=limit(sin(x)/x,x=0);" R  f6 k) o; D/ S  ]) r5 A

9 h7 K) a1 _! {2 {# {) \/ ?6 k4 数据结构+ n9 C) _. s; \: u- D8 [
Maple中有许多内建的与FORTRAN、C或Pascal不同的数据结构. 主要的数据结构有序列(sequence)、列表(list)、集合(set)、代数数( algebraic number)、未求值或惰性函数调用、表(table)、级数(series)、串(string)、索引名(index)、关系(relation)、过程体(process)以及整数(integer)、分数(fraction)、浮点数(float)、复数(complex number)等数据结构, 而矩阵(matrix)在Maple中表示为阵列, 是一种特殊的表.
) Z  ~) h$ j( K( M# A4.1 数据类型查询+ {) X" e1 ~9 W8 Q" t3 [9 T9 C
在Maple中, 用whattype指令来查询某个变量的数据类型或特定类型, 命令格式为:
7 Z* v" Q* d! B) w5 K  lwhattype(expr)        # 查询expr的数据类型# _, F  m  |9 X9 G9 C& Z
type(expr, t)           # 查询expr是否为t类型, 若是则返回true, 否则返回false
  R8 w+ g9 V" X4 U# s- @> whattype(12);$ L7 ^9 m0 @6 |' L

5 K& o- y% z8 t& s( N. h> whattype(Pi);9 j" H1 t  A5 h' g' x
" ^8 j' c5 M+ M1 e
> type(1.1,fraction);) G( A$ [, U* t4 I- B
. i/ Z; {- D8 V" `
> whattype(1.1);
9 E1 Y/ e: m% d' [- ~( L ' K; k" p) e$ D' v
4.2 序列, 列表和集合; T7 u: u: U, z$ W/ G4 u2 J  n
4.2.1 序列1 F  u$ ?. g4 t) a4 _, K, h
所谓序列(Sequence), 就是一组用逗号隔开的表达式列. 如:   . m2 _7 L) q4 Y* [
> s:=1,4,9,16,25;6 h, n- v# z: J- Y- O

- p7 M4 }( r' O, V" K9 f> t:=sin,com,tan,cot;* I* k& _) ~( R% @6 e# y
; |: c3 }( C! I- m% v, w
一个序列也可以由若干个序列复合而成, 如:   , ~, @0 P/ b1 q2 x; R
> s:=1,(4,9,16),25;8 w6 Z3 w  a+ m. u( G( q6 \

! Y0 L# W1 _0 J: T2 s> s,s;  l* C  H$ g. k0 d

* M0 f) t( \/ q. c而符号NULL表示一个空序列. 序列有很多用途, 如构成列表、集合等. 事实上, 有些函数命令也是由序列构成. 例如:   2 B7 y# _# a, ?* j4 c
> max(s);
+ r- u2 _  y. d! z/ z: p9 n , l) m9 {# m) S3 T
> min(s,0,s);
2 g, A# |0 v% F: W. M3 @3 L
: g& @6 m) U  A5 g4 O值得注意的是, op和nops函数命令不适用于序列, 如op(s)或nops(s)都是错误的, 如果要使用op(s)或nops(s)前应先把序列s置于列表中. 2 f- K6 P; y; ?* n! I
> s:=1, 2, abc, x^2+1, `hi world`, Pi, x -> x^2, 1/2, 1;5 {& T( S. [& J! I; Q- C) Z) i& a

. C1 R, t, m& D# \% Y) N> op(s);
& ]) d8 E% i* ZError, wrong number (or type) of parameters in function op
3 S/ {7 S; ]! d0 u> nops(s);% j2 v9 ?6 E; }) z5 H7 l
Error, wrong number (or type) of parameters in function nops$ f& r) ~% b9 I, Z
> op([s]);7 H6 t: |: x! ^3 _# R2 D" A

: D% y  z2 \' T- b# B8 ]+ {> nops([stuff]);
0 [' x: N/ O$ ]' ~# H6 `! W* t8 S 2 O: u" t7 ]7 C. G: S
函数seq是最有用的生成序列的命令, 通常用于写出具有一定规律的序列的通项, 命令格式为:   
3 t6 ~5 t; v$ B. [# d+ I4 e. Sseq(f(i), i=m..n);  # 生成序列f(m), f(m+1), …, f(n) (m,n为任意有理数)+ ~. S. P& b+ p
seq(f(i), i=expr);  # 生成一个f映射expr操作数的序列$ s! C0 ^, S% S* a0 B
seq(f(op(i,expr)), i=1..nops(expr));  # 生成nops(expr)个元素组成的序列6 [/ \/ T2 \# w# w/ r/ D
> seq(i^2,i=1..10);/ h3 {: l* F% k8 G, K# ^4 P) i  N
  y$ ^  l8 w! c7 Y. r
> seq(ithprime(i),i=1..20);
+ D! b/ ?6 Z6 ~5 q' I " _1 x) t' p+ i
> seq(i^3,i=x+y+z);' I% n- `" t* t3 n! t

3 O5 q/ L- V$ e: Y2 N5 B' D& c> seq(D(f),f=[sin,cos,tan,cot]);
( o5 [( m0 W4 t8 _  c: a" d+ G
) {3 m3 _' V' ]9 _> seq(f(op(i,x1+x2+x3+x4)),i=1..nops(x1+x2+x3+x4));
; j( x2 c* _6 d2 m 0 V- G* p8 `/ k, K, V
获得一个序列中的特定元素选用操作符[  ], 如:   ' `* q, l: N* ?# T! t4 u+ c( ?
> seq(ithprime(i),i=1..20);" U  G7 F, b4 O; x" x- z. V
* q, z5 w% Q% }. \3 e2 ^: \* H
> %[6],%[17];8 E/ _+ B, b" C3 K, X

" Q5 J8 ^) K/ L2 b- X4.2.2 列表
& ?# @& d: y1 N; M列表(list), 就是把对象(元素)放在一起的一种数据结构, 一般地, 用方括号[  ]表示列表. 如下例:   
0 g- E  P4 @' _% ?> l:=[x,1,1-z,x];1 f" i! x; k9 r9 h' X1 n: A
" P3 d& a: B& p6 l* I
> whattype(%);
3 Y3 U1 R/ `3 f
& A: t/ A: d5 ?5 O# H& v. ^+ H空列表定义为[ ]. # [# G1 Z) ?) f  C
但下述两个列表是不一样的, 因为对于列表而言, 次序是重要的:   ) J1 j. K6 E1 O5 f, `
> L:=[1,2,3,4];
3 {$ Z# }4 D$ F4 Q ( U2 S& {1 f4 T- J  Q: v% n
> M:=[2,3,4,1];2 Y- E: @7 m1 `6 n
/ _- }; x( z, z! I6 q. Y
4.2.3 集合
- o/ A5 q: P5 O. T7 }& E3 x集合(set)也是把对象(元素)放在一起的数据结构, 与列表不同的是集合中不可以有相同的元素(如果有, Maple也会自动将其当作同一个元素), 另外, 集合中的元素不管次序. 一般地, 用花括号表示集合.
& s, }3 a: j# p# v/ E' o> s:={x,1,1-z,x};3 d% B" T( J& z  o5 _2 I
5 _1 Z$ i* _; R# D& |. T" H+ P6 k# W
> whattype(%);
" L  @. \, K* |& o
2 w0 o- y9 T* D2 ~: l& F空集定义为{ }.
7 G0 N4 S5 b( c, ~" P% ^函数nop返回列表或集合的元素数, 而op则可返回其第I个元素. ; S* b, Q' ^% S% a% }
> op(1,s);/ {7 F9 @9 J: S! ]2 g' m

6 P1 Y. e7 ^$ ?9 J6 m; x> s[1];4 N7 l3 F6 W0 Q
( y6 q: t2 L  Z- l, h
> op(1..3,s);
, R0 f1 b4 T5 Y3 Q& @8 t 3 n8 X! A8 K3 E* D6 r
> s[1..3];" E0 f3 d! b+ v: q6 r

3 S- i( k1 o1 ?) I函数member可以判定元素是否属于一个列表或集合, 如果属于, 返回true, 否则返回false.
$ e& [  J7 \/ |5 j7 V> member(1+x,s);
! ?+ @% t% m! y( P# C) j
! }! S  z& F3 e! ~7 d* c  h9 Q可以通过下述方法在列表中增减元素:   # T7 @$ l7 |4 \
> t:=[op(s),x];
. Q( K  o% Y% P, @! P& i , r4 m' g) H* F. o8 G" g* \
> u:=[s[1..5],s[7..nops(s)]];
# i) K* m: W, Y% r+ F
1 Z2 _" C% V5 x6 G+ m3 f6 U2 XMaple中集合的基本运算有交(intersect)、并(union)、差(minus):   
- X- \: d+ X, s2 \) |3 Q> A:={seq(i^3,i=1..10)};B:={seq(i^2,i=1..10)};* `. [6 I! b# l2 f# E

1 w( M& I' [5 _" ?8 d9 T
  L. T3 u" b/ I% l) U3 y> A intersect B; ; r( e9 c  B. |' X! @/ B

8 H+ R. g8 i( M& Y6 h> A union B;
$ I7 y. Y7 [% Z 2 {3 X+ w: R& P/ W1 m
> A minus B;& o& N/ G9 u% W0 p% h6 v

: ]$ V0 l/ P, a; n3 o4.3 数组和表" q9 L1 L4 t# w: @4 h, H
在Maple中, 数组(array)由命令array产生, 其下标变量(index)可以自由指定. 下标由1开始的一维数组称为向量(vector), 二维以上的数组称为矩阵(matrix). 数组的元素按顺序排列, 任意存取一数组的元素要比列表或序列快的多. 区分一个数据结构是数组还是列表要用“type”命令.
  [5 I* U$ [+ u4 o& ~; a& C    表(table)在建立时使用圆括号, 变量能对一个表赋值, 但一个在存取在算子中的未赋值变量会被自动地假定是表, 表的索引可以成为任意Maple表达式. 表中元素的次序不是固定的. 1 N& B7 g) K2 i; ?, r
> A:=array(1..4);
" n% c9 J# S% u
8 G* F# y0 m  d# b5 a' _4 J5 V> for i from 1 to 4 do A[i]:=i: od:" r  C$ `% v/ z' e
> eval(A);. Y4 ~0 U/ S1 ]# v3 T
. X9 ~  f) N* Y' P8 F. Q
> type(A,array);
6 ?, T  ~! ^6 A. x# }3 e8 N1 c
. D; ^3 |9 H* N8 T8 w; Y/ }" P> type(A,list);" C1 ^7 L0 E6 H% c
& [5 f$ [0 u6 J4 c& P1 b
> T:=table();
2 F3 t# S+ ]) A2 e3 c+ ^* X  u. H
' i7 n5 y; v) K% V> T[1]:= 1;. Q* \( {$ `  E$ a* K
  U$ s5 o$ f' E, E7 X" {/ G" }
> T[5]:= 5;
' |/ @7 O+ V7 d/ ~8 t
. G+ s: L" u3 S3 e& w% m* Y8 u> T[3]:= 3;3 e" o# S6 t( v

; {$ L6 p# {" r' t4 J6 C/ g% B> T[sam]:=sally;
  h" g+ B0 Z3 s
5 I8 E( a5 J: ], J/ J> T[Pi]:=exp(1);
0 Q6 u3 Z& W' N' O1 w; k, |
2 t1 j. F5 u* d* H2 |8 z; }% G  I> x:='x';
+ y; Q4 |2 [; W # ~' o. j4 r4 u/ @1 D
> T[(1+x+x^3)*sin(x)] := 0;/ T  g$ g5 M) `' c

; t2 M9 Q% g+ y% T> eval(T);0 V- b4 I* ^8 _% o+ G- Y

5 U2 K( }% y( _2 F0 z" G7 G* \> T[3]:='T[3]';
7 D. N+ E0 Y4 W. z* ~9 y5 a
. k% T' }0 \4 X" y3 P1 v+ A% F+ K6 W> eval(T);2 A; B2 Y  M; g
2 w4 n. S9 E( |' Y; Q" `' M2 x
4.4 其他数据结构- f% n/ F, N7 G- W( i
串在Maple中是很重要的, 他们主要用于取名字和显示信息. 一个Maple的串可以作为变量名, 它们中的大多数是简单的、不需要加引号的串, 但是如果变量名中包含/. 例如“diff/T”则必须把变量名用引号括起来. 1 p) P7 z, e( b' h: p% s8 m
索引名是像Database[1,2,drawer]或A[3]这样的对象, 在使用索引前不需要直接建立表, 如果不得不做, Maple会自动建立表. 索引名通常被用于矩阵和向量. 为了保证Maple建立表的正确次序, 建议在赋值前直接建立.
9 F" `: t. \: R4 |- M8 h> x:=T[3];" c. W" ~  z) ^; g0 A4 M+ o; r
( W( |; g  O( [" y! S) z* A. A3 \3 h
> eval(T);
" _$ B/ o2 z* {, d6 }) L6 N
! a: n; F0 ?. ~1 K( A> T[5]:=y;0 E% r: K* e  f4 a8 ]& i: T) T9 L

3 W+ F5 O5 |1 n: v> eval(T);) t5 |6 Z5 G5 Y' E# G1 q& X

7 O/ {+ i8 l5 @5 p9 ~由此可见, Maple并不直接建立T的表, 直到给T[5]赋了值.     3 Z7 z3 G1 E, [" [! D/ o
数值数据结构(整数、分数、有理数、浮点数、硬件浮点数和复数等)在它们的使用中是大量透明的. 浮点数是有传染性的, 这意味着如果数值结构中有一个是浮点数, 则整个结构自动转换为浮点数. 0 c) s0 E6 P& b  L' u& C4 T9 |
4.5 数据类型转换和合并
! l1 f, V$ w, E1 |; D$ uconvert是一个功能强大的类型转换函数, 它可以实现列表和数组的类型转换:   
. ]+ x. }5 t7 i; Y# n, N> L:=[1,2,3,4];
% t4 x! z, x* l2 p+ z# E
. ]- f# i# r8 V: w* M( p> type(L,list);2 c9 U6 q% O. ^. V  q" Y" o3 R

$ `9 b4 Y# a. n> A:=convert(L,array);
9 _4 H. G9 J4 T# J- K1 g& ] " {; ~( m+ X; o: n0 ^$ q5 X" A
> type(A,list);7 r4 e: }( j, G

( Z" J- v; q8 n- U; [0 f0 B> type(A,array);" R/ f$ V- G" z3 T" I6 L# D* b

6 S) t& R0 r, N1 G% N* j另一个有用的函数zip则可把两个列表或向量合并:   
1 B  I. w3 k8 W4 N>L:=[seq(i,i=1..10)];; g$ ^1 O0 O1 N- j& s

( L+ b# L& |5 _: T, n. P! i4 n> Sqr:=(x)->x^2;1 F1 {1 k2 [+ l$ u" s0 i
  w" [1 c4 g! I: F0 m
> M:=map(sqr,L);. G. A3 W& S6 r! A6 |( O

  ^  l' N* U) _! E' T7 A' k> LM:=zip((x,y)->[x,y],L,M);
$ D* y; S& H/ P: N9 V) k. z
' y* r- z* M/ z> map(op,LM);
7 c- Q1 Q: {- t2 R : z9 [0 T: [9 o5 d9 H* L. W! q
5 Maple高级输入与输出操作$ @  s3 H" R) J3 f& S; A
Maple提供了良好的接口来编辑与计算数学式. 许多时候, 我们可能需要把Maple的运算结果输出到一个文件中, 或者在一个文本编辑器里先编好一个较大的Maple程序, 再将它加载到Maple的环境里. ' u* p" E5 [( h
5.1 写入文件
8 @& W' s  t3 E2 l% g" n2 f! q5.1.1 将数值数据写入到一个文件
# M! W7 E) W8 p$ i如果Maple的计算结果是一长串的数值串行或数组, 而想把它写到一个文件时, 用writedata命令. 4 A) K( P# }( q5 W. `% d
若Maple的计算结果data为集合、矩阵、列表、向量等形式时, 将其写入名为filename的文件时命令格式为: writedata("filename", data);
! e8 q1 }" [# x1 v; q% b> with(linalg):
" b5 U& r. ?4 \$ c/ B: B, |: J( r> M:=matrix(3,3,[1,2,3,4,5,6,7,8,9]);" [- m& c$ Y6 k. [
0 T- n2 Z. G* d8 I, P; x
> writedata("e:\\filename.txt",M);% M1 Y" R4 O, u$ ^/ V7 i" |) z. N
而将结果附加在一个已存在的文件后时,使用命令: writedata[APPEND]("filename", data);
) }) T: |+ e8 {> W:=matrix(2,2,[1,2,3,4]);8 m3 e  w' H9 ?" R  x# W
( m2 j! c6 J5 C, o- D. U# y
> writedata[APPEND]("e:\\filename.txt",W);7 w# g1 K# v( R7 R4 f' v
需要注意的是, 这里的APPEND是必需的, 否则W结果将会覆盖M结果.. t% ]0 \! ?* @5 c# W4 ^
另外, 若想将结果显示在屏幕上时, 用命令: writedata('terminal', data);9 d& p4 ]4 J0 m1 }/ j, x; D" A
> writedata[APPEND]("e:\\filename.txt",W); # s$ n) v* @, k& _
> writedata('terminal',M);% f$ o% k6 l* M* U8 u/ f0 d, z; |
1                   2                   3           
# b! h$ X$ N+ ]; O& P9 P4                   5                   6           & u0 {7 @0 k- B$ w
7                   8                   9   
5 Z  N( _9 _0 K# b1 A, n  N* ~# G5.1.2 将Maple语句写入一个文件
: B. y  m# G3 n  C$ |* A如果所要写入文件的是表达式、函数的定义或者是一个完整的程序, 则使用命令save, 写入一个或多个语句的命令格式分别如下:0 R4 l3 s( ~8 O; |- |  ?, g8 A( J
save name, "filename";
" P1 e& _( C9 V3 hsave name1, name2, …, "filename";
+ Z+ o, c% i2 r* K/ B0 q4 H若filename的扩展名为.m, 则Maple会以内定的格式储存, 若扩展名为.txt, 则以纯文本文件储存. 以内定的格式储存的文件作纯文本编辑器无法读取, 但在大多数情况下, 它会比纯文本文件的加载速度更快, 且文件容量小.
# `8 n5 y" l5 f# G: A( p> myfunc:=(k,n)->sum(x^k/k!,x=1..n);: L7 p- C, {5 K1 Y
7 }% f/ f2 A! E0 z% n
> myresult:=myfunc(6,8);
& A. K9 n  e* `7 e# y! F# `+ b
1 d6 V9 A( s0 Q, [1 |> save myfunc,myresult,"e:\\test.m";
6 z* t* a+ Z, v! ^+ A: _5 T调用已存m文件用命令read. 试看下述实验:
* ^0 v% H$ {- A* t" _6 C> restart:" D) x+ \- i3 V
> myfunc(6,8);' F# t! N5 \( Q9 X

, I8 n' E. I) T& Y) W9 m; L> read "e:\\test.m";$ P3 u  U& s: b' c3 Q6 F1 b
> myfunc(6,8);
# i) F& G+ o/ a+ @+ v! U$ ?
: h2 C# L9 O/ H' |> myresult;% @) G2 G1 s) G  U7 \

6 u: {  o7 s- p" o8 M0 R, X    而存为txt文件时则将整个语句存为一个文件:# v3 ~4 U8 r: u, q/ l* {) \9 ^
> save myfunc,myresult,"e:\\test.txt";; V7 L: B) Y, \& i3 L$ [
> restart: read"e:\\test.txt";
* [9 h: I' \9 P1 C, S 3 t# A" }3 R: G4 g

2 ?9 j5 N; j. p) v1 s# X" z5.2 读取文件
5 ]+ |: n4 g( M/ x: W' r1 O! }在Maple里最常用的两个读取文件的命令, 一个是读取数值数据, 另一个是是读取Maple的指令.4 d, G4 b1 i$ T4 r/ o4 H
5.2.1 读取数值数据
$ j; F* F! q$ A4 {+ j8 k如果想把大量的数据导入Maple里进行进一步的运算或者要运用大量的实验数据在Maple环境绘图时, 可以用readdata( )命令完成./ d" \& v' F: \5 r6 i- |
从filename文件里读取n行数据时使用命令: readdata("filename",n);" C$ I+ S' D0 l& K
以指定的格式读取数据时使用命令: readdata("filename",[tyep1,type2,…]);* [$ p' x3 t6 ]; d1 g2 O- n0 B# ^
> readdata("e:\\filename.txt",3);
' c$ j9 P$ S2 d. Q# e1 y
. t% c0 u4 m, O# U0 n' V    读取filename的前三列, 第一列为整数形式, 第二、三列为浮点数形式:3 T$ F! T9 a0 b6 Y
> readdata("e:\\filename.txt",[integer,float,float]);7 D- ]: ?, P+ f3 f' l

) E1 r! X4 [$ y7 W8 }0 Y. @下面再看一个运用大量的实验数据在Maple环境绘图的实验:
1 a- i, S5 U- `0 K8 M$ P' `> mypts:=[seq([x/1000,cos(x^2/100000)],x=1..1000)]:
, w* h& G' g; P6 G- F* L# c' A> writedata("e:\\data.txt",evalf(mypts));, N0 b! ~& R, c9 b! x' A
> dots:=readdata("e:\\data.txt",100):% m& u4 ^) I: B( N
> nops(dots);
, e" h; m' L+ i
; Z+ V% C: Y# O5 P* R$ s> dots[1..4];
7 t5 D: i, y& D5 ^9 H4 J / @4 ^5 U& K! ]7 }5 F( _( n6 H
> plot(dots,style=line);+ b3 z, y; T2 G
, P: `0 u! {- K8 X3 y! r
5.2.2 读取Maple的指令+ W7 Z& K( O2 R% Z- K9 y
在编写程序时, 在普通软件中先编好程序再将其读入Maple环境中常常比直接在Maple中编写更为方便. 如果要将程序代码或Maple指令加载用read命令:. W% W" D9 B: f
read "filename";( _+ H' `# `- {; F  h( ~
如下例:
+ l7 x  c* u7 {: X1 u) N& t3 a/ J; _> reatart:
: ?, x8 X  W/ E( G9 g> myfunc:=(a::list)->add(i,i=a);
; c. W) b4 U: |; A. c3 Z / Z# g) K4 }) d5 {% S: |: d
> avg:=(a::list)->myfunc(a)/nops(a);* o+ C. R9 m  e5 F
) U' t, s5 S: \
> save myfunc,avg,"e:\\function.m";
. F  i0 n& E9 L2 s8 a> restart:, y5 ~3 G! O9 I5 H6 i
> read "e:\\function.m";
& \/ ]9 n) x& F3 J0 F/ P> myfunc([1,2,3,4,5,6,7,8,9]);# l) w1 Z5 f7 C2 I
- A7 C- \2 `- i1 a
> avg([1,2,3,4,5,6,7,8,9]);
1 f# l8 l' i  e' {8 o! G  m  n . K3 u% |& q% [
5.3 与其它程序语言的连接
- y7 `9 V- ^8 k: J7 h3 r5.3.1 转换成FORTRAN或C语言
; O9 U6 G% i/ h8 \调用codegen程序包中的fortran命令可以把Maple的结果转换成FORTRAN语言:
2 V" O  h  e% n& t1 t/ F0 F> with(codegen,fortran):4 j3 h. T5 ?1 g+ C$ O
f:= 1-2*x+3*x^2-2*x^3+x^4;
) s; |) s. _) G3 k( Y 8 {' k0 o6 e7 x8 E8 L2 A: E2 C4 i
> fortran(%);! s9 s6 G+ E2 o/ \$ d! b0 ~' O9 ]
      t0 = 1-2*x+3*x**2-2*x**3+x**4- l; `  F+ ]/ ^- }- O% Y* I
> fortran(f,optimized);3 x7 M8 f) U+ ^4 G0 b4 k7 L4 y; ^
      t2 = x**28 Q7 _' g4 ]8 E1 G$ d3 Q/ c
      t6 = t2**23 W; g' z: k( u& z
      t7 = 1-2*x+3*t2-2*t2*x+t6+ z4 Q' {$ ]9 O/ j
> fortran(convert(f,horner,x));
% A. y1 K! q* n      t0 = 1+(-2+(3+(-2+x)*x)*x)*x' f1 E: n- }5 M2 _' w& \
而codegen程序包中的C命令可以把Maple结果转换成C语言格式:
8 K2 a4 M6 d; V8 Q9 t/ C> with(codegen,C):
- a" M* g2 L; O: I; Z4 Af:=1-x/2+3*x^2-x^3+x^4;
* L$ Y& r1 \% _% g
: t9 s5 `6 ?% [+ r( D( ~> C(f);7 r) a/ Q8 p! e- p/ Q
      t0 = 1.0-x/2.0+3.0*x*x-x*x*x+x*x*x*x;7 E$ ~4 L& ?4 }$ {) k
> C(f,optimized);
( j+ T6 G5 z$ Y3 y; Z      t2 = x*x;* G: D" d9 r4 {, j
      t5 = t2*t2;
' k% ]) L0 E9 o! F8 w      t6 = 1.0-x/2.0+3.0*t2-t2*x+t5;
9 b- f4 W* q) a! P' yoptimized命令表示要对转换的表达式进行优化, 如果不加此可选参数, 则直接对表达式进行一一对应的转换.
1 |% c8 y( B8 ?, M9 E+ c' L/ X7 x5.3.2 生成LATEX
) h+ |6 ^8 @- x; {( C% ^" Z+ K$ AMaple可以把它的表达式转换成LATEX, 使用latex命令即可:
9 z, ]! B$ E4 b> latex(x^2+y^2=z^2);1 o7 d% ^6 N/ O% S( G4 @$ ^: v. |' U
{x}^{2}+{y}^{2}={z}^{2}
  y! P6 o8 k, Q5 Q    还可以将转换结果存为一个文件(LatexFile):- I/ R, S5 i" H2 y$ [  h
> latex(x^2 + y^2 = z^2, LatexFile);
* |2 x. L: K, \- I' g8 }; j    再如下例:. C% u- O& w9 t
> latex(Int(1/(x^2+1),x)=int(1/(x^2+1),x));  o% D3 i* ~3 i, f* w, N+ Y' G
\int \! \left( {x}^{2}+1 \right) ^{-1}{dx}=\arctan\left( x \right)
& k( |6 V( r0 V8 p
; ]7 f3 g$ S9 a1 o8 o! i
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年!
    3 I2 Q" d+ Z; z: y: w; V* u; z) [/ W5 b2 B/ H% u

    0 G% @$ k$ N7 n6 D" \
    回复

    使用道具 举报

    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, 2024-4-26 07:47 , Processed in 0.916322 second(s), 99 queries .

    回顶部