QQ登录

只需要一步,快速开始

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

maple基础

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

1

主题

5

听众

4

积分

升级  80%

该用户从未签到

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

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

5 t& E. \# r! U3 r. |; Y$ N0 O. J
1 r4 G8 |) S. h3 Q* o1 R9 o # e) P9 o4 a3 N" K9 T5 _- c

3 R. o2 `! }5 _7 \; d
2 V1 b9 C. }* _( C 1 d7 Q9 L2 F9 f- T

( m: D/ ]) D! r! H' ~1 X- @ # ?1 v+ A) f% I' n) @

4 r) U& d+ F; A 5 S: g, B* W! G' C' y5 m3 v( y7 K3 D
! d# e( o5 n! d0 \; [* J

$ \) T0 a4 Y, v' Z5 O; Qalpha        beta        gamma        delta        epsilon        zeta        eta        theta        iota        kappa        lambda        mu
3 ~$ a1 F3 z' r  r* Y: Y
! |6 ~7 A6 ~  d% ?* G, V
% A8 c* t+ @! Z6 z
. K. n# i/ U) ]$ t2 _4 o + ~+ f, t- L' E4 P! g  L

1 w+ r/ }) x- e3 w' I! M
+ |5 Q$ D, @- }# T) @% r9 y 6 G. v2 F& j& }7 M

! h, `* [; Q8 W+ s- K( ]9 q% t* Q
4 ~7 u- a6 o8 Y5 o1 {) A; L % b- z1 R+ b8 ]
; G' v5 y5 ]5 B0 S& N6 `

8 c9 ^1 p0 E9 F8 N& q* A
, B/ y$ c+ s5 ]3 }nu        xi        omicron        pi        rho        sigma        tau        upsilon        phi        chi        psi        omega
) Z! Q- O/ x5 u- I" D% ]4 C有时候为了美观或特殊需要,可以采用Maple中的函数或程序设计方式控制其输出方式,如下例:$ @  D4 t9 _0 k' y2 A- s
> for i to 10 do
7 j$ ~9 P3 F6 }5 lprintf("i=%+2d and i^(1/2)=%+6.3f", i, eval(sqrt(i)));6 _+ n6 x* X( ^0 X" I  n  s" c
od;
9 W2 |! S" u8 C. ~% f! hi=+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  g5 f8 A% A' f5 V) {
+2d的含义是带符号的十进位整数,域宽为2. 显然,这种输出方式不是我们想要的,为了得到更美观的输出效果,在语句中加入换行控制符“\n”即可:5 V+ E& ?. \! i- E( o# Y
> for i to 10 do 9 o" G% T. A7 k( y* W
printf("i=%+2d and i^(1/2)=%+6.3f\n", i, eval(sqrt(i)));
( \8 @# F0 R& Rod;
/ R$ i1 i- l2 c$ H  F: E% L# hi=+1 and i^(1/2)=+1.0005 A$ ~( z, X3 n- m) l
i=+2 and i^(1/2)=+1.414
0 B8 R' r9 @( Zi=+3 and i^(1/2)=+1.732( E$ z4 I7 @- l" d. k7 s  U
i=+4 and i^(1/2)=+2.000/ T  T3 Z7 Q: r
i=+5 and i^(1/2)=+2.236
6 W* t7 ?. ~' V  J4 K9 r# ki=+6 and i^(1/2)=+2.449* y8 j  X# ^2 z% W
i=+7 and i^(1/2)=+2.646: ]* \( H7 |% l  L4 V6 f
i=+8 and i^(1/2)=+2.828
6 o: a" e: `; ?9 j. t9 xi=+9 and i^(1/2)=+3.000
5 H6 {5 G* v- q/ f% x8 L' u4 M2 oi=+10 and i^(1/2)=+3.162
& N# j8 O  l+ m. l1 c9 b7 W& v再看下例:将输入的两个数字用特殊形式打印:
: Q% |6 z$ H1 X2 Q: Z" g> niceP:=proc(x,y)
8 e4 \9 ]# y; r1 I% M* g0 b' Eprintf("value of x=%6.4f, value of y=%6.4f",x,y);2 n* Z. w1 R) U% i" j# P
end proc;
8 M  l3 Y9 T% @/ a
9 e. L7 w. b/ W9 u> niceP(2.4,2002.204);+ ?  c1 d" j% T& y6 M9 S. t8 {
value of x=2.4000, value of y=2002.2040
/ F0 t* b2 Q2 b! [2 Z. E, S1.4 Maple联机帮助
3 E! T$ O1 A- X4 I9 p( A0 B学会寻求联机帮助是掌握一个软件的钥匙. Maple有一个非常好的联机帮助系统, 它包含了90%以上命令的使用说明. 要了解Maple的功能可用菜单帮助“Help”, 它给出Maple内容的浏览表, 这是一种树结构的目录表, 跟有…的词条说明其后还有子目录, 点击这样的词条后子目录就会出现(也可以用Tab键和up, down选定). 可以从底栏中看到函数命令全称, 例如, 我们选graphics…, 出现该条的子目录, 从中选2D…, 再选plot就可得到作函数图象的命令plot的完整帮助信息. 一般帮助信息都有实例, 我们可以将实例中的命令部分拷贝到作业面进行计算、演示, 由此可了解该命令的作用. 0 ^  c* u3 c% Z+ p' n7 G6 @) s
在使用过程中, 如果对一个命令把握不准, 可用键盘命令对某个命令进行查询. 例如, 在命令区输入命令“?plot”(或help(plot);), 然后回车将给出plot命令的帮助信息, 或者将鼠标放在选定的要查询的命令的任何位置再点击菜单中的“Help”即可. % G- x( P0 y# z8 x9 l7 G7 l1 `, x6 v
2  Maple的基本运算* {9 M. D# [$ M  @6 G0 [
2.1 数值计算问题  Z+ e+ K% F- @; J* l" K9 ?# }
算术是数学中最古老、最基础和最初等的一个分支, 它研究数的性质及其运算, 主要包括自然数、分数、小数的性质以及他们的加、减、乘、除四则运算. 在应用Maple做算术运算时, 只需将Maple当作一个“计算器”使用, 所不同的是命令结束时需加“;”或“:”.
) C" O" t. W7 |, x( D6 s5 T在Maple中, 主要的算术运算符有“+”(加)、“–”(减)、“*”(乘)、“/”(除)以及“^”(乘方或幂,或记为**), 算术运算符与数字或字母一起组成任意表达式, 但其中“+”、“*”是最基本的运算, 其余运算均可归诸于求和或乘积形式. 算述表达式运算的次序为: 从左到右, 圆括号最先, 幂运算优先, 其次是乘除,最后是加减. 值得注意的是, “^”的表达式只能有两个操作数, 换言之,  是错误的, 而“+”或“*”的任意表达式可以有两个或者两个以上的操作数.
+ i2 a% s% e" \& G- f/ e! |Maple有能力精确计算任意位的整数、有理数或者实数、复数的四则运算, 以及模算术、硬件浮点数和任意精度的浮点数甚至于矩阵的计算等等. 总之, Maple可以进行任意数值计算. & v" r6 N8 @  w1 X9 C+ ~
但是, 任何软件或程序毕竟只是人们进行科学研究的一种必要的辅助, 即便它有很多优点, 但也有它的局限性, 为了客观地认识数学软件、认识Maple, 下面通过两个简单例子予以说明.
& o9 }: K  d0 E' {! z: t. S; H1 c第一个简单的数值计算实例想说明Maple数值计算的答案的正确性:   
8 T* T0 y2 b# H. @. o$ D. b% B8 _. D> 3!!!;
' c3 p* C+ W/ I3 L' ~4 v% W2601218943565795100204903227081043611191521875016945785727541837850835631156947382240678577958130457082619920575892247259536641565162052015873791984587740832529105244690388811884123764341191951045505346658616243271940197113909845536727278537099345629855586719369774070003700430783758997420676784016967207846280629229032107161669867260548988445514257193985499448939594496064045132362140265986193073249369770477606067680670176491669403034819961881455625195592566918830825514942947596537274845624628824234526597789737740896466553992435928786212515967483220976029505696699927284670563747137533019248313587076125412683415860129447566011455420749589952563543068288634631084965650682771552996256790845235702552186222358130016700834523443236821935793184701956510729781804354173890560727428048583995919729021726612291298420516067579036232337699453964191475175567557695392233803056825308599977441675784352815913461340394604901269542028838347101363733824484506660093348484440711931292537694657354337375724772230181534032647177531984537341478674327048457983786618703257405938924215709695994630557521063203263493209220738320923356309923267504401701760572026010829288042335606643089888710297380797578013056049576342838683057190662205291174822510536697756603029574043387983471518552602805333866357139101046336419769097397432285994219837046979109956303389604675889865795711176566670039156748153115943980043625399399731203066490601325311304719028898491856203766669164468791125249193754425845895000311561682974304641142538074897281723375955380661719801404677935614793635266265683339509760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
- \$ W8 b3 ?" `- k8 b( Z+ L# i1 ~上述运算结果在IBM PC机(1G, 128M)上计算只需要0.01秒, 得到如此复杂的结果(1747位), 一个自然的问题是: 答案正确吗?
# p: ~% k& H: {/ _为了回答这个问题, 我们借助于数值分析方法, 由Stiring公式
# _( {" i' C1 r& O. i- S 5 r. g8 d* f3 h" e5 `. |3 N
可得:  , 前三位数字与Maple输出结果相同, 且两者结果均为1747位. 另外, 在720!的计算中, 5的因子的个数为:   
: i3 q4 r- W, b4 y, h" x
) @0 @$ Q# Y6 G% x/ }# o/ s/ ?这些5与足够多的2相乘将得到178个0, 而Maple的输出结果中最后178位数为零. 由此, 可以相信Maple结果的正确性. - h8 D6 w& C2 V% Y
另一个例子则想说明Maple计算的局限性:   
1 l# a- ?; i8 }) N+ Y  ; Q, {% P+ U$ ], j- n# [
Maple在处理问题时, 为了避免失根, 从不求算术式的近似值, 分数则化简为既约分数. 因此, 在Maple中很容易得到:   ; m  b7 f; |: A3 U5 x4 Y

  P* ~( `* |9 M5 I显然这是错误的. 这一点可以从代数的角度予以分析.
4 E* h; @1 S0 ?. Y3 g4 |! Y+ R不妨设 , 则 , 即 , 显然 有3个结果, -2是其实数结果. ) W" O% q! L2 h. K: y
另一方面, 设 , 则 , 即:2 V* b) u) R' s& Z
0 M( C& m$ W$ E
显然 有6个结果, -2、2是其实数结果.
, T+ U* [8 q$ p# C3 ~& o3 W4 y- b这个简单的例子说明了Maple在数值计算方面绝对不是万能的, 其计算结果也不是完全正确的, 但是, 通过更多的实验可以发现: Maple只可能丢失部分结果, 而不会增加或很少给出完全错误的结果(如上例中Maple的浮点数结果皆为 ). 这一点提醒我们, 在利用Maple或其他任何数学软件或应用程序进行科学计算时, 必须运用相关数学基础知识校验结果的正确性. ( p" B' {7 z: o  X0 s6 B! y: D! ^
尽管Maple存在缺陷(实际上, 任何一个数学软件或程序都存在缺陷), 但无数的事实说明Maple仍然不失为一个具有强大科学计算功能的计算机代数系统. 事实上, Maple同其他数学软件或程序一样只是科学计算的一个辅助工具, 数学基础才是数学科学中最重要的. 9 A# `! D. u# Y) j
2.1.1 有理数运算+ L4 F( W; _' x4 ^9 K3 {
作为一个符号代数系统, Maple可以绝对避免算术运算的舍入误差. 与计算器不同, Maple从来不自作主张把算术式近似成浮点数, 而只是把两个有公因数的整数的商作化简处理. 如果要求出两个整数运算的近似值时, 只需在任意一个整数后加“.”(或“.0”), 或者利用“evalf”命令把表达式转换成浮点形式, 默认浮点数位是10 (即: Digits:=10, 据此可任意改变浮点数位, 如Digits:=20).
; n4 ~+ n( z1 z: t> 12!+(7*8^2)-12345/125;5 p+ m6 P0 @4 O  @" d! I% `
- s4 m4 H1 n2 P9 F1 o
> 123456789/987654321;$ ]& f* G9 \9 R# u+ F' Z% J% x
% z# w& u. l) E+ S+ m
> evalf(%);
3 h' i/ k7 v! W 9 |4 X% G* s7 F* e. g
> 10!; 100*100+1000+10+1; (100+100)*100-9;0 D% \/ Q( f- E) E2 i9 O: \

4 U/ m# a- h$ U$ P2 n+ u+ ]4 ~ ( g- r# I& k1 ~: J: [
4 M4 f4 {8 i/ Q1 l  V) g# e. V/ S& [
> big_number:=3^(3^3);
7 M0 z9 W9 x  }: f8 c& w* b2 T9 @9 i
- H' K. v, c4 ]6 @> length(%);  O8 [6 G) ?1 a

9 e0 P$ D. f; x5 a- s上述实验中使用了一个变量“big_number”并用“:=”对其赋值, 与Pascal语言一样为一个变量赋值用的是“:=”. 而另一个函数“length”作用在整数上时是整数的十进制位数即数字的长度. “%”是一个非常有用的简写形式, 表示最后一次执行结果, 在本例中是上一行输出结果. 再看下面数值计算例子:   / A  r2 b! X8 X* _4 H  }) W6 O
    1)整数的余(irem)/商(iquo)0 y7 A" B9 M7 L2 S6 S. `  P+ d# w
命令格式:   
2 w# b+ z0 N3 I5 J) Lirem(m,n);        #求m除以n的余数& O5 G& L( D: N
irem(m,n,'q');    #求m除以n的余数, 并将商赋给q
' t7 L( ]4 A8 b1 u, k) Z* Q7 Diquo(m,n);        #求m除以n的商数
. B9 h& Q* @8 x  O2 A( Xiquo(m,n,'r');    #求m除以n的商数, 并将余数赋给r
* s0 n8 F! D/ d' ?8 G! l/ R& H' ?其中, m, n是整数或整数函数, 也可以是代数值, 此时, irem保留为未求值. # T  p5 [  G& v# e( @: T
> irem(2002,101,'q'); # 求2002除以101的余数, 将商赋给q
4 f8 @5 L) [; c/ L$ h
* P& h! l5 j; U3 ^" H# P( P> q; #显示q
) H! G$ w% c9 F- r8 W- W1 E
$ q  t, ~9 R# r2 y6 ]- x> iquo(2002,101,'r'); # 求2002除以101的商, 将余数赋给r
& J, H: Q; c( @ " t0 S) ]3 k/ m, X2 M
> r; #显示r9 K. a! h# s+ n% ~/ h6 }# c
  a/ s- k9 m* ]8 M- d. h$ a
> irem(x,3);
$ }/ k8 K  a" |
: k# k% ~+ [2 i, L2 f" I# R2)素数判别(isprime)
2 Q4 r! k7 l4 B# e: Y- l9 w' C素数判别一直是初等数论的一个难点, 也是整数分解问题的基础. Maple提供的isprime命令可以判定一个整数n是否为素数. 命令格式: isprime(n);
. h( N4 V, o9 W    如果判定n可分解, 则返回false, 如果返回true, 则n“很可能”是素数.
" k0 {  l# D; R9 U> isprime(2^(2^4)+1);- N) A4 {+ @% E9 `

1 v2 V5 h3 f, p> isprime(2^(2^5)+1);
; I1 Y- i+ X" p9 g . @8 q' j4 ^8 u. I& M# F
上述两个例子是一个有趣的数论难题。形如 的数称为Fermat数, 其中的素数称为Fermat素数, 显然, F0=3、F1=5、F2=17、F3=257、F4=65537都是素数. Fermat曾经猜想所有的Fn都是素数, 但是Euler在1732年证明了F5=641•6700417不是素数. 目前, 这仍是一个未解决的问题, 人们不知道还有没有Fermat素数, 更不知道这样的素数是否有无穷多. 9 c/ N5 j" K7 u8 v# z0 A
3) 确定第i个素数(ithprime)
$ ^) I+ r, n( N* C6 d若记第1个素数为2,判断第i个素数的命令格式: ithprime(i);   
( A  b: n% K( W  y> ithprime(2002);( h2 A/ Q5 D5 A: I

1 D% [1 F& A8 ?. Q% Y> ithprime(10000);! ]/ G6 O4 i# k1 g
4 p6 |9 M4 g: ~0 l
4) 确定下一个较大(nextprime)/较小(prevprime)素数) C9 C0 f! B' t( R( s
当n为整数时,判断比n稍大或稍小的素数的命令格式为:   
& }) B3 N8 ~8 D! g! Z! o+ [* n8 ^nextprime(n);  
# z9 c- F4 p% n. t* gprevprime(n);
+ P) h- R( r7 y7 u> nextprime(2002);( H" o8 J0 I* T$ g* j

( C4 S. H6 q7 I' j# H1 N> prevprime(2002);
: @$ i3 C5 \4 n. U, J3 B! [ 8 D6 Q. T( U3 H, k& m* H
5) 一组数的最大值(max)/最小值(min)
, s# z' E( M# }% c# P命令格式: max(x1,x2,…,xn);   #求x1,x2,…,xn中的最大值
' l$ |! X3 b9 e% _2 S! I7 J7 j             min(x1,x2,…,xn);   #求x1,x2,…,xn中的最小值
" R$ p5 h) X0 i  t7 y3 d> max(1/5,ln(3),9/17,-infinity);# v( h+ m' |( B  B( F5 F; P
) m; D8 Z$ w$ _$ H
> min(x+1,x+2,y);9 x3 E3 V6 \; U: z
+ O5 t$ a& X: f3 E
6)模运算(mod/modp/mods): Y- I1 P: q, Y( q# A0 h2 A. R
命令格式:  e mod m;    # 表达式e对m的整数的模运算! i& j2 n- c* C5 C) b2 z8 f
modp(e,m);  # e对正数m的模运算
  v! z- J9 Y" i! ^1 ~. rmods(e,m);  # e对m负对称数(即 -m)的模运算4 w9 m3 Q) x3 A
`mod`(e,m);  # 表达式e对m的整数的模运算, 与e mod m等价
+ \0 }; t2 j8 a$ j5 p1 c  t0 G- B6 e值得注意的是, 要计算i^n mod m(其中i是一整数), 使用这种“明显的”语法是不必要的, 因为在计算模m之前, 指数要先在整数(可能导致一个非常大的整数)上计算. 更适合的是使用惰性运算符“&^”即: i &^n mod m, 此时, 指数运算将由mod运算符智能地处理. 另一方面, mod运算符的左面优先比其他运算符低, 而右面优先高于+和-, 但低于*和/. - D1 }7 {) M, S/ q6 m
> 2002 mod 101;
7 q5 ?( W- a. s* H) h
" Z1 A8 }! t) i9 x> modp(2002,101);; I* J' d+ u/ C  `7 G6 E
( Q/ W# m% I/ X; R: `
> mods(49,100);
' _/ a6 h( s9 Z6 q% `* x 2 j" h$ ?# S$ }
> mods(51,100);
* D( Z) M. T. a# n/ ^+ ?0 i# U! c
% g- j" ^8 w0 N1 D( l9 V# }> 2^101 mod 2002;  # 同 2 &^101 mod 2002;% @. `# j7 u3 T" v! R

5 z! j- Q3 g" [6 [7)随机数生成器(rand)8 R8 g5 \: W" k8 ]1 B0 g
命令格式:   $ T1 H* |, ~" N! h6 i
rand( );    #随机返回一个12位数字的非负整数2 a# @# \8 D+ O5 S" q3 `( ?4 O
rand(a..b);  #调用rand(a..b)返回一个程序, 它在调用时生成一个在范围[a, b]内的随机数1 V0 e, H6 R7 {" |( l: L, H
> rand();8 F9 M( ~1 p( c7 [+ ?
$ I6 ^. K2 a. U, m. o+ o% e
> myproc:=rand(1..2002):3 x$ ?- l2 c7 x( u# s
> myproc();
2 H  c8 @6 l/ j7 V) k ( {% f% J# H6 Q/ {8 g5 C( u
> myproc();
* ?6 ]+ |, O* z  L# P" b9 G9 b1 S
! K1 c; D$ I6 \) s7 G    注意, rand(n)是rand(0..n-1)的简写形式./ k: G/ I4 m* W  J8 l7 ?3 `/ e
2.1.2 复数运算8 a: x/ ?. s) _+ s: c
复数是Maple中的基本数据类型. 虚数单位i在Maple中用I表示. 在运算中, 数值类型转化成复数类型是自动的, 所有的算术运算符对复数类型均适用. 另外还可以用Re( )、Im( )、conjugate( )和argument( )等函数分别计算实数的实部、虚部、共轭复数和幅角主值等运算. 试作如下实验:   
7 L$ F- L: _: \; P% j> complex_number:=(1+2*I)*(3+4*I);9 `- q8 M0 X5 ?8 h
% `3 Z# e+ U2 L: L  t6 d6 p% _* s
> Re(%);Im(%%);conjugate(%%%);argument(complex_number);
2 T% B2 ~/ L5 P' ?" w/ p6 |4 g. R+ M 2 K" v1 l! R) V
0 L6 Q9 K, u4 T7 F/ c, L  G; \

7 l& A4 A" ^% ?# k8 a' ?8 C
* {1 _' R; h1 p5 e  ^值得注意的是上行命令中均以“;”结束, 因此不能将命令中的2个%或3个%(最多只能用3个%)改为1个%, 因为%表示上一次输出结果, 若上行命令改为“,”结束, 则均可用1个%. 8 ^$ L' ~) x9 Q% }1 z
为了在符号表达式中进行复数运算, 可以用函数evalc( ), 函数evalc把表达式中所有的符号变量都当成实数, 也就是认为所有的复变量都写成 的形式, 其中a、b都是实变量. 另外还有一些实用命令, 分述如下:   6 D0 c( O. s. s% p; }8 m  }% f  o
1) 绝对值函数
) d2 b. o0 |7 x命令格式: abs(expr);  , m/ O8 U  ~8 N
当expr为实数时,返回其绝对值,当expr为复数时,返回复数的模.
& c6 x- n+ u2 b  ~" V' X6 \> abs(-2002);    #常数的绝对值
" p0 d0 n& i) R' |0 f0 D
' D+ j7 B, d0 n! d# c- V9 |> abs(1+2*I);   #复数的模
7 Y0 h4 A- ]! G& a( G4 P8 c* |
( a4 L6 ~" a! j3 a4 ^4 b) v3 T; n: m> abs(sqrt(3)*I*u^2*v);  #复数表达式的绝对值, ?& I8 c9 @; p4 ?- W7 H. [
: j# s6 ^4 s/ d4 v
> abs(2*x-5);   #函数表达式的绝对值2 P8 f7 ]! w" D1 t
8 J! l- V, h! |. v: M
2)复数的幅角函数
' G" w& \& o! @3 Y命令格式:   argument(x);  #返回复数x的幅角的主值
) @  M$ L7 U) ~% d  L/ i( @> argument(6+11*I);8 D+ M0 u# C" I, ?
$ @  K$ Q6 ]/ o1 s5 E) c  L3 }' g
> argument(exp(4*Pi/3*I));
8 d# G2 U7 v3 Y% l$ Z9 A/ I
( P3 k7 W5 \: ^/ {* t& O% ~8 u. L3)共轭复数3 c5 p' A1 x) d4 {
命令格式:   conjugate(x);  #返回x的共轭复数: I8 B6 Q5 T- B7 S* E2 l# Z
> conjugate(6+8*I);0 a+ b6 t* D; J4 j( |8 n

  P, H% E% h) N$ b1 s> conjugate(exp(4*Pi/3*I));# l  A; E1 L( Q( B0 G
# u& E; T  \% S' E; ^  ~' U' q
2.1.3 数的进制转换  l) l: p0 X- T- U
数的进制是数值运算中的一个重要问题. 而在Maple中数的进制转换非常容易, 使用convert命令即可. ( ~6 c7 l2 G! [3 G0 \9 o# g
命令格式:   convert(expr, form, arg3, ...);    1 }7 B( I' o. D
其中, expr为任意表达式, form为一名称, arg3, ... 可选项.
1 {7 O* M9 h/ M9 |0 B& I4 [下面对其中常用数的转换予以概述. 而convert的其它功能将在后叙章节详述.
* x( r$ ~( x1 _    1)基数之间的转换( E$ @0 q" M4 R2 V. i
命令格式:   * r* D; B4 h0 A% \  N
convert(n, base, beta);      #将基数为10的数n转换为基数为beta的数
1 L( Z  {4 _; [3 Q: \7 G  L0 W; }1 W    convert(n, base, alpha, beta);#将基数为alpha的数字n转换为基数为beta的数, b; j; z+ Q3 E% Z1 P3 ~$ b
> convert(2003,base,7); #将10进制数2002转换为7进制数, 结果为: (5561)7
/ f# G$ J* S1 m2 i0 a+ y 4 p% Q0 U6 u  y# n8 }
> convert([1,6,5,5],base,7,10); #将7进制数5561转换为10进制数
2 e/ e* M  Q3 I/ P : ~* J7 x7 k% s- @( V4 @# w
> convert(2002,base,60);       #将十进制数2002转换为60进制数, 得33(分钟)22(秒)
: C* i0 J" M/ r' q2 c8 ^* @
/ y  G4 L3 ]4 q5 L+ t- Y0 t' j    2)转换为二进制形式
" E' G& N3 r: w/ L* B# x  W0 ^9 ~命令格式: convert(n, binary);8 a1 A+ g( }% D* u/ O. G* D
其功能是将十进制数n转换为2进制数. 值得注意的是, 数可以是正的, 也可以是负的, 或者是整数, 或者是浮点数, 是浮点数时情况较为复杂. $ f9 L; Q) ]" Y  Z6 a, ~
> convert(2002,binary);   
1 U( q  f, v+ _% N2 v5 u- J8 U 9 G9 }5 c5 u: U/ `
> convert(-1999,binary);
4 i5 c6 H/ `/ ?$ p, J& Z0 G 9 T* `4 ^* `6 Q& N5 V
> convert(1999.7,binary);
, j  @3 B' ?3 ?2 P' f9 c8 J8 s0 p8 ?
1 T) g; E8 G/ K' d0 Q' m/ N: f3)转换为十进制形式# F1 F/ y6 x% h7 F: u
其它数值转换为十进制的命令格式为:   ( h+ h8 _7 K/ u, g1 Q
convert(n, decimal, binary);   #将一个2进制数n转换为10进制数
" s. D0 }* Q3 g0 E& P, ^& t    convert(n, decimal, octal);    #将一个8进制数n转换为10进制数
( c/ [6 B) ~: E7 F+ m) c5 {    convert(string, decimal, hex);  #将一个16进制字符串string转换为10进制数
) v# o6 i# Q2 n8 C> convert(11111010010, decimal, binary);    2 ^6 J4 m6 N3 R
! P$ e5 s  E% S% d: }
> convert(-1234, decimal, octal);           
' T- @) q7 }& m7 R2 d2 B
4 k6 U$ d) y; a/ S7 {) n' ~> convert("2A.C", decimal, hex);         
' Q( h4 x& b. ^ : w! f6 o* l5 e( j  i% z: J
4) 转换为16进制数
: V; O7 ~  @% }; A3 F; E/ M' q将自然数n转换为16进制数的命令格式为: convert(n, hex);   
6 @  e7 J, D! c4 g% S> convert(2002,hex);  convert(1999,hex);7 @2 S* N( j+ x, _! T8 z5 N1 S2 Z

7 O* S4 J- S1 z4 w3 D * e& J" s* r. ~( {8 n
5)转换为浮点数5 w4 L: q: y- q
命令格式: convert(expr, float);
- o3 u$ ]7 @$ C注意, convert/float命令将任意表达式转换为精度为全局变量Digits的浮点数, 且仅是对evalf的调用.
! h) ]4 w( y7 X- f> convert(1999/2002,float);
' Z1 ^9 d( l* l# V) Z! z$ }+ W ) H6 c$ [) ]) u4 b, F
> convert(Pi,float);/ G9 ^. }9 v! I( P
  C& C- f# q! |/ ^6 s0 p
2.2 初等数学
. Z  o9 W% s7 ~2 h" M! z" U8 J    初等数学是数学的基础之一, 也是数学中最有魅力的一部分内容. 通过下面的内容我们可以领略Maple对初等数学的驾驭能力, 也可以通过这些实验对Maple产生一些感性认识.
+ n# Z/ Q" a. x: v4 K; F8 {2.2.1 常用函数
; O9 x! L, c) o6 y9 P, C0 D+ C1 V作为一个数学工具, 基本的数学函数是必不可少的, Maple中的数学函数很多, 现例举一二如下:   
' W+ l+ K! R! M+ q8 M0 |$ q$ }指数函数: exp7 T. ?- [# M) U/ C# p* l2 ^( n7 z
一般对数: log[a]
7 M3 k. C% g) p自然函数: ln9 v( f' m. `8 D, [, Y! Y
常用对数: log10
: r( _  t* B5 o+ h" E. F平方根: sqrt! o6 u0 U4 N. p. S6 T( \. v
绝对值: abs
( L' Z# `6 }, X. |8 U三角函数: sin、cos、tan、sec、csc、cot
: x: p  k0 p* i! d反三角函数: arcsin、arccos、arctan、arcsec、arccsc、arccot4 v! P" N5 m5 ]: r$ ?! f3 o
双曲函数: sinh、cosh、tanh、sech、csch、coth
& O* g7 Z' O9 |7 ]( X( k反双曲函数: arcsinh、arccosh、arctanh、arcsech、arccsch、arccoth4 H! I6 }! J- ^, k% \
贝赛尔函数: BesselI、BesselJ、BesselK、BesselY
9 M# C& U6 `$ t: L# K$ _2 m( x7 `- cGamma函数: GAMMA# m1 L' Y" q5 `  E
误差函数: erf' U% f* M3 a. Q$ R
函数是数学研究与应用的基础之一, 现通过一些实验说明Maple中的函数的用法及功能. 4 v7 d+ {/ R4 d
1) 确定乘积和不确定乘积; F2 A9 F  K) q5 F
命令格式: product(f,k);  
) G$ \$ {% \0 x2 aproduct(f,k=m..n);  
/ c4 x! i. D# d1 D7 Oproduct(f,k=alpha); 6 }5 B5 V$ P" U9 I) d3 q$ K7 a
product(f,k=expr);' }4 b0 m- h# Q6 y. u( r+ W' y
其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—包含k的任意表达式.
$ i$ w8 ^6 Y1 [7 S> product(k^2,k=1..10);   #计算 关于1..10的连乘6 p5 G; }" E7 T% d

6 F0 ]% }+ d! ^: N# @7 L> product(k^2,k);         #计算 的不确定乘积3 G; s6 a% @* \6 h6 H
* G% ^0 B5 W7 c: p/ H% ?
> product(a[k],k=0..5);    #计算ai(i=0..5)的连乘9 V2 t; W8 G% t/ P. {) U  S+ b

5 @0 R9 x2 Q$ V' k" T4 e> product(a[k],k=0..n);    #计算ai(i=0..n)的连乘, |' Y* P  R) w9 d8 a3 V) L4 V* Q
2 |+ g3 i: S  A
> Product(n+k,k=0..m)=product(n+k,k=0..m);   #计算(n+k)的连乘, 并写出其惰性表达式/ d: H" v3 a' K$ N
/ o8 j- Z" h  B) I
> product(k,k=RootOf(x^3-2));     #计算 的三个根的乘积( s7 M& [$ h8 h1 G* a! F& h# w

3 o. O7 e: K: u& i" |* i$ x    product命令计算符号乘积, 常常用来计算一个公式的确实或不确实的乘积. 如果这个公式不能求值计算, Maple返回 函数. 典型的例子是:   1 P9 S2 o5 T9 M7 y
> product(x+k,k=0..n-1);
; U2 k2 K# S; l: ? 1 o' S* y* E+ U3 c  ~/ d
如果求一个有限序列值的乘积而不是计算一个公式, 则用mul命令. 如:   
8 c2 a8 V* w/ ?" B7 P> mul(x+k,k=0..3);. O5 N- u- C3 A+ C

& z% o+ G9 N% ^2)指数函数
- {$ B$ p  {: b9 n% [) o计算指数函数exp关于x的表达式的命令格式为: exp(x);
0 Q' O  [7 V0 A5 g* Q> exp(1);
1 V! J* f) \7 _; s5 N& w- D 8 Y( C( }7 e1 |2 _
> evalf(%);
2 d3 R! P2 s# {+ L; R# Y 7 O5 ~! n- L, [' w' O2 u
> exp(1.29+2*I);9 K# e0 s. r6 B6 u9 k1 c
9 ~- w* p  b* S' `* A1 f
> evalc(exp(x+I*y));3 m; M* k$ H3 X. n0 y
) U& e- o: [: g
3)确定求和与不确定求和sum
$ m1 N1 _! \% L  Y1 S2 {6 i* H0 d/ S命令格式: sum(f,k);  
- V: C( s  k; B+ K6 d# Xsum(f,k=m..n);  
9 `) @  G  |2 s" tsum(f,k=alpha);
' P) b% o0 A8 |! y8 Ksum(f,k=expr);
- a6 R% r0 B$ C6 ~' [其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—不含k的表达式. 3 W/ w# J( ~% \* @' |
> Sum(k^2,k=1..n)=sum(k^2,k=1..n);
' v6 L) z4 N. Y4 B
4 O' U5 r; J3 I4 {) q> Sum(k^3,k=1..n)=sum(k^3,k=1..n);% V: D- X# b3 o3 d; H- ^( A

. ^4 U5 M9 @* ~* I> Sum(k^4,k=1..n)=sum(k^4,k=1..n);
/ ~. e* C& ~$ ?0 x; n7 ^, d7 l  l# c: L / u6 b" [+ [( s$ x; v
> Sum(1/k!,k=0..infinity)=sum(1/k!,k=0..infinity);
4 N* T6 V  q7 a7 c4 d$ t9 x- `2 [4 { ; d" H& t& _" p4 O0 p: r* j, \4 }; `
> sum(a[k]*x[k],k=0..n);
, N: @9 H& }; ^" ~+ A1 y
1 U- \' z. i2 F; O' M> Sum(k/(k+1),k)=sum(k/(k+1),k);
# t( J0 y2 [9 s( W2 A" P
; @( S& Y9 u( Z( q> sum(k/(k+1),k=RootOf(x^2-3));6 ]7 |+ v$ r. ~. Y7 M
& l" E( }, ?/ J! C
sum函数可计算一个公式的确定和与不确定和, 如果Maple无法计算封闭形式, 则返回未求值的结果. 值得注意的是, 在sum命令中将f和k用单引号括起来, 可避免过早求值. 这一点在某些情况下是必需的. ( i9 _8 D3 j  E0 C
> Sum('k','k'=0..n)=sum('k','k'=0..n);
  a6 ]7 O4 G! m- e
( {  Q/ t; J$ _5 X, {+ e如果计算一个有限序列的值, 而不是计算一个公式, 可用add命令. 如:   
2 g, W( ^$ P9 k$ i0 @/ ^8 V2 A9 i4 B7 v3 d> add(k,k=1..100);5 M* f- `4 w) A/ }! p  v- C
4 Z9 v1 E' ^# g3 }; f2 d$ _7 C
尽管sum命令常常用于计算显式求和, 但在程序设计中计算一个显式和应该使用add命令. + |$ M) [0 m" A* [
另外, sum知道各种求和方法, 并会对各类发散的求和给出正确的结果, 如果要将求和限制为收敛求和, 就必须检查显式的收敛性.
% A4 C. k  w# i, I3)三角函数/双曲函数  X2 b- ]5 ]: ^1 l! ~9 A; Q7 u# A
命令格式:   sin(x);   cos(x);   tan(x);   cot(x);   sec(x);   csc(x);
, ~) u: ?: E0 e* ~8 s9 w# y: X          sinh(x);  cosh(x);  tanh(x);  coth(x);  sech(x);  csch(x);
9 _, E9 q# d8 J! W7 \其中, x为任意表达式. % E4 L- b$ l9 N: [! y2 a/ x- @
值得注意的是三角函数/双曲函数的参数以弧度为单位. Maple提供了利用常见三角函数/双曲函数恒等式进行化简和展开的程序, 也有将其转化为其它函数的命令convert.
. G: z* _* @7 ]+ _& `. @0 t' Z& ]5 c> Sin(Pi)=sin(Pi);
* t7 [3 g7 |7 B& ? 2 H3 ^4 N+ V6 R
> coth(1.9+2.1*I);
  |8 k% F6 z' T/ A" _1 I$ ]* ~. p
- X% ^  i- L0 m) F9 h, e' V> expand(sin(x+y));     #展开表达式
/ J# c+ Y- S3 z( h; K3 K/ p8 q5 R " Y, e: l8 [) ?& H7 X1 N! p1 S
> combine(%);        #合并表达式- h0 Q. `7 e4 y/ M6 b7 X+ S* E! p

' _* d9 P  J8 _/ r> convert(sin(7*Pi/60),'radical');
+ D2 x9 f4 v& @. L " d4 U' Z2 v0 [9 v( e7 X2 G
> evalf(%);* S: {$ M. E7 h: J4 a6 p

: q0 l* I3 |. h$ L& w但有趣的是, combine只对sin, cos有效, 对tan, cot竟无能为力.
- T8 L8 \: ~4 m' I# f8 n3 @4)反三角函数/反双曲函数
' m% d& g, A8 i$ [7 F命令格式: arcsin(x);   arccos(x);   arctan(x);   arccot(x);   arcsec(x);   arccsc(x);* L* Y1 r8 n9 l9 u
     arcsinh(x);  arccosh(x);  arctanh(x);  arccoth(x);  arcsech(x);  arccsch(x);   , e. l. I  N, E) ?5 S
arctan(y,x);
1 C* y. f6 @, ?% i$ j9 j其中, x, y为表达式. 反三角函数/反双曲函数的参数必须按弧度计算.
/ a4 A# n. H: v" M( i算子记法可用于对于反三角函数和反双曲函数. 例如, sin@@(-1)求值为arcsin.7 H3 c$ u: F& r
> arcsinh(1);
4 N9 j% o7 q: n4 X. N  O ; c" t3 [6 y; y1 H7 u+ p4 f
> cos(arcsin(x));4 n6 j; G" q" z5 Y$ p* V0 ]4 g

" Z* A9 ?7 F' v6 Z7 p> arcsin(1.9+2.1*I);. H* o: {8 {! v2 N
& ]+ E: o+ B5 p- E" _. l5 v
5)对数函数
) \5 F2 M5 C' x4 ?& ?命令格式: ln(x);           #自然对数& ?* a+ u0 K8 H+ Q9 Z
log[a](x);        #一般对数) W" s+ ~% r' L
log10(x);        #常用对数
8 t( m- |0 y3 P6 f2 A# t1 G* k一般地, 在ln(x)中要求x>0. 但对于复数型表达式x, 有:   
* ?. I: e2 U- E; Z  (其中,  )5 @* b# S7 N, L7 b
> ln(2002.0);- g( u2 F$ `7 e' b3 S( @7 ]  W4 y2 o

% R. `) j. I" K% @8 Z> ln(3+4*I);- h1 z2 M2 y! I/ K

7 E9 v$ n0 r8 e> evalc(%);    # 求出上式的实部、虚部) \5 u$ O: i- a- l# p* b! ^, a. V

! W; y! X" r/ M) r. m> log10(1000000);
& U) q/ V* [5 u7 j8 h1 ^8 E( N* q( T
2 B- H$ `+ X5 ^4 x$ K> simplify(%);   #化简上式
( r; i) H2 B" v+ o2 o& O* L* y * }6 _+ j  d( ~& t7 h: S
2.2.2 函数的定义
, h( N) G5 G: E( eMaple是一个计算机代数系统, 带未知或者已知字母变量的表达式是它的基本数据形式. 一个简单的问题是, 既然表达式中可以包含未知变量, 那么它是不是函数呢?试看下面一个例子:   * \1 @$ B! P& u) x% @; T$ \
> f(x):=a*x^2+b*x+c;1 p3 a( q4 L; z0 Z+ x  E& p

! `' u( n9 r: J/ f' S可以看出, Maple接受了这样的赋值语句, 但f(x)是不是一个函数呢?要回答这个问题,一个简单的方法是求函数值:   ) F) L3 r; J# Q4 H6 S
> f(x),f(0),f(1/a);
& N& t) g( ~: z  d. T. r  {1 x " N% E' n0 X/ _0 C
由上述结果可以看出, 用赋值方法定义的f(x)是一个表达式而不是一个函数, 因为f(x)不能把所定义的“自变量”或者“参数”转换成别的变量或表达式. 但从赋值“过程”可以看出, f(x)虽然也算是一个“函数”, 但却是一个没有具体定义的函数:   9 e+ E9 _- b1 m/ B
> print(f);
- w1 H) v- p# K8 P7 |: N5 h 4 c4 D) _# Q3 n; h8 L/ ~2 s$ a
事实上, 我们所做的赋值运算, 只不过是在函数f的记忆表(remember table)中加入了f(x)在x上的值, 当我们把自变量换作0或1/a时, f(x)的记忆表中没有对应的表项, 所以输出结果就是抽象的表达式.
) q  t# I/ R+ J6 U在Maple中, 要真正完成一个函数的定义, 需要用算子(也称箭头操作符):   . E  a  R& ]6 G$ A
> f:=x->a*x^2+b*x+c;
$ W4 b2 _; }, l+ ?' x8 m 4 \/ v$ D, Q- Q; N, {
> f(x),f(0),f(1/a);& B# U0 \6 w# R. M  b3 P4 \5 q
. W. i: ^  _1 N" I  j
多变量的函数也可以用同样的方法予以定义, 只不过要把所有的自变量定成一个序列, 并用一个括号“()”将它们括起来(这个括号是必须的, 因为括号运算优先于分隔符“,”). : T# _  b7 r7 y7 _: b; Q- R( U/ A
> f:=(x,y)->x^2+y^2;
! g5 b4 ~/ b+ |4 h
: h: [* U' [$ `& {) y' R/ I- ^> f(1,2);
1 ~# k- H3 y- M# R
; f, T4 c; y. H4 _/ T  A  V- M> f:=(x,y)->a*x*y*exp(x^2+y^2);# Z* {: i* n/ L6 U3 x7 c8 n  e

" G- _5 }& g0 |! @5 @  g8 p综上所述, 箭头操作符定义函数的方式一般为:   " j8 _/ W- P! \: E
一元函数: 参数->函数表达式) u1 E3 u" b" W8 z( Z
多多函数: (参数序列)->函数表达式5 y* e/ Q3 D" A" \" Z* e
无参数函数也许不好理解, 但可以用来定义常函数:   
+ n- }8 s5 V. @- q3 f3 V* V> E:=()->exp(1);
4 }5 P3 j& Q( q+ B# l) N/ U* m $ `4 V2 j0 m. D) j% @
> E();, b  l8 J+ ~0 e$ y4 j

: I; ~) l2 I; _7 Y$ g> E(x);! M# x- }( ^( D5 z( d6 v, T% Q
7 q3 S% O1 a. \* h7 r8 H* b
另一个定义函数的命令是unapply,其作用是从一个表达式建立一个算子或函数. + F: ^" s$ n# H3 x1 I
定义一个表达式为expr的关于x的函数f的命令格式为:  f:=unapply(expr, x);          6 F( u  i% N- T4 P" b
定义一个表达式为expr的关于x,y,…的多元函数f的命令格式为:  f:=unapply(expr, x, y, …);     
( X0 o5 J7 a6 j# u% g> f:=unapply(x^4+x^3+x^2+x+1,x);
$ R- w0 v- P. A, q
' `* n: P2 j4 ?, j7 q% S> f(4);, T; \5 l1 @( c. A' l2 ]5 g8 W+ r

5 X1 L/ [  h9 E5 _4 Z' U2 g4 c> f:=unapply(x*y/(x^2+y^2),x,y);
1 A6 S( w1 r0 U4 I; v$ F" Z$ L 5 E* [) G* a" @5 g$ o$ j; |; p3 u
> f(1,1);9 s6 n! l1 u/ B9 X, g
. c8 V* S( E' Z7 z& U
借助函数piecewise可以生成简单分段函数:
0 n, s1 f% ^6 _8 \) e2 Y2 T> abs(x)=piecewise(x>0,x,x=0,0,x<0,-x);" C$ i3 S3 A0 o6 Q, \! e3 v$ Q

& l) v. k1 n9 |' W5 Q3 h清除函数的定义用命令unassign. 6 V, U+ n1 b% E  M9 F% {
> unassign(f);
8 v6 F- A) Z) j/ F, p; V/ h> f(1,1);9 w/ T. f2 o: d) K4 A/ y2 L7 _* V

6 d  |0 m% c) m" Y* g- Q! z$ @$ D除此之外, 还可以通过程序设计方式定义函数(参见第6章). + n/ V/ c: _6 h! G; I4 R
定义了一个函数后, 就可以使用op或nops指令查看有关函数中操作数的信息. nops(expr)返回操作数的个数, 函数op的主要功能是获取表达式的操作数,其命令格式为:9 [0 e7 T5 b) W2 t$ [7 O6 I4 p: v
op(expr);          ! G0 U$ G8 Z, f% q4 |
op(i, expr);         9 Q  L3 s' z+ I9 ]2 O- b" O
op(i .. j, expr);      
" E. i9 c5 X+ ^* Y& Cnops(expr);
4 l' |& g3 n9 N2 G. U7 u2 V如果函数op中的参数i是正整数,则op取出expr里第i个操作数, 如果i是负整数, 则其结果为op(nops(expr)+i+1, expr); 而i=0的情形较为复杂, 当expr为函数时, op(0, expr)返回函数名, 当expr为级数时, 返回级数的展开点(x-x0), 其它数据类型, op(0, expr)返回expr的类型. % F1 b, k# y6 t$ D
命令op(i .. j, expr); 执行的结果是expr的第i到第j个操作数, i..j中含负整数时的情形同上.  D( O& e2 |6 w: f% g7 P+ v
命令op(expr); 等价于op(1..nops(expr), expr); 4 h+ M/ g5 C" O) J1 J4 v8 b- i2 g
特别地, 当op函数中i为列表[a1, a2, ..., an], 则op([a1, a2, ..., an], expr); 等价于op(an, op(..., op(a2, op(a1, e))...)); ' f$ e& S$ a( J- D% s: K
而当expr为一般表达式时,nops(expr)命令返回的是表达式的项数, 当expr是级数时返回级数每一项的系数和指数的总和.
4 X+ n2 U7 p8 f6 g> expr:=6+cos(x)+sin(x)*cos(x)^2;
' g$ ?1 ?* L  v2 a$ ^8 ^1 p
% {3 E6 W' L0 W# n+ {/ V1 a> op(expr);
" v+ l# k: c) ^7 ~* Y: Z0 a1 o * L2 C6 D1 Q0 b
> nops(expr);
7 m1 H3 O4 i' X4 K
+ O' e$ R  N2 B" q> p:=x^2*y+3*x^3*z+2;
$ L' a0 J+ D' t2 G) J1 Z* } 5 t4 o" ^% i: C, @
> op(1,p);
7 e2 n7 m, I" I0 S$ o0 B
6 ~4 x# C' {, Z8 R9 T1 Y' M# f> op(1..nops(p),p);
0 q; F, S0 n; i1 ~; ?2 @ . O: \8 B# A' N! X; |5 }
> op(op(2,p));: F& Y* ]0 x% p  K

6 B1 `- |8 j3 s; x- O> u:=[1,4,9];
1 v# N8 S* p0 p% x, I, ?
2 Y9 p- b" ?! I' s5 c) q> op(0,u);0 v  G3 s$ Y+ E4 }1 n- e

) D% _- p% B! q; \> s:=series(sin(x),x=1,3);
8 ?7 F* O. d, X0 V / F; C0 h6 M7 {% I
> op(0,s);: W, H! z3 P1 P: G! H% p! q; V
        - O8 D) J- q/ C9 I2 [1 S$ w
> nops(s);
( I" r% A4 ]4 o3 d6 q! e
  F; ?) ?& [; \2 S下面一个有趣的例子说明了Maple在处理算术运算时的“个性”:
5 b2 c" Q- q4 z  H9 u! y3 p> op(x*y*z);4 C8 }: ]$ n, t, n1 o9 r' p( l, Y; r

- O  p1 F( [" _> op(x*y*z+1);
. Z2 y4 L5 g1 W, L: W! x
/ |8 o  d% X, x/ W1 t6 }, p2.2.3 Maple中的常量与变量名
( k, K. z& d* D  K为了解决数学问题, 一些常用的数学常数是必要的. Maple系统中已经存储了一些数学常数在表达式序列constants中:   
) p6 p6 u. ?3 v- d% V> constants;
6 S7 Q( o  R. V; z$ D+ ` ; j" `2 }$ `; I1 u- D/ a  J! {& {
为了方便使用, 现将上述常数的具体含义列示如下:   
1 n% r* {( L0 {: Z7 N1 A常    数        名 称        近似值
# H# x, [) B+ r: ?: e* k圆周率
" o7 e7 p: b" W% v$ }' qPi        3.1415926535# l; ]5 e* Q8 y' Z$ N
Catalan常数 * T+ y0 w# W: \9 }0 F) T9 g
Catalan        0.9159655942
0 u" I1 _& p; H( g. @" REuler-Mascheroni常数
: E2 `! v( y6 P$ q. A5 m3 O6 egamma        0.57721566496 @% M  M" s& |) Q& I: T
8 x, q. {# q1 C4 t
infinity       
# m: o$ E/ }2 _* T, S+ {, @2 z) o+ z8 e) Q
需要注意的是, 自然对数的底数e未作为一个常数出现, 但这个常数是存在的, 可以通过exp(1)来获取.
0 |% d: U7 r1 i; W' @) V# r在Maple中, 最简单的变量名是字符串, 变量名是由字母、数码或下划线组成的序列, 其中第一个字符必须是字母或是下划线. 名字的长度限制是499个字符. 在定义变量名时常用连接符“.”将两个字符串连接成一个名. 主要有三种形式: “名.自然数”、“名.字符串”、“名.表达式”. ! ?4 g& e5 ^9 a! `$ @4 B8 U
值得注意的是, 在Maple中是区分字母大小写的. 在使用变量、常量和函数时应记住这一点. 数学常量 用Pi表示, 而pi则仅为符号 无任何意义. 如g, G, new_term, New_Team, x13a, x13A都是不同的变量名.
: ~9 z& b8 |3 d1 w在Maple中有一些保留字不可以被用作变量名:   , d0 v  j* m9 |/ `) u
by      do      done     elif     else     end        fi        for      : T6 s" }1 A; a! Z; M& a; v7 P
from    if       in       local     od     option    options     proc         
- e( x1 {* q' l" A* o4 o) Hquit    read     save     stop     then     to        while      D' ]/ b2 h  Y" Z* `' Y& K
Maple中的内部函数如sin, cos, exp, sqrt, ……等也不可以作变量名.
3 v: R! g) J# I" K0 q另外一个值得注意的是在Maple中三种类型引号的不同作用:   - Q# t' P: G. V* @3 T) r
`  `:   界定一个包含特殊字符的符号, 是为了输入特殊字符串用的;   
4 [! m" f# \1 f, X  k'  ':   界定一个暂时不求值的表达式;   
5 x  V9 u5 o8 B"  ":   界定一个字符串, 它不能被赋值.
8 p( b1 x" P2 _. p2.2.4 函数类型转换           
3 T2 I. i6 c$ T; \+ ]函数类型转换是数学应用中一个重要问题, 譬如, 将三角函数转换成指数函数, 双曲函数转换成指数函数, 等等. 在Maple中, 实现函数类型转换的命令是convert. 命令格式:  
8 i2 G4 Y# @7 l: `' N    convert(expr, form);        #把数学式expr转换成form的形式
) c, v4 {8 F- U  ^$ u+ tconvert(expr, form, x);      #指定变量x, 此时form只适于exp、sin、cos: ?# x' g1 a2 e# b
convert指令所提供的三角函数、指数与函数的转换共有exp等7种:   0 n  q" r7 B$ o/ \
(1) exp: 将三角函数转换成指数* ^& Y% r( ?2 q+ i  I" Z/ v; o
(2) expln: 把数学式转换成指数与对数
8 _$ P3 g2 X+ V& E( A" {(3) expsincos: 分别把三角函数与双曲函数转换成sin、cos与指数的形式- a8 b, f) k' a' m
(4) ln: 将反三角函数转换成对数3 [2 M! O& I( _3 F. W  ]
(5) sincos: 将三角函数转换成sin与cos的形式, 而把双曲函数转换成sinh与cosh的形式
0 N! n& X8 U' f$ ^+ K& h(6) tan: 将三角函数转换成tan的形式
7 d& T) F7 h+ {( P$ W) e$ ?$ e(7) trig: 将指数函数转换成三角函数与对数函数
% C: L4 [7 J: U$ p- n6 l7 K> convert(sinh(x),exp);   #将sinh(x)转换成exp类型* Y8 A* e; k& s

4 K5 Z# n. L# S5 K9 a> convert(cos(x)*sinh(y),exp);
" D. w9 ^/ ]8 Y1 a% s$ i 4 b- r4 ?0 x0 J" W4 a
> convert(cos(x)*sinh(y),exp,y);
+ F9 R0 T6 f% P
; P4 c5 ]  |; \7 k0 m7 D> convert(exp(x)*exp(x^(-2)),trig);
9 ^: K- v9 }. g! ?
- N, g$ c( \  m( y> convert(arcsinh(x)*cos(x),expln);3 U2 S3 H! Q% c. i' V- B8 u
2 k7 R- }. I# f+ r) O. |+ D4 u  x
> convert(cot(x)+sinh(x),expsincos);
: \( l6 N7 C* U# y 3 J# z* K8 M. q7 P7 l! q/ r" K$ J  ~
> convert(arctanh(x),ln);  s' T" H! T0 d
6 O& f- H% E+ m8 i( h2 L* u7 B6 b
convert在有理式的转换中也起着重要的作用. 在有关多项式运算的过程中, 利用秦九韶算法可以减少多项式求值的计算量. 在Maple中, 可以用函数convert将多项式转换为这种形式, 而cost则可以获取求值所需的计算量. 注意: cost命令是一个库函数, 第一次调用时需要使用with(codegen)加载. 例举如下:   $ i4 K9 K" r1 Q
> with(codegen):
, f2 r" H7 b/ R% q/ z1 [% A> p:=4*x^4+3*x^3+2*x^2-x;; ?, l2 X6 Y4 M9 I1 Z- k

3 d& o$ _: X  |3 [# r> cost(p);
0 |) ]7 f. [" b  d- V. q
0 Y' m/ b, N! C% f' B% R8 A> convert(p,'horner');  #将展开的表达式转换成嵌套形式
1 ]( }" S. q' a: C0 O' f2 W* G1 w" N8 H 6 \* P2 G) t2 H+ u  i4 T
> cost(%);
( W* d  Y0 O, I4 R* _ . S5 O' O: |1 s# l& ~' Y
同样, 把分式化成连分式(continued fraction)形式也可以降低求值所需的计算量. # N, w" f3 `& C3 w) b! K
> (1+x+x^2+x^3)/p;) [2 x9 M( Q+ c" t  w, {
0 x/ q7 i* v5 H8 ?
> cost(%);+ h( _, w, X# z( B9 p

1 i" I" w) k8 N# s  w8 F> convert(%%,'confrac',x);
( u# T+ T9 ?4 O' j2 \1 k$ h
; p- z6 Y- w; s' N8 b6 n> cost(%);7 }" U! _; }* ^8 B; A- e2 ^! M1 s: W

: W$ h# `* K5 a在某些场合下(比如求微分、积分时), 把分式化成部分分式(partial fraction)也就是几个最简分式的和式的形式也可以简化运算, 但简化程度不及连分数形式.
+ @' y: O6 R2 x1 z6 H# o1 [> convert(%%, 'parfrac',x);
5 K  h" d2 b% L8 o% L/ }$ L* z
3 ~3 l( e( n/ b/ F( Q> cost(%);
1 L! [1 F' ?. Y' ] 2 ^9 r  Q0 r6 W& ~# z7 Y9 s5 i
而把分数转换成连分数的方法为:
0 t9 b" R9 }# ~; a4 k> with(numtheory):; I; `: s7 s. O0 d: }
> cfrac(339/284);
0 [6 j4 x9 @, {) T4 X
0 Q# c4 Q: H* @% K& H5 Z; h$ |2.2.5 函数的映射—map指令3 J+ ^2 U+ Y; j( b
在符号运算的世界里, 映射指令map可以说是相当重要的一个指令, 它可以把函数或指令映射到这些结构里的元素, 而不破坏整个结构的完整性. 命令格式为:
2 l6 J5 v2 U2 r5 F5 o! Lmap(f, expr);      #将函数f映射到expr的每个操作数+ A( ~% H# Z7 j, m- ~7 @8 X$ Q
map(f, expr, a);    #将函数f映射到expr的每个操作数, 并取出a为f的第2个自变量# c0 B6 Q: Z0 a
map(f, expr, a1, a2,…, an); #将函数f映射到expr的每个操作数, 并取a1~an为f的第2~n+1个自变量
3 Q$ h0 l1 X, J, Q, l' U  w1 gmap2(f, a1, expr, a2, …, an);    #以a1为第1个自变量, expr的操作数为第2个自变量, a2为
. a- K7 K# F8 E6 j第3个自变量…, an为第n+1个自变量来映射函数f
5 B8 M8 K) b* v" @% q, g> map(f,x1+x2+x3+x4,a1,a2,a3,a4);
; y) f  ^9 n7 R. N  t & }0 O4 z$ H, K9 r& b" ^
> f:=x->sqrt(x)+x^2;
+ Z" G+ @# n  x/ L7 M " k  \9 ~' \7 o/ J( D. A
> map(f,[a,b,c]);; [: I: j4 e" ^. u4 ^2 m

+ X6 s# M0 A1 h0 p" M. M$ a> map(h, [a,b,c],x,y); 4 B8 T" z+ k( f

% |8 g/ o4 K6 p/ o. j> map(convert,[arcsinh(x/2),arccosh(x/2)],ln);
2 Y0 x& w- E. F2 r7 p8 r' a
6 Y/ R- j$ P/ M' |# O2 L> map(x->convert(x,exp),[sin(x),cos(x)]);
8 C1 R, @2 F4 |0 o 2 ?+ w8 E, Q0 p' [
上式的映射关系可通过下式理解:! K7 s3 N( D, u( a8 d, A; h
> [convert(sin(x),exp),convert(cos(x),exp)];
9 p* V5 d" Q  H1 E! t1 D* | ) X( ^9 R5 s; |
> restart:
( N4 q1 e: O+ I# P- [" tmap2(f,a1,x1+x2+x3+x4,a2,a3,a4);
) }; v1 N  G% Z$ }4 a
+ T. l3 ]! D5 h> map2(max,k,[a,b,c,d]);
9 y. B7 ]& `7 F* T0 _8 T8 t4 L - ?3 \' _1 a: a
再看下面示例:   1 O7 W, g9 A8 l# m
> L:=[seq(i,i=1..10)];/ \% S7 m4 m* e; ~! M
8 s# N) V' @; S* @& m9 B
> nops(L);) G. x; H% Z$ H  F* ~) ~0 {' Q8 q

" i! M% _; j& A8 A! @> sqr:=(x)->x^2;7 Z% X9 Q, V& T/ z
9 d& w6 c% p& ^
> map(sqr,L);& Y, ^. x1 _: J) S' ?
' a  }) N+ G1 |% }2 c) j4 h- P
> map((x)->x+1,L);; L$ ?7 ~$ T5 Q# R! ?$ {& D) h* Y
! \6 x7 ~% O6 M9 E/ K
> map(f,L);) U3 c( Y! ~, c" }0 \
7 N2 H& f! z- \
> map(f,{a,b,c});" P' t7 U) m5 y7 g: Y, o

9 U0 G( u+ [* c8 j. n2 D5 q! u> map(sqr,x+y*z);
  q# M! M( E& P' L4 w4 x ) G$ C0 q7 u0 G4 ~$ S
> M:=linalg[matrix](3,3,(i,j)->i+j);4 U0 h5 Q" H6 H2 V

! {) L2 R3 n5 j, J9 y: i8 r1 v2 |" v> map((x)->1/x,M);
9 r& w/ V* [3 s/ P+ h  W 4 K9 o2 J  u2 S* p5 T0 F
3 求 值
8 |0 [) [+ \( }1 ^* M- G3.1 赋值/ |1 v1 B7 g' f! ^! S0 p
在Maple中, 不需要申明变量的类型, 甚至在使用变量前不需要将它赋值, 这是Maple与其它高级程序设计语言不同的一点, 也正是Maple符号演算的魅力所在, 这个特性是由Maple与众不同的赋值方法决定的. 为了理解其赋值机制, 先看下面的例子. ( _! b; E# D$ A( a
> p:=9*x^3-37*x^2+47*x-19;0 c' X, @) q" Y/ ~; x# }
2 C2 c  t8 ^1 H8 N% a: X  a
> roots(p);- B$ C" ]+ I" d: i  \/ O1 ^! S8 f2 r
% F) Z# ~$ y# X9 y$ ]; P/ K! T
> subs(x=19/9,p);; `* d8 Y4 k9 ^1 L" K; ?6 A# C
9 x$ `+ d  p; e. B" H# x0 n
在这个例子中, 第一条语句是一个赋值语句, 它的作用是把变量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;”这样的简单语句即可验证.
6 E; x  f/ U) W% Y2 q5 l/ M& B3.2 变量代换
" H- m. I: L) Z! M8 G8 h在表达式化简中, 变量代换是一个得力工具. 我们可以利用函数subs根据自己的意愿进行变量代换, 最简单的调用这个函数的形式是这样的:   
: V" L5 z0 h$ J2 Msubs ( var = repacedment, expression);7 n/ K# q& i1 s. D. [/ G8 G2 D* j% ^; m# O
调用的结果是将表达式expression中所有变量var出现的地方替换成 replacement.
+ @8 r/ j' J) K  E$ j0 T* B> f:=x^2+exp(x^3)-8;4 |0 s7 ~6 ^1 |. \% H* x$ J

: Q( H6 O! y( J( I, F> subs(x=1,f);
, {) W) W; m( ^
8 @0 \( H6 J- a9 ^> subs(x=0,cos(x)*(sin(x)+x^2+5));
: s- F1 T; `$ j! X
# }. y" _8 V  L) _7 S0 [    由此可见, 变量替换只得到替换后的结果, 而不改变表达式的内容, 而且Maple只对替换的结果进行化简而不求值计算, 如果需要计算, 必须调用求值函数evalf. 如:     o7 ~& V" g0 d. ]+ p
> evalf(%);6 f; q" _7 ?- v

# K# l7 r# K& e9 Y3 k变量替换函数subs也可以进行多重的变量替换, 以两重代换为例:   - n0 @2 Z- r& _, Q# `1 E; b  ]
subs (var1 = repacedment1, var2 = repacedment2, expression); ?7 j8 v* z' z' c
调用的结果和按从左到右的顺序连续两次调用是一样的, 也就是先将expression中的var1替换成replacement1, 再将其结果中的var2替换成replacement2, 把这种替换称作顺序替换;    与此相对, 还可以进行同步替换, 即同时将expression中的var1替换成replacement1, 而var2替换成replacement2. 同步替换的调用形式为:   / m- t6 |& L, y; y8 t' ^
subs ( {var1 = repacedment1, var2 = repacedment2 }, expression)
/ U6 ~1 o  m% a6 O1 a6 s& }: d% G下面通过例子说明这几种形式的替换.
2 `( _! I+ q$ L* r> subs(x=y,y=z,x^2*y);              (顺序替换)
- M6 e0 r+ ]3 ?$ t  r- p/ R. b, t6 p6 S
4 u# G# J4 e- q% u: U8 {0 A> subs({x=y,y=z},x^2*y);            (同步替换)
% p; M- a5 s) n9 R1 }3 [5 e . @; v8 z# ?0 b/ @" L
> subs((a=b,b=c,c=a),a+2*b+3*c);   (顺序替换)
; ]! E6 C% t5 g3 C & M0 k- p" P2 S& |/ f$ |) {
> subs({a=b,b=c,c=a},a+2*b+3*c);    (轮  换)
" `+ w6 H" h* i6 D: h. i- O 4 F5 Q$ N) n- V0 P/ t0 h
> subs({p=q,q=p},f(p,q));             (互  换)+ A" [! K, ~' m: ]
9 J! t$ b% `+ x, ~# X1 ^8 r$ M5 Q
3.3 假设机制
  v) y/ l" _# R1 L- MMaple是一种计算机代数语言, 显然, 很多人会尝试用Maple(或其他计算机代数语言)解决分析问题. 但由于分析问题与处理问题的考虑方法不同, 使得问题的解决存在某些困难. 例如考虑方程 的解. 如果k是实数, 结果显然是x=1, 但如果k是 的复根, 为了保证解x=1的正确性, 必需添加附带条件: 也就是当 时x=1. 这是一个对结果进行正确分析的例子. 然而从代数的角度考虑这个问题时就会把k当作不定元, 此时k没有值, 从方程两端去除k的多项式是合法的, 只要这个多项式不是零多项式即可(这一点是可以保证的, 因为其所有系数不全为0). 在此情况下x=1就不需要任何附加条件. 计算机代数系统经常采用这种分析的观点.
. d& ?# l7 P: |& D8 A5 G. i在Maple中, 采用分析观点解决这类带有一定附加条件的实用工具是函数assume, 其命令格式为: assume(x, prop);- w2 [3 r" h  d, o; B% f; G
函数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);”也不会产生矛盾.
8 p( Z+ `1 I* A% x> Int(exp(-s*t),t=0..infinity);
  A# t! p; o5 r+ N) Y5 E 3 m1 I& B, @  C1 f/ `/ G0 ?
> value(%);% ~0 Y' E0 }  Z" ~/ r
Definite integration: Can't determine if the integral is convergent." W: h- Y* Z3 T; D( }( \- U: x
Need to know the sign of --> s
, V  U# G6 k! P" UWill now try indefinite integration and then take limits.
* ]  E. q( [# O4 }- v* G; ^
5 [( F& V3 N' Z> assume(s>0);: {& \" ?& n, ~# X7 Y; j
> Int(exp(-s*t),t=0..infinity);: |+ S# }/ m- ?! S

8 N# D& G. F  V! {> value(%);5 U- e/ e5 a+ t" @6 E% g

# a& z6 |# W% w  u: Z0 Y3.4 求值规则* k* r2 S) s3 }, N" }
在多数情况下, Maple的求值规则设计为做用户期望的事情, 但要做到这一点很困难,因为不同的人在相同的情形下会有不同的期望. 在大多数情况下, 全局变量被完全求值, 局部变量被一层求值. 而由符号' '界定一个暂时不求值的表达式, 单步求值仅去掉引号, 不作计算, 这也是允许取消指定名字或清除变量的原因. 如下例:   $ V# M6 |- L. A3 r0 B; V
> x:=y;) e& k6 E, @8 n" @) u3 E3 L, U% @# Z: D
2 k( \+ J% z! G6 [) ?9 G# b! y
> y:=z;
  f! _* b1 ]; q% p! l: @( o3 F
0 Q; X' Q$ {. j, v, r> z:=3;
; _* A- s* o8 X7 [! D- f 1 ^! q  M6 @/ m' r0 R* K
> x;4 ~* i. g* G% v

% G7 h& l: z) M# C( x% L> y;
& L1 i& n' c3 I/ k7 f
5 U' J: m+ v4 |; g' ~$ Z0 q6 L> x:='x';
. C$ r$ |' \7 [2 J) f, i6 I . d3 ]  p2 b. O
> x;
  j/ O4 S0 x$ H2 _4 s( p
4 K/ H9 P+ U" A) Q7 ^1 o> y;& \4 ?) i$ g; I

4 S" W& S6 J5 L对于不同的问题, Maple设计了不同的求值命令. 现分述如下:   $ h& B! j' X* T/ L  h' k
1) 对表达式求值
& P- @7 ?6 f3 Z, C1 R9 h1 R: v. \命令格式: eval(e, x=a);  #求表达式e在x=a处的值
0 V% {: t4 [; p: E( F9 x; @             eval(e, eqns); #对方程或方程组eqns求值+ c* W" L# i; a5 Y% [
             eval(e);      #表达式e求值到上面两层# ^* u( m- W" r  o
             eval(x,n);    #给出求值名称的第n层求值2 b! o4 E4 |9 u2 [2 j
> p:=x^5+x^4+x^3+x^2+x+73;6 x" _+ q. m8 w; j6 A, @6 ~
- N1 ^% R: C$ k
> eval(p,x=7);6 c" N) i% W8 {# {; b! V
0 L. y9 s) k! [
> P:=exp(y)+x*y+exp(x);% J& c7 ^+ c" \" u4 Z

% I6 h3 {, H7 a. F> eval(P,[x=2,y=3]);
" a9 h0 s+ m. {1 g  [2 c  X+ d  [) j $ \" l  F9 Q5 v
    当表达式在异常点处求值时, eval会给一个错误消息. 如下:   * J3 {* O3 Y/ G# e- s- a+ L
> eval(sin(x)/x,x=0);- [) S1 p# B3 ?" g/ u& b+ e
Error, numeric exception: division by zero
) q. c# o) p) L* e    下面再看使用eval进行全层求值或者对名称几层求值的示例:   $ [% d$ W+ M, V
> a:=b: b:=c: c:=x+1:$ {3 J* K, S5 @3 u
> a;              #默认的全层递归求值
$ b) M/ [9 a- @& s( f& c
" Z8 X& u" n2 W7 U5 F% |& X> eval(a);        #强制全层递归求值
% O2 D$ C+ n( |- f
0 V  o* l. l% a( |) y> eval(a,1);       #对a一层求值  o, H! G4 H: z# }& z3 q

. e8 S: C9 c, F6 M( m1 r> eval(a,2);       #对a二层求值: J1 ?; \% L2 |+ E8 f  c) G$ W
% E  K2 h( e  v$ S3 K  x
> eval(a,3);       #对a三层求值
) A3 d" R* B. o7 z6 P! ~0 X
0 h7 c/ J  z  P! w, `2 ?' w1 E" Q> eval(a,4);       #对a四层求值
' M7 C/ K# o8 }8 D, U6 \
+ q" n8 j9 F) w0 S; M; T4 h3 W( x, `    2) 在代数数(或者函数)域求值6 [( U. j, H, d( z! O% }
命令格式: evala(expr);       # 对表达式或者未求值函数求值* n. d  w& x+ R# J* q5 v6 z
             evala(expr,opts);   #求值时可加选项(opts): l. Y' F4 z- {: U  G1 W
所谓代数数(Algebraic number)就是整系数单变量多项式的根, 其范围比有理数大, 真包含于实数域, 也就是说任意实数都是整系数多项式的根(如 就不是任何整系数多项式的根). 另一方面, 代数数也不是都可以表示成为根式的, 如多项式 的根就不能表示成为根式的形式. 8 V- D# O  D0 |% l9 n4 Q* |6 O2 ?
代数数的计算, 算法复杂, 而且相当费时. 在Maple中, 代数数用函数RootOf()来表示. 如 作为一个代数数, 可以表示为:   
: a: y5 g9 j# i- K& }> alpha:=RootOf(x^2-3,x);% z$ \4 P: A+ Z, ]! y  F  e
) K& D6 s. B" p8 O
> simplify(alpha^2);
$ o1 D  D9 E3 D! D/ ?* y- {% C( R* _ 1 p/ V5 m  W& i- S3 F( ]! s
在Maple内部, 代数数 不再表示为根式, 而在化简时, 仅仅利用到 这样的事实. 这里, Maple用到一个内部变量_Z. 再看下面一个例子,其中alias是缩写的定义函数,而参数lenstra指lenstra椭圆曲线方法:
1 p: B' u" _1 Y/ o> alias(alpha=RootOf(x^2-2)):
# ^- I& o: K. Y, O; X) C& a0 ?; l8 t> evala(factor(x^2-2,alpha),lenstra);
* o$ }$ Y$ \2 n* x
, v6 t7 q9 a8 G  ]> evala(quo(x^2-x+3,x-alpha,x,'r')); + W: T2 Y2 k# `9 p9 f
  Z! _4 [/ z; c$ T: z
> r;
9 r: t. z# T- f$ M1 u& `5 ~7 D 3 y5 }0 d6 |0 @, q; j
> simplify(%);# J0 S: Z# I$ V! q; e: J

; \* s7 P: s9 D( {+ z: z; T* _6 Y7 X3) 在复数域上符号求值8 ^5 J2 k3 L- X- D. b
操纵复数型表达式并将其分离给出expr的实部和虚部的函数为evalc, 命令格式为:; m" x- Y0 p2 j/ L! K4 K. z8 W* G
evalc(expr);   
8 L8 }9 }0 @/ a4 D  \3 Oevalc假定所有变量表示数值, 且实数变量的函数是实数类型. 其输出规范形式为: expr1+I*expr2. ' p* H& V% q- H- y- G- W3 @( x! r& C
> evalc(sin(6+8*I));
( {2 W% P2 l" b# ~ 5 P) N6 q3 y8 c( g$ w% t! S
> evalc(f(exp(alpha+x*I)));' n4 W5 y4 \9 W5 w# l# R# Q
- I) I9 ]& O& h7 y5 D4 }! ?+ m" F
> evalc(abs(x+y*I)=cos(u(x)+I*v(y)));& i# a; `+ g' U$ ?8 x) S
: ]1 E( S4 }* y+ R5 {  ]
4) 使用浮点算法求值
; [$ I5 `4 D1 S2 \4 i' {浮点算法是数值计算的一种基本方法,在任何情况下均可以对表达式expr使用evalf命令计算精度为n的浮点数(n=Digits), 如果n缺省, 则取系统默认值, 命令格式为: evalf(expr, n);     & `9 Q3 O" F/ p! J9 ^
> evalf(Pi,50);   
: `# t8 z/ L/ n4 w1 n3 J/ F2 L
+ Y% [3 V9 s: ~- `( x> evalf(sin(3+4*I));   
+ Y/ e: h2 K! l* u
) f' V8 _# |% Y% y# ]1 d8 @> evalf(int(sin(x)/x,x=0..1),20);+ R0 J) Y* L: S5 P

0 [+ E7 j- w$ Q* l6 t5) 对惰性函数求值
- z* `# v  s0 O, c' W7 O/ S4 u把只用表达式表示而暂不求值的函数称为惰性函数, 除了第一个字母大写外, Maple中的惰性函数和活性函数的名字是相同的. 惰性函数调用的典型用法是预防对问题的符号求值, 这样可以节省对输入进行符号处理的时间, 而value函数强制对其求值. 对任意代数表达式f求值的命令格式为: value(f);   4 ^& @7 n) x1 Y0 G- Z
> F:=Int(exp(x),x);2 V# w& ?( {% ?! l& ~, E' f" z% @& z

1 E) e* Z6 W" M( _> value(%);" U4 Z; h+ K; f# `2 V

; y7 q2 ]* w. r& {> f:=Limit(sin(x)/x,x=0);; V$ W5 P! A5 }. [+ Z

" {  x" g2 @* x3 A) Q> value(%);
" _1 g% a2 l! y& I1 U0 P- j4 j; e , \' h/ p8 k7 `& b' [
另外, 将惰性函数的大写字母改为小写字母亦即可求值. 如下例:   " }+ N+ V4 B- \7 C1 i2 H
> Limit(sin(x)/x,x=0)=limit(sin(x)/x,x=0);
& L2 T1 ]* C, u' k! w! i
/ n4 D5 z9 u" m# d) ]' Q7 f4 数据结构
/ ?6 C7 ?6 @; i6 Y) n4 E( IMaple中有许多内建的与FORTRAN、C或Pascal不同的数据结构. 主要的数据结构有序列(sequence)、列表(list)、集合(set)、代数数( algebraic number)、未求值或惰性函数调用、表(table)、级数(series)、串(string)、索引名(index)、关系(relation)、过程体(process)以及整数(integer)、分数(fraction)、浮点数(float)、复数(complex number)等数据结构, 而矩阵(matrix)在Maple中表示为阵列, 是一种特殊的表. . U3 ?( K: I6 @; g7 B
4.1 数据类型查询; }$ W  R6 h4 z4 ?0 ^3 j
在Maple中, 用whattype指令来查询某个变量的数据类型或特定类型, 命令格式为:
1 I/ S  }$ a) ]& d% e& S$ E4 h; awhattype(expr)        # 查询expr的数据类型
9 r2 j* R; v8 \2 Y6 Jtype(expr, t)           # 查询expr是否为t类型, 若是则返回true, 否则返回false
3 Z+ s+ {' M  t: n; r) z5 N+ f- M> whattype(12);
9 b! R5 N3 g0 y1 u3 O0 H' w! U 6 _8 S  Y7 P" l1 d: ^
> whattype(Pi);# P! u% e2 Y% e! @; i

- h+ H  f8 H( ]  d- B- B) M6 e> type(1.1,fraction);) U5 d# o7 |* L$ }5 |8 e
( D; t9 Y- W  V2 a! q
> whattype(1.1);
) D# ]) u' J* C( T! T# s
. `9 X+ m( Y$ [/ A; \, b4.2 序列, 列表和集合# L! [' ~* ~/ n& C0 t! F: X
4.2.1 序列7 `8 }' }: V) N0 `- x' ~4 N& p
所谓序列(Sequence), 就是一组用逗号隔开的表达式列. 如:   
0 h+ q- X* ^" z4 o  n) J> s:=1,4,9,16,25;
% X1 y% p+ ?. v7 ]. g- f$ L+ s% s 4 Z- N2 h/ u1 y5 U3 a3 h+ N
> t:=sin,com,tan,cot;, M" y, j" u) }4 ]& U# ?  W8 a

/ F: @* U: o( S  ]0 h9 `一个序列也可以由若干个序列复合而成, 如:   
- B$ s, J) t! h& z> s:=1,(4,9,16),25;7 v" Y! ^# n8 h: Q
- C+ n/ Q  c  j) R( `7 f5 q
> s,s;3 M3 p9 A* E- N' F
7 t% ]! ?) d- {/ P+ g, V
而符号NULL表示一个空序列. 序列有很多用途, 如构成列表、集合等. 事实上, 有些函数命令也是由序列构成. 例如:   2 M+ P) M/ Z1 O! L3 E5 c) ^4 x
> max(s);
% \2 z- p$ A, Z8 r5 T7 g" l2 C " O; l; M, c+ ]$ _' ^/ |! }, ]' D
> min(s,0,s);
* L: s  C$ o: u+ B9 ] 8 V% ]1 {0 E- j5 l0 E6 |
值得注意的是, op和nops函数命令不适用于序列, 如op(s)或nops(s)都是错误的, 如果要使用op(s)或nops(s)前应先把序列s置于列表中. 4 j  e0 [) }0 ?1 M
> s:=1, 2, abc, x^2+1, `hi world`, Pi, x -> x^2, 1/2, 1;
6 u/ }) Q/ s; D8 u
2 R$ u2 X, E4 P2 M/ C> op(s);4 U7 M8 ^; A  [8 Z! r2 i* I
Error, wrong number (or type) of parameters in function op
' f2 s8 n4 s" q4 P1 n* }> nops(s);
, s. D8 P2 i$ @5 r3 hError, wrong number (or type) of parameters in function nops! n! D9 v: l/ [* P% q, i0 d
> op([s]);
2 O. q' L; E, o8 \0 d- Y* S , t8 a6 J& z3 u& d. i: B
> nops([stuff]);
& f) P& b+ p9 B/ U8 a: B
1 X# m* K: g$ A. _) i9 Z7 d函数seq是最有用的生成序列的命令, 通常用于写出具有一定规律的序列的通项, 命令格式为:   
2 |- Q, I7 b& W: Hseq(f(i), i=m..n);  # 生成序列f(m), f(m+1), …, f(n) (m,n为任意有理数); q/ y' G* C* ~: a7 o$ z1 V
seq(f(i), i=expr);  # 生成一个f映射expr操作数的序列
- V6 k4 x# c) B: }seq(f(op(i,expr)), i=1..nops(expr));  # 生成nops(expr)个元素组成的序列& c3 W# M, F8 o+ x: l. I
> seq(i^2,i=1..10);* j6 F8 G  i3 b5 C! h1 R

4 K8 ~2 Q: x( P& q) x2 S8 f> seq(ithprime(i),i=1..20);/ D8 s5 N" d8 P5 u( ~( H
1 l1 t, n! X- o) I4 Y/ i1 _  i/ e
> seq(i^3,i=x+y+z);
! t5 Q* U8 j' F8 e4 A2 ~) I7 D $ H' A& E5 q  t/ l8 Y: H
> seq(D(f),f=[sin,cos,tan,cot]);# G8 j6 B( @2 k9 [8 T" t, \- T

* {. W' q& \9 t  `  `/ ~) p> seq(f(op(i,x1+x2+x3+x4)),i=1..nops(x1+x2+x3+x4));5 J5 {, o% }5 D- G) g
- _1 d- p$ f5 F8 E# {% Z: x1 x
获得一个序列中的特定元素选用操作符[  ], 如:   # k* k+ M) e) d  {
> seq(ithprime(i),i=1..20);
5 s3 {0 q+ Q# ^
# X6 C" @2 X0 n4 v5 p3 S> %[6],%[17];
9 G& r1 J5 T- W: o; J% s ) |+ w; f2 H* b$ L) K: O
4.2.2 列表
' O+ i) P# E6 l6 z5 U列表(list), 就是把对象(元素)放在一起的一种数据结构, 一般地, 用方括号[  ]表示列表. 如下例:   
$ u2 H1 {) K. g> l:=[x,1,1-z,x];
3 F7 [8 n! W' S/ E# n 2 x4 M' m+ |% T0 B5 Z
> whattype(%);. j% u; y8 }  ^* ]  m6 p1 ]/ M

# J8 r- L; y- i/ i, Q  V; S9 i空列表定义为[ ].
0 t4 U! u" b, M7 [5 U但下述两个列表是不一样的, 因为对于列表而言, 次序是重要的:   
0 W1 e- R; e8 e5 M; m  G> L:=[1,2,3,4];
3 F/ I8 h9 a0 I7 y+ b $ t* Q- `8 k: f! ]# s
> M:=[2,3,4,1];) o% r$ v- D2 O& W' v8 ?
$ [+ W) N. E7 Y0 R  U
4.2.3 集合
' }9 ?& E, {2 M- D, I集合(set)也是把对象(元素)放在一起的数据结构, 与列表不同的是集合中不可以有相同的元素(如果有, Maple也会自动将其当作同一个元素), 另外, 集合中的元素不管次序. 一般地, 用花括号表示集合.
% Y' T- F" M( }( s( {8 e* y9 B> s:={x,1,1-z,x};9 @& o3 ~" v0 i1 b
6 B# ~( {, m, K6 P5 ^
> whattype(%);
1 g! ]) B9 A0 z0 }( f" Q/ P0 w5 V/ J
' d8 M7 d3 L, o空集定义为{ }.
8 i6 Y# n# c. u$ Q" F函数nop返回列表或集合的元素数, 而op则可返回其第I个元素.
$ d% \$ F0 f; H* ]> op(1,s);
( }: @2 D% R- j% C8 S9 @ . g: Q0 H( h' q1 g4 y+ G& W
> s[1];
, z+ J' k$ m" \
& S. w2 s( _9 \" `& o* w& d, `* {' D> op(1..3,s);
2 u$ F0 [1 n% o& \# S
4 o" m4 `" Z! B- R8 Y1 D> s[1..3];: q! n6 l* h8 j: `# Q, }2 s5 a2 w
& j; F. }/ e/ m0 {( I6 T
函数member可以判定元素是否属于一个列表或集合, 如果属于, 返回true, 否则返回false.
/ |" F- _! s: j% e1 `* U2 N9 Y* V. q7 F> member(1+x,s);& H' A9 G2 Q+ I- a
2 _" b  F8 R) f* ]: |" F2 v# j
可以通过下述方法在列表中增减元素:   " j3 }5 q% B0 w0 N# G
> t:=[op(s),x];# R4 Q+ S$ Y1 V2 l( v  ?' M8 ?
7 ^$ Y& q$ m0 X3 u  T4 M3 r
> u:=[s[1..5],s[7..nops(s)]];
! A1 |& R+ m) D* p) H8 W ' Y* `/ B" w4 |& [: ^6 L; Y$ w
Maple中集合的基本运算有交(intersect)、并(union)、差(minus):   & S" y4 A1 i& M$ M6 q& y
> A:={seq(i^3,i=1..10)};B:={seq(i^2,i=1..10)};% Z* `: t! x6 x
2 [5 M" l0 h+ Y- [: X% x- l

6 N$ ]/ v% |/ V  y> A intersect B;
, E+ D# @6 W3 Q4 o ( K5 f: _8 r1 K, c0 X- e
> A union B;
* `, G9 I; `# W0 n1 K7 x 6 }) Z1 Z  k! c2 o3 A( _) R
> A minus B;5 u0 Z! Y/ G& R/ U

6 }5 w0 l0 u7 I+ c% R2 P8 D4 v4.3 数组和表
  k& ~. {. C5 a5 o在Maple中, 数组(array)由命令array产生, 其下标变量(index)可以自由指定. 下标由1开始的一维数组称为向量(vector), 二维以上的数组称为矩阵(matrix). 数组的元素按顺序排列, 任意存取一数组的元素要比列表或序列快的多. 区分一个数据结构是数组还是列表要用“type”命令. % Z- d* |5 b- c% z
    表(table)在建立时使用圆括号, 变量能对一个表赋值, 但一个在存取在算子中的未赋值变量会被自动地假定是表, 表的索引可以成为任意Maple表达式. 表中元素的次序不是固定的. 7 B* O, u! I: b
> A:=array(1..4);+ D( P% c" d" ^9 e8 Y; i

9 {+ O2 L# r' M6 u$ L" ^  N> for i from 1 to 4 do A[i]:=i: od:
2 G; ?5 g. x! y% M9 r" Z> eval(A);3 J0 }- _) d- K9 r6 Z( U
. H6 I8 r' h3 v; m
> type(A,array);
1 ]& l/ Z0 A% F+ l
1 G7 G- u+ A9 ?7 y% [; ~, r% v> type(A,list);
% o7 ]( e5 E. R- V% {* I# y
& @+ J& ^7 D5 Y> T:=table();
  k5 \& z7 Y3 I' f9 _ 9 A  O( q" H# h3 L" |
> T[1]:= 1;
! n1 r; g. K4 \( l; L' V
- x: ^/ Z! k; Z. L, e; x> T[5]:= 5;
$ }. U3 x( W6 g2 l& O/ z
6 [" e) V& W' B/ e! N> T[3]:= 3;& [- j1 H2 ], G' n" }

) D) f% m% B) m6 s. r> T[sam]:=sally;
8 c: ~" q- x, R% y5 K - T7 J& W% H& w- y
> T[Pi]:=exp(1);! z& C2 A$ n0 B; a. H- D
5 D% p0 I% l5 Q# X" Z4 \4 {
> x:='x';8 v2 d  o" W/ E3 Z" d
# z: E3 ^) t. U8 B% P% j2 S
> T[(1+x+x^3)*sin(x)] := 0;
) O: Q# Q+ R0 ]# Z* R! r 8 `& r( Z; X9 z- F8 t) i
> eval(T);4 p3 i) B4 }+ }+ o  L

: w& i3 y% G8 L$ H4 J9 \7 ?5 w> T[3]:='T[3]';4 o! d" h, n# x) g$ S
) B3 S/ ~* P1 S& r' M4 n
> eval(T);( Y) X! }, n  b7 \2 z: }4 P5 g7 v' e

: X; I/ f3 O* u- O- a4.4 其他数据结构3 m! N, k" J( h( u8 l8 \
串在Maple中是很重要的, 他们主要用于取名字和显示信息. 一个Maple的串可以作为变量名, 它们中的大多数是简单的、不需要加引号的串, 但是如果变量名中包含/. 例如“diff/T”则必须把变量名用引号括起来.
) i: I% N) |. ~7 u8 B8 c) a: k' {索引名是像Database[1,2,drawer]或A[3]这样的对象, 在使用索引前不需要直接建立表, 如果不得不做, Maple会自动建立表. 索引名通常被用于矩阵和向量. 为了保证Maple建立表的正确次序, 建议在赋值前直接建立.
6 t/ P- I( \* z+ k1 j: H% v> x:=T[3];6 O4 L, L0 m0 A# z) {' p
6 Q2 c. n. P. e  G9 O, J, o! A
> eval(T);- o. p9 N# j: t( s6 P! p/ V0 ?

/ C/ {( i* L7 t+ z7 Y! }> T[5]:=y;: M* Z' Z* \' v

- ~2 ~( i( P  {$ }6 y( p> eval(T);5 p5 X/ M6 Z" z. f. T8 ~: L4 w/ z7 Y

, w# a7 v7 _* p' U5 p+ D3 H7 m+ @由此可见, Maple并不直接建立T的表, 直到给T[5]赋了值.     5 [" N) @1 c3 P
数值数据结构(整数、分数、有理数、浮点数、硬件浮点数和复数等)在它们的使用中是大量透明的. 浮点数是有传染性的, 这意味着如果数值结构中有一个是浮点数, 则整个结构自动转换为浮点数. / s: P$ `8 _9 V. v: g; g
4.5 数据类型转换和合并! C% E! V3 k9 O, f( }# Y
convert是一个功能强大的类型转换函数, 它可以实现列表和数组的类型转换:   
$ f; g, Q2 x5 V9 [( w( a2 h> L:=[1,2,3,4];
, T1 I" m# r- j( E
$ m( K$ Z- d, X. Y( y> type(L,list);
' b* t  P; h8 [$ t2 L 7 u2 s  J  W5 ^% }' Y; g* K' e' ]7 a
> A:=convert(L,array);) f' r; V; s8 Q6 a2 y' T
2 @# c4 g' Z4 F9 @% o! v
> type(A,list);8 Z1 B( u4 I$ e0 G9 O7 X

. k: k6 K) X: ^) \3 n> type(A,array);, T+ t1 y- K2 ^- \

% ]  }& |# y9 S+ k. D另一个有用的函数zip则可把两个列表或向量合并:   : |- r- A! X" A3 G& e7 W
>L:=[seq(i,i=1..10)];
% M  C+ W  n& r) A3 q" | ; i. b" `* K" G; s1 a8 P: a
> Sqr:=(x)->x^2;
- e9 ^- l; B% [ . d1 W+ b' ~5 x! T. R
> M:=map(sqr,L);7 U: ^, o3 p/ C! [! x
4 e, c& x: ?: V, [1 b0 }
> LM:=zip((x,y)->[x,y],L,M);% ]# E! n% I- I; {% w- U" L
* t" H( K0 J  q9 m
> map(op,LM);+ l# r% ]' d" F7 j( z
, i/ `" H1 p+ h! U
5 Maple高级输入与输出操作
2 O( w; @4 X/ P& WMaple提供了良好的接口来编辑与计算数学式. 许多时候, 我们可能需要把Maple的运算结果输出到一个文件中, 或者在一个文本编辑器里先编好一个较大的Maple程序, 再将它加载到Maple的环境里. " Y% r! c+ }' z& q$ x9 C8 d
5.1 写入文件
2 T% c% V" t$ _3 ?* J( \& u8 }5.1.1 将数值数据写入到一个文件
9 _: m- Z4 k! y' ]如果Maple的计算结果是一长串的数值串行或数组, 而想把它写到一个文件时, 用writedata命令. 9 O6 b7 Z& q' M. r
若Maple的计算结果data为集合、矩阵、列表、向量等形式时, 将其写入名为filename的文件时命令格式为: writedata("filename", data);7 n1 N& l6 N7 o% N# B8 Q
> with(linalg):9 x. U* z% s' ]( w  O
> M:=matrix(3,3,[1,2,3,4,5,6,7,8,9]);
2 {$ b: n+ `- P5 A2 k. u
! k) z4 D# \6 a, l' y$ x> writedata("e:\\filename.txt",M);
$ J! S' t; v# P+ |- l' J而将结果附加在一个已存在的文件后时,使用命令: writedata[APPEND]("filename", data);
1 F* ~( _( E- \$ @5 K> W:=matrix(2,2,[1,2,3,4]);9 \. }3 l! T$ w: j& ?& K% R) S
: S" E7 w$ k; P6 J
> writedata[APPEND]("e:\\filename.txt",W);
' v0 E, w, s/ c需要注意的是, 这里的APPEND是必需的, 否则W结果将会覆盖M结果., Y6 G  n  i2 ^2 u1 P+ W) Z
另外, 若想将结果显示在屏幕上时, 用命令: writedata('terminal', data);
) h! G# R& [; W: s  i> writedata[APPEND]("e:\\filename.txt",W);
; F6 {7 C' f' k$ m> writedata('terminal',M);/ T3 I9 |. X" t
1                   2                   3           4 |5 x* L% V/ W5 C! i9 T* s
4                   5                   6           / `# \& c8 t/ s
7                   8                   9   
, S/ R0 }$ H- _% p5.1.2 将Maple语句写入一个文件# U$ q& v; p8 v
如果所要写入文件的是表达式、函数的定义或者是一个完整的程序, 则使用命令save, 写入一个或多个语句的命令格式分别如下:
! s( y) ~  C. J7 Z, rsave name, "filename";# ~% X& U' w( [) J* ^1 m; ~
save name1, name2, …, "filename";& L" i  s6 o, a9 o# `
若filename的扩展名为.m, 则Maple会以内定的格式储存, 若扩展名为.txt, 则以纯文本文件储存. 以内定的格式储存的文件作纯文本编辑器无法读取, 但在大多数情况下, 它会比纯文本文件的加载速度更快, 且文件容量小.
% M5 f7 r- o8 G1 q> myfunc:=(k,n)->sum(x^k/k!,x=1..n);
0 Y( O- a& _: [# D; o1 T : n+ T0 Z! G+ J- j) ^* P2 J! ^
> myresult:=myfunc(6,8);
. `% K/ Z) g0 Z! p& ?. G 2 p- |; ^% P7 }2 S# m# s: X
> save myfunc,myresult,"e:\\test.m";
  `+ I) t& d9 ?+ Y3 T调用已存m文件用命令read. 试看下述实验:- T- r( d7 ~: {- D- _# r/ R! p( i
> restart:
% i* c& V" w* Q5 y& Z: n> myfunc(6,8);
+ p& S+ R, p2 K! D0 Q: ? # S# g4 R" z( _$ d' f5 r
> read "e:\\test.m";
. _# S0 I2 i9 k  S> myfunc(6,8);2 p6 Q- i3 M+ Y& T8 v2 B- G7 l4 }
+ a" h( N2 W3 w$ }
> myresult;
4 y  a, I. b4 e2 E- ]% w   V+ T* a6 R. i* ?. q
    而存为txt文件时则将整个语句存为一个文件:
7 _2 t9 e5 M9 k4 k2 a, e2 h; T> save myfunc,myresult,"e:\\test.txt";) X( c+ @: S- o+ E* ?0 c" I
> restart: read"e:\\test.txt";
- p# n- }4 \$ {- c* F$ P
2 |6 z% E! C% E9 z( @$ g   A+ W) l/ ]6 Z3 u( ]+ w# H5 G
5.2 读取文件
( }" i5 j# ?: |6 I1 n在Maple里最常用的两个读取文件的命令, 一个是读取数值数据, 另一个是是读取Maple的指令.9 T+ f& z" Q* z- C
5.2.1 读取数值数据
' V% l& S& p! A如果想把大量的数据导入Maple里进行进一步的运算或者要运用大量的实验数据在Maple环境绘图时, 可以用readdata( )命令完成.
. T& K- k7 Y* H: O, K从filename文件里读取n行数据时使用命令: readdata("filename",n);4 ]- r  M6 K3 z( }/ p# i
以指定的格式读取数据时使用命令: readdata("filename",[tyep1,type2,…]);
1 K  H- l, G; L" t> readdata("e:\\filename.txt",3);9 e3 T# p# C- E" v* r( C% W$ ^

8 y! q' \0 [7 N# r, R+ {8 o    读取filename的前三列, 第一列为整数形式, 第二、三列为浮点数形式:
" a& G/ y7 V8 e3 a> readdata("e:\\filename.txt",[integer,float,float]);
7 T5 n+ b4 q% m( C0 u& z- U8 A   z. ]) w; ]2 b
下面再看一个运用大量的实验数据在Maple环境绘图的实验:
: ?! p+ I% Y; d4 l0 }- k7 |0 l9 i> mypts:=[seq([x/1000,cos(x^2/100000)],x=1..1000)]:' L) O1 F5 T: f0 E
> writedata("e:\\data.txt",evalf(mypts));
6 ^. ]( G4 {1 M8 O, W  `> dots:=readdata("e:\\data.txt",100):
0 p  B5 {+ I% ~) |' G9 x> nops(dots);) f1 `, i6 b+ c# }# _) v( g

. E) A9 g' S$ Z/ T+ t; ]" f> dots[1..4];
5 ~( O7 ]8 }5 I6 h% a$ L1 X% t 1 P+ V! p0 U5 `! ^' f8 J
> plot(dots,style=line);7 F8 L  |" T+ D6 ^
9 Y, y4 a0 ^% g# @
5.2.2 读取Maple的指令9 Z) Q) }% l' P0 Y
在编写程序时, 在普通软件中先编好程序再将其读入Maple环境中常常比直接在Maple中编写更为方便. 如果要将程序代码或Maple指令加载用read命令:& S+ I) _1 T# P, u/ f+ b
read "filename";3 F+ V. Z* ~; P5 x: f2 r% N% ]
如下例:2 A2 A" T# \" j8 n$ H9 F# k
> reatart:5 ^2 X! _5 p% y
> myfunc:=(a::list)->add(i,i=a);. ]8 c# K2 g, J$ }6 d
- M8 Q5 d8 d  C6 D2 x. Q
> avg:=(a::list)->myfunc(a)/nops(a);3 k" j* a6 a/ C; S
/ @: A5 _% T" T# r5 H# N
> save myfunc,avg,"e:\\function.m";3 q" P4 `- M( c; m
> restart:. ]. ~* \7 k, m: c- q( e# N2 @! a
> read "e:\\function.m";
6 ~1 T' E, L  {0 V/ z- u. E> myfunc([1,2,3,4,5,6,7,8,9]);7 e& K+ x2 t, D
9 U& Z% x- n7 K2 q; S- g# g
> avg([1,2,3,4,5,6,7,8,9]);; B+ W9 Y( C, r5 W, {

( Y: Q7 D: j0 Q7 w8 G+ S5.3 与其它程序语言的连接/ [+ O6 @( N1 F
5.3.1 转换成FORTRAN或C语言
3 h; y2 C, P+ ^& ?7 ?调用codegen程序包中的fortran命令可以把Maple的结果转换成FORTRAN语言:
( J3 r" L0 L( K' H6 Z; [+ W6 d> with(codegen,fortran):
- l( L/ q: |+ j8 k" m0 F% y7 Z: Mf:= 1-2*x+3*x^2-2*x^3+x^4;7 V5 h$ {  K) [( P
* \, o5 z1 m+ f5 ]
> fortran(%);
2 ]' v* E- R9 m- [( t& `      t0 = 1-2*x+3*x**2-2*x**3+x**4
2 r( b8 S8 o4 {0 |) f9 }* O > fortran(f,optimized);' B* r/ W* @  A7 O
      t2 = x**2
) z# ^* L. y0 ^8 A$ S: Q      t6 = t2**29 `$ J8 ^, t. K/ i) ?. [  K7 b5 w9 l
      t7 = 1-2*x+3*t2-2*t2*x+t6
: t% [! P8 G; @) ~4 {! C: Z! ]& P% L# C> fortran(convert(f,horner,x));
: @! p1 R1 ]) O  T% ~' i$ k) j5 }      t0 = 1+(-2+(3+(-2+x)*x)*x)*x+ y6 _1 P- H; j/ ?. Q6 b5 W) K
而codegen程序包中的C命令可以把Maple结果转换成C语言格式:
$ F. I" C, U& Q' L! L: C$ D! t> with(codegen,C):
& k" o0 J* F0 k3 f! Qf:=1-x/2+3*x^2-x^3+x^4;
' ^+ j# }( k& s  k5 K* D 5 G6 ]6 u1 h; M7 |, e: r. }
> C(f);
8 t8 I. d' y, L/ d# a7 x7 C% f* j      t0 = 1.0-x/2.0+3.0*x*x-x*x*x+x*x*x*x;" m! g' M' a2 h1 U7 `
> C(f,optimized);# g% }; P5 F! O6 w' o0 L. K
      t2 = x*x;
; s5 \, u- S* ?) U; O      t5 = t2*t2;8 W4 \. r" @3 q  [/ {+ c
      t6 = 1.0-x/2.0+3.0*t2-t2*x+t5;
! v% g0 R) ?% d3 O( ^) \! k( @optimized命令表示要对转换的表达式进行优化, 如果不加此可选参数, 则直接对表达式进行一一对应的转换.* F% N3 N. L! K$ V
5.3.2 生成LATEX2 v6 Q6 t; t" Z* S! l
Maple可以把它的表达式转换成LATEX, 使用latex命令即可:# e3 g5 s& ?- F* r! N. B' E7 @
> latex(x^2+y^2=z^2);
! Q9 b# s4 X5 t{x}^{2}+{y}^{2}={z}^{2}' O( {* R& U$ {& y& |
    还可以将转换结果存为一个文件(LatexFile):- M# h1 d4 ]6 M; a
> latex(x^2 + y^2 = z^2, LatexFile);
' T# B" Q9 Q' I( i    再如下例:2 @- H8 _0 z+ E( R
> latex(Int(1/(x^2+1),x)=int(1/(x^2+1),x));- z  ^; x- J1 T9 H# \
\int \! \left( {x}^{2}+1 \right) ^{-1}{dx}=\arctan\left( x \right)
" e5 u# O1 L2 k2 y  b" @
1 c9 n) D/ B6 @- k9 a1 |, w; N
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年!1 P  k4 M- l5 j1 N! y
    ; X+ I1 Q6 q, x! W0 O+ [

    9 N# u8 j% Z4 A$ ?2 w# Y
    回复

    使用道具 举报

    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-6-13 17:56 , Processed in 0.836963 second(s), 101 queries .

    回顶部