QQ登录

只需要一步,快速开始

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

maple基础

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

1

主题

5

听众

4

积分

升级  80%

该用户从未签到

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

; W3 M4 r. M% {0 J8 @- d! p* {& d
7 W6 e6 Q6 ?5 E/ M9 s. K5 G7 Y* A
) J9 a, Z/ R0 G9 [, s( ^
$ s( {* l) \9 d6 }: E ( M' ]4 }# u7 a5 @
: y, l" @  p. d) H7 G

# }- d2 ~; e, s4 q
# T7 h  u/ y7 S 2 B; x, U/ `8 N- }* `
1 l+ n, `# t: b/ f
- j* E+ e. B) K( I6 J
alpha        beta        gamma        delta        epsilon        zeta        eta        theta        iota        kappa        lambda        mu2 }7 G2 V: V9 g, _- Q$ h
0 l0 x5 X' E- k' K" P. Z7 o2 E8 s
3 F2 Y9 \& f: `; z( U% ^. C+ R6 _* Y

5 R' {2 K3 W/ [1 {, d # T- w2 L0 Z/ I( A5 Q
! r3 @# g( ~+ o4 E# D

6 ?" \) q' I9 N7 s& s/ W
1 ^3 ^, J, D  y& I4 R8 W# l. O/ p/ O
* u% s3 Y' H0 O: g0 _0 i
7 @. u% P9 t3 m0 d 0 o4 }% Q9 I% K( a' b

3 h8 C) y% A6 A, i& F9 _ 6 I3 U4 D2 S- K& f) l" u8 x4 ~% g
! v2 B. z4 p) `% {  j
nu        xi        omicron        pi        rho        sigma        tau        upsilon        phi        chi        psi        omega- R2 M; N2 Y+ i" ?& F
有时候为了美观或特殊需要,可以采用Maple中的函数或程序设计方式控制其输出方式,如下例:
! \! Z& T2 ]1 J> for i to 10 do 9 Y3 [6 z7 J4 Z' z
printf("i=%+2d and i^(1/2)=%+6.3f", i, eval(sqrt(i)));3 C; A& ^3 l( b' ^1 M, v- z1 U3 a
od;* j, y* M5 C; G. y# L
i=+1 and i^(1/2)=+1.000i=+2 and i^(1/2)=+1.414i=+3 and i^(1/2)=+1.732i=+4 and i^(1/2)=+2.000i=+5 and i^(1/2)=+2.236i=+6 and i^(1/2)=+2.449i=+7 and i^(1/2)=+2.646i=+8 and i^(1/2)=+2.828i=+9 and i^(1/2)=+3.000i=+10 and i^(1/2)=+3.162
8 b; Q& X% L- H4 w3 _+2d的含义是带符号的十进位整数,域宽为2. 显然,这种输出方式不是我们想要的,为了得到更美观的输出效果,在语句中加入换行控制符“\n”即可:; X  F) e9 I8 v0 W
> for i to 10 do ) z1 m; r( o9 M$ C& i
printf("i=%+2d and i^(1/2)=%+6.3f\n", i, eval(sqrt(i)));% G& y- }+ U" ?- J  Z9 l
od;
  e, N0 e2 ], X  \i=+1 and i^(1/2)=+1.000
, h2 \. S; Q6 ?i=+2 and i^(1/2)=+1.414
' |; U) }6 Y7 a' v6 [( pi=+3 and i^(1/2)=+1.732
6 g0 I8 G8 k' U5 B* {, Ci=+4 and i^(1/2)=+2.000
4 f) Y" m9 \% ti=+5 and i^(1/2)=+2.236
. j$ B5 k8 V4 P0 l" ui=+6 and i^(1/2)=+2.449- t2 S8 {* ]/ _* \. O
i=+7 and i^(1/2)=+2.6463 O, T6 G5 n& ^  K0 `2 Z6 v
i=+8 and i^(1/2)=+2.828* x; \% ^: o% r: v4 H
i=+9 and i^(1/2)=+3.000
! @& V$ `% b$ }i=+10 and i^(1/2)=+3.162- |; r/ h$ S& W3 E1 g
再看下例:将输入的两个数字用特殊形式打印:
. o7 A+ [8 \% @; n# ?3 n5 Y; r> niceP:=proc(x,y)8 B& n# f( D' n5 L) t# v, T
printf("value of x=%6.4f, value of y=%6.4f",x,y);
5 ?+ H. p2 n) z! |/ K9 hend proc;
. ?9 C" m2 A. F( G: K) ` 4 I: a- v9 t" y- ]5 o/ t4 w
> niceP(2.4,2002.204);' x# o( _( o7 `. B2 ~. G
value of x=2.4000, value of y=2002.20406 q  s% e  w$ H8 `+ I- n7 C) x& [6 t! W1 a
1.4 Maple联机帮助
. h; e( c1 Q! M! ]# ~学会寻求联机帮助是掌握一个软件的钥匙. Maple有一个非常好的联机帮助系统, 它包含了90%以上命令的使用说明. 要了解Maple的功能可用菜单帮助“Help”, 它给出Maple内容的浏览表, 这是一种树结构的目录表, 跟有…的词条说明其后还有子目录, 点击这样的词条后子目录就会出现(也可以用Tab键和up, down选定). 可以从底栏中看到函数命令全称, 例如, 我们选graphics…, 出现该条的子目录, 从中选2D…, 再选plot就可得到作函数图象的命令plot的完整帮助信息. 一般帮助信息都有实例, 我们可以将实例中的命令部分拷贝到作业面进行计算、演示, 由此可了解该命令的作用.
8 G' U) M3 x# o$ q在使用过程中, 如果对一个命令把握不准, 可用键盘命令对某个命令进行查询. 例如, 在命令区输入命令“?plot”(或help(plot);), 然后回车将给出plot命令的帮助信息, 或者将鼠标放在选定的要查询的命令的任何位置再点击菜单中的“Help”即可. , U, W: F) a  \. G4 |0 l7 q7 g3 i8 q# f
2  Maple的基本运算
2 D# p+ s0 W1 C; P9 l2 r! w* }2.1 数值计算问题
6 t; U1 }3 G4 Y. N  ^算术是数学中最古老、最基础和最初等的一个分支, 它研究数的性质及其运算, 主要包括自然数、分数、小数的性质以及他们的加、减、乘、除四则运算. 在应用Maple做算术运算时, 只需将Maple当作一个“计算器”使用, 所不同的是命令结束时需加“;”或“:”.
1 T% d9 ?& h+ s$ v+ O" `2 e/ ~在Maple中, 主要的算术运算符有“+”(加)、“–”(减)、“*”(乘)、“/”(除)以及“^”(乘方或幂,或记为**), 算术运算符与数字或字母一起组成任意表达式, 但其中“+”、“*”是最基本的运算, 其余运算均可归诸于求和或乘积形式. 算述表达式运算的次序为: 从左到右, 圆括号最先, 幂运算优先, 其次是乘除,最后是加减. 值得注意的是, “^”的表达式只能有两个操作数, 换言之,  是错误的, 而“+”或“*”的任意表达式可以有两个或者两个以上的操作数.
) s- q% R7 }8 A5 ]& [3 ]Maple有能力精确计算任意位的整数、有理数或者实数、复数的四则运算, 以及模算术、硬件浮点数和任意精度的浮点数甚至于矩阵的计算等等. 总之, Maple可以进行任意数值计算. % Y% M7 N. c1 n6 u4 f2 A3 _. {
但是, 任何软件或程序毕竟只是人们进行科学研究的一种必要的辅助, 即便它有很多优点, 但也有它的局限性, 为了客观地认识数学软件、认识Maple, 下面通过两个简单例子予以说明.
! `5 I1 b0 }8 {+ q- E+ K' b第一个简单的数值计算实例想说明Maple数值计算的答案的正确性:   * [* t. E3 L; l6 [% e
> 3!!!;
8 x# F! W6 ~5 J5 d( _" f2601218943565795100204903227081043611191521875016945785727541837850835631156947382240678577958130457082619920575892247259536641565162052015873791984587740832529105244690388811884123764341191951045505346658616243271940197113909845536727278537099345629855586719369774070003700430783758997420676784016967207846280629229032107161669867260548988445514257193985499448939594496064045132362140265986193073249369770477606067680670176491669403034819961881455625195592566918830825514942947596537274845624628824234526597789737740896466553992435928786212515967483220976029505696699927284670563747137533019248313587076125412683415860129447566011455420749589952563543068288634631084965650682771552996256790845235702552186222358130016700834523443236821935793184701956510729781804354173890560727428048583995919729021726612291298420516067579036232337699453964191475175567557695392233803056825308599977441675784352815913461340394604901269542028838347101363733824484506660093348484440711931292537694657354337375724772230181534032647177531984537341478674327048457983786618703257405938924215709695994630557521063203263493209220738320923356309923267504401701760572026010829288042335606643089888710297380797578013056049576342838683057190662205291174822510536697756603029574043387983471518552602805333866357139101046336419769097397432285994219837046979109956303389604675889865795711176566670039156748153115943980043625399399731203066490601325311304719028898491856203766669164468791125249193754425845895000311561682974304641142538074897281723375955380661719801404677935614793635266265683339509760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
* c6 o$ s8 G& Z+ p6 k/ i% x2 |# ~上述运算结果在IBM PC机(1G, 128M)上计算只需要0.01秒, 得到如此复杂的结果(1747位), 一个自然的问题是: 答案正确吗?
6 ?; p% p- t$ S为了回答这个问题, 我们借助于数值分析方法, 由Stiring公式
8 a- n5 A7 E4 ?
$ ]% N% U6 b9 [2 C, U可得:  , 前三位数字与Maple输出结果相同, 且两者结果均为1747位. 另外, 在720!的计算中, 5的因子的个数为:   0 w* `# l6 {8 `9 r7 T

- U: U  Y& I, H- ^8 z这些5与足够多的2相乘将得到178个0, 而Maple的输出结果中最后178位数为零. 由此, 可以相信Maple结果的正确性.
; l7 @0 o8 y9 Q2 Z另一个例子则想说明Maple计算的局限性:   6 ^6 n) \# j+ C
  
! N$ q: o8 i; W# ]# G5 R1 EMaple在处理问题时, 为了避免失根, 从不求算术式的近似值, 分数则化简为既约分数. 因此, 在Maple中很容易得到:   
& F0 O1 a, l- N
# C, r6 Z6 n8 Z" A5 p' Z显然这是错误的. 这一点可以从代数的角度予以分析. " [/ H& R" r/ {$ |! S6 f
不妨设 , 则 , 即 , 显然 有3个结果, -2是其实数结果. 4 \9 \6 t) X- @
另一方面, 设 , 则 , 即:" @1 H! F* R" c  Y( a8 f: ], \) e9 B- m
5 x  J7 E- x- i+ o, f7 z# y3 X
显然 有6个结果, -2、2是其实数结果. 9 x8 D$ [/ o1 I7 w
这个简单的例子说明了Maple在数值计算方面绝对不是万能的, 其计算结果也不是完全正确的, 但是, 通过更多的实验可以发现: Maple只可能丢失部分结果, 而不会增加或很少给出完全错误的结果(如上例中Maple的浮点数结果皆为 ). 这一点提醒我们, 在利用Maple或其他任何数学软件或应用程序进行科学计算时, 必须运用相关数学基础知识校验结果的正确性.
/ x) D) k9 R  W" m& @% s" F尽管Maple存在缺陷(实际上, 任何一个数学软件或程序都存在缺陷), 但无数的事实说明Maple仍然不失为一个具有强大科学计算功能的计算机代数系统. 事实上, Maple同其他数学软件或程序一样只是科学计算的一个辅助工具, 数学基础才是数学科学中最重要的.
9 ^6 w0 ?- B. B  D6 c/ E# U  c2.1.1 有理数运算6 r. T1 I" N4 g/ g0 u
作为一个符号代数系统, Maple可以绝对避免算术运算的舍入误差. 与计算器不同, Maple从来不自作主张把算术式近似成浮点数, 而只是把两个有公因数的整数的商作化简处理. 如果要求出两个整数运算的近似值时, 只需在任意一个整数后加“.”(或“.0”), 或者利用“evalf”命令把表达式转换成浮点形式, 默认浮点数位是10 (即: Digits:=10, 据此可任意改变浮点数位, 如Digits:=20).
+ ?6 V" T. a- w* s, h$ R> 12!+(7*8^2)-12345/125;! t" L7 ]4 s4 p* Q, c" D
' o; a3 `5 _" ~7 _  U6 I( o, x
> 123456789/987654321;+ Z$ E- I1 g7 V# L/ t

: a# o% x  x& M2 S> evalf(%);7 {! U, C- K" u

/ u  c  c. s. Y> 10!; 100*100+1000+10+1; (100+100)*100-9;
6 u' A& ?, |0 n0 m4 Y9 P
2 |: b2 W9 A, x. P # l# j* w( l1 _4 m; W7 q
; L- `- Q3 i9 q, e$ D$ _
> big_number:=3^(3^3);8 q, o$ e! L, o3 F3 T
! g9 d% P, x$ s. }* ~
> length(%);
6 i5 `; x* v/ y! v" i. e 9 R& X" b7 k/ P7 k  ]. _
上述实验中使用了一个变量“big_number”并用“:=”对其赋值, 与Pascal语言一样为一个变量赋值用的是“:=”. 而另一个函数“length”作用在整数上时是整数的十进制位数即数字的长度. “%”是一个非常有用的简写形式, 表示最后一次执行结果, 在本例中是上一行输出结果. 再看下面数值计算例子:   . s! m( `: Y( \1 b' i6 U, }6 a# B
    1)整数的余(irem)/商(iquo)& q% {. K9 O9 r3 [* F
命令格式:   5 |1 K9 `  O! e. ~# O: R
irem(m,n);        #求m除以n的余数
( ^" E( V, X: ]irem(m,n,'q');    #求m除以n的余数, 并将商赋给q6 \0 v0 N1 {; R, ?+ s1 E" l6 ~
iquo(m,n);        #求m除以n的商数. u) w+ f- e1 D
iquo(m,n,'r');    #求m除以n的商数, 并将余数赋给r
9 `# d! }; v( |7 J3 t其中, m, n是整数或整数函数, 也可以是代数值, 此时, irem保留为未求值.
4 Y4 `6 t- l6 P& t8 R0 A( f2 G> irem(2002,101,'q'); # 求2002除以101的余数, 将商赋给q
8 Q3 E, K2 Q4 o( L7 g 8 h: k4 r' M# g. R* }
> q; #显示q
4 A3 K8 I9 W5 n8 y! O4 M3 R
. R7 X5 d' j6 f# i! X# N> iquo(2002,101,'r'); # 求2002除以101的商, 将余数赋给r- p; _- p$ U3 D
: N" }" v: ^4 w5 N  r
> r; #显示r
  C+ Q" M3 x, `  b2 b
/ V) A9 {1 T/ `( U2 C> irem(x,3);
2 I2 c! i$ k! m6 V
4 }, i& C+ K* T1 ?# V2)素数判别(isprime)  W* I& F4 T+ r( H! E- O
素数判别一直是初等数论的一个难点, 也是整数分解问题的基础. Maple提供的isprime命令可以判定一个整数n是否为素数. 命令格式: isprime(n); 3 q  F4 y9 Q, n& F0 F! y
    如果判定n可分解, 则返回false, 如果返回true, 则n“很可能”是素数.
5 |1 B7 l3 v1 E> isprime(2^(2^4)+1);+ w3 M* K. G) x9 Y" U/ l

/ C6 d4 `. K  P- N; z> isprime(2^(2^5)+1);
0 _9 ]7 C8 O- Q . ]0 z( v$ R& i+ w6 C9 G9 M
上述两个例子是一个有趣的数论难题。形如 的数称为Fermat数, 其中的素数称为Fermat素数, 显然, F0=3、F1=5、F2=17、F3=257、F4=65537都是素数. Fermat曾经猜想所有的Fn都是素数, 但是Euler在1732年证明了F5=641•6700417不是素数. 目前, 这仍是一个未解决的问题, 人们不知道还有没有Fermat素数, 更不知道这样的素数是否有无穷多. 3 H; s. n. o3 C' G9 a8 m- U/ c0 c
3) 确定第i个素数(ithprime)
; y/ a* b! A  Q; ]: v若记第1个素数为2,判断第i个素数的命令格式: ithprime(i);   
' t  X8 T0 e3 W+ h> ithprime(2002);5 Y& m& i* I0 v' C4 u& c

! q/ t" `  i& b( `$ a> ithprime(10000);
2 i, {( G  E( p3 F ( A* [; l# M# T  p
4) 确定下一个较大(nextprime)/较小(prevprime)素数
, H9 J: \8 J6 T/ U( D; L1 l当n为整数时,判断比n稍大或稍小的素数的命令格式为:   ' K6 e# y4 k3 ]0 ^
nextprime(n);  9 ^9 X' D9 O( X
prevprime(n); . ~! S0 b2 E' p2 ~  |5 P6 w6 m- _* C
> nextprime(2002);
" X3 g$ P  j! k! y& c4 T
0 p; v) V. k$ X) m> prevprime(2002);) V7 {- r. H9 I' r# ~6 M
# a" s2 M1 l# A# K/ \
5) 一组数的最大值(max)/最小值(min)$ _2 F/ `* I! p- [2 K' f
命令格式: max(x1,x2,…,xn);   #求x1,x2,…,xn中的最大值8 _) e5 a# h& S9 T
             min(x1,x2,…,xn);   #求x1,x2,…,xn中的最小值
$ q6 i! ]0 e  ~4 Y1 f8 @0 Z> max(1/5,ln(3),9/17,-infinity);  g+ S! a- v5 b+ u6 D$ f

& v( e# b) n3 o! Q& o( u> min(x+1,x+2,y);! m9 [( d+ g& T- E& _0 m

$ T: v0 n* @% @6 j5 P" b6)模运算(mod/modp/mods)- R0 N: A5 S# `$ E, U
命令格式:  e mod m;    # 表达式e对m的整数的模运算$ m) P% m0 d$ a/ Y6 V; F: p
modp(e,m);  # e对正数m的模运算
- C' R/ l) r+ Lmods(e,m);  # e对m负对称数(即 -m)的模运算7 ^' a' v- ^/ w
`mod`(e,m);  # 表达式e对m的整数的模运算, 与e mod m等价6 z6 c" H$ U: m3 \$ Y$ _
值得注意的是, 要计算i^n mod m(其中i是一整数), 使用这种“明显的”语法是不必要的, 因为在计算模m之前, 指数要先在整数(可能导致一个非常大的整数)上计算. 更适合的是使用惰性运算符“&^”即: i &^n mod m, 此时, 指数运算将由mod运算符智能地处理. 另一方面, mod运算符的左面优先比其他运算符低, 而右面优先高于+和-, 但低于*和/. ( |; n7 f4 y# G* w* A8 Q+ k6 t
> 2002 mod 101;
/ n0 x3 q3 h% T- x
2 N8 P7 W& r2 Y/ T2 g> modp(2002,101);
5 b& A) A: o3 R# A & E' p2 J, c2 q
> mods(49,100);: g6 e4 N' V1 g3 \5 T/ d

/ u6 u8 L! o  Y  y> mods(51,100);
( ^$ k9 E. ]/ W3 K 0 |' n  }$ v/ a
> 2^101 mod 2002;  # 同 2 &^101 mod 2002;  p# T" R( k( X
( {2 N6 w4 |) J9 w
7)随机数生成器(rand)
5 z) \: [" U, N9 ]# Q命令格式:   + J( F' L7 o4 o- M3 W8 E
rand( );    #随机返回一个12位数字的非负整数9 C( O1 m0 d! s9 O5 z
rand(a..b);  #调用rand(a..b)返回一个程序, 它在调用时生成一个在范围[a, b]内的随机数& I( x4 |: d2 _6 }& x4 u
> rand();3 D) M! P! x% @8 O+ Y: G7 b8 n

7 D) o" K5 j& n( O, L! s' Q" T: P9 P> myproc:=rand(1..2002):% n. ^) }4 g2 x9 l' m# O3 o% z1 I/ O
> myproc();
  I& y' Q1 f& ]$ k( ~ ' J6 G6 d* e' P+ C- `
> myproc();0 o1 \, Z% y$ ^4 `! [& c) e) N

- T2 J; u0 W* T; U5 n6 N    注意, rand(n)是rand(0..n-1)的简写形式., m) T9 r' C% V  p
2.1.2 复数运算
4 H4 f- n; f$ A. u- }复数是Maple中的基本数据类型. 虚数单位i在Maple中用I表示. 在运算中, 数值类型转化成复数类型是自动的, 所有的算术运算符对复数类型均适用. 另外还可以用Re( )、Im( )、conjugate( )和argument( )等函数分别计算实数的实部、虚部、共轭复数和幅角主值等运算. 试作如下实验:   
- ?7 Z* m3 S- A! `6 \+ r2 O( s> complex_number:=(1+2*I)*(3+4*I);
3 A; E6 ~2 u7 \3 L + U0 |, w1 P0 W
> Re(%);Im(%%);conjugate(%%%);argument(complex_number);
! X1 H; e7 `& F( G/ y 3 t2 h6 p: H& ^& ?: }* L" |5 r
( x5 n8 E" N0 m) U

6 Y, H) A  p' k$ w
& f4 e, R- c" K值得注意的是上行命令中均以“;”结束, 因此不能将命令中的2个%或3个%(最多只能用3个%)改为1个%, 因为%表示上一次输出结果, 若上行命令改为“,”结束, 则均可用1个%. ) u0 u/ V& Q/ {
为了在符号表达式中进行复数运算, 可以用函数evalc( ), 函数evalc把表达式中所有的符号变量都当成实数, 也就是认为所有的复变量都写成 的形式, 其中a、b都是实变量. 另外还有一些实用命令, 分述如下:   ) d! Y: p. W$ [8 w7 N
1) 绝对值函数
, Y1 p- V! ~1 [+ ^命令格式: abs(expr);  5 \9 C  F/ E. U- K% N: \7 }3 R
当expr为实数时,返回其绝对值,当expr为复数时,返回复数的模.
6 c7 q+ z( n9 p' Q3 R$ R/ s> abs(-2002);    #常数的绝对值
3 c5 W. G, w4 l # P9 a: K6 _) r' y" g9 m$ `* z
> abs(1+2*I);   #复数的模
7 K9 S: V" [( q8 Q 5 \+ x9 N# T! O2 M  I9 r
> abs(sqrt(3)*I*u^2*v);  #复数表达式的绝对值9 ^9 O/ e8 w- t! U9 q1 |
+ A3 K: y& ^: C# L' G1 Y
> abs(2*x-5);   #函数表达式的绝对值# R& `0 K, j- i  x% I
/ h6 F) X* R* g! u. w4 Y
2)复数的幅角函数( p' k- t5 l# g% D9 S+ V- C
命令格式:   argument(x);  #返回复数x的幅角的主值. a4 Q! l7 ^) r' G1 s2 Y3 Y# I$ O8 `
> argument(6+11*I);1 ^! W  O* X% e& {6 q

( W3 g" L4 o2 \. k* t- @> argument(exp(4*Pi/3*I));2 [1 k! X4 ^5 [$ {2 @
4 e" M. [5 B4 {
3)共轭复数
  C( B9 @! A" {0 v* O+ C$ w+ y命令格式:   conjugate(x);  #返回x的共轭复数! s& u* s. d1 _, j' o7 m) I& T8 T
> conjugate(6+8*I);/ [1 E  y% K0 S5 m
+ w2 O) q' j- b) c5 N
> conjugate(exp(4*Pi/3*I));
3 D- U5 F5 o" H 6 p' g# S. r- }4 M
2.1.3 数的进制转换( B1 q  E& e1 b/ h4 C; N5 z
数的进制是数值运算中的一个重要问题. 而在Maple中数的进制转换非常容易, 使用convert命令即可. - O, D. |7 [/ t
命令格式:   convert(expr, form, arg3, ...);    ' p  o3 {& d$ u+ B% ], ^7 f
其中, expr为任意表达式, form为一名称, arg3, ... 可选项. 9 V2 }2 s0 g9 I' ]* p
下面对其中常用数的转换予以概述. 而convert的其它功能将在后叙章节详述.
* z9 V" N+ R' Z( k+ y, K    1)基数之间的转换' a1 e; @* n1 @+ ~8 a1 X. s
命令格式:   
3 z# H0 Q! w- @" w$ N- K8 m( j8 mconvert(n, base, beta);      #将基数为10的数n转换为基数为beta的数
5 O+ l' I3 a; A. e. o! E6 I1 L    convert(n, base, alpha, beta);#将基数为alpha的数字n转换为基数为beta的数
/ o: W' F! [% [! A5 ?2 H> convert(2003,base,7); #将10进制数2002转换为7进制数, 结果为: (5561)75 c4 [8 B! j1 S" H5 h* t$ j7 `0 ?
0 W! }7 W1 {1 N3 v: _3 V
> convert([1,6,5,5],base,7,10); #将7进制数5561转换为10进制数
; v! ~/ {/ @0 S 2 J6 O$ C# N+ x0 H" J$ H
> convert(2002,base,60);       #将十进制数2002转换为60进制数, 得33(分钟)22(秒)& D8 R2 x2 ^. E2 {" K

( g6 j9 I$ o% X0 Z& G! v; \    2)转换为二进制形式/ A7 M# m& z, a, t6 d
命令格式: convert(n, binary);
. [% _% N7 E* y) e" C其功能是将十进制数n转换为2进制数. 值得注意的是, 数可以是正的, 也可以是负的, 或者是整数, 或者是浮点数, 是浮点数时情况较为复杂.
: @8 ~$ @6 w" R- [6 k> convert(2002,binary);   7 V) H1 }* H3 w
/ q4 o0 d1 ]4 i! F
> convert(-1999,binary);
; C5 E, Y- _6 f+ {# } ( A( r4 h; C7 b: P5 R* E3 Y- g4 J7 p
> convert(1999.7,binary);
; F. v3 J" u' e8 ]2 l% [4 u7 f5 K
2 K! O7 ], |: p- C+ i) N7 D3)转换为十进制形式8 ~8 d" m( O" K4 a/ K1 O1 \
其它数值转换为十进制的命令格式为:   ) T2 R4 ~4 u6 x6 b  b1 B+ _
convert(n, decimal, binary);   #将一个2进制数n转换为10进制数$ f! k* z+ b: l$ Y4 z. d6 J
    convert(n, decimal, octal);    #将一个8进制数n转换为10进制数
4 T' V1 D9 E. f: H) v. j    convert(string, decimal, hex);  #将一个16进制字符串string转换为10进制数
4 j! n) j; V) _' N9 d" K$ u( d> convert(11111010010, decimal, binary);   
% {" d* Z3 e2 s) @- j 9 _6 @' ]* E; I+ o* v1 ]2 _$ M/ V' q
> convert(-1234, decimal, octal);           
3 L/ H% W* j3 J6 _3 b3 q  j
7 k# V/ I' R2 ^" _+ w> convert("2A.C", decimal, hex);         
' x, {, x! v4 H: D; ?   y9 D7 q* E- B6 _5 C% ^& J
4) 转换为16进制数
$ s5 I4 N* U9 `6 U将自然数n转换为16进制数的命令格式为: convert(n, hex);   
, o5 v* L6 \( A* q3 j/ c) O> convert(2002,hex);  convert(1999,hex);
4 t$ {( L5 x/ ]4 S/ A" }  F
9 l9 q/ P; R% y( ?) I) t8 H: A: q ( O% w0 ^- [) P
5)转换为浮点数
, e2 k& A! V* n1 }- v命令格式: convert(expr, float);' S0 X5 w0 U% W
注意, convert/float命令将任意表达式转换为精度为全局变量Digits的浮点数, 且仅是对evalf的调用.
6 @: n! ^" p6 Y% k5 D3 C> convert(1999/2002,float);
# F. m# \2 x7 Q8 c4 ?$ x$ n / w2 z- E! t0 ^5 M, u
> convert(Pi,float);* v# p2 _: k3 ]$ I& m
/ [# h6 D$ a. o7 M3 i& N, o
2.2 初等数学; T4 B* n$ v/ ?% D  Z1 X( l$ v
    初等数学是数学的基础之一, 也是数学中最有魅力的一部分内容. 通过下面的内容我们可以领略Maple对初等数学的驾驭能力, 也可以通过这些实验对Maple产生一些感性认识. : Y# n: |! m$ G6 t1 ]
2.2.1 常用函数# c1 ?: J* C6 v2 e$ o2 K
作为一个数学工具, 基本的数学函数是必不可少的, Maple中的数学函数很多, 现例举一二如下:   % Z6 P6 }  D. T7 k& U# _9 Q
指数函数: exp
) H6 b2 Z9 N9 z( ~6 ~一般对数: log[a]" @3 \( E0 M; J# f# K
自然函数: ln
5 p$ ?, T9 S& ^7 ^1 O常用对数: log107 R' `! i5 M/ i# }- ]
平方根: sqrt3 _: ?2 _) Y% @1 t
绝对值: abs
: f+ r) x: g$ J三角函数: sin、cos、tan、sec、csc、cot1 `; t( e1 {  r, v( o
反三角函数: arcsin、arccos、arctan、arcsec、arccsc、arccot
" t; O" _; ]" J+ M4 U4 p. S双曲函数: sinh、cosh、tanh、sech、csch、coth- z' G1 S$ f5 G* P7 |7 `9 H# w
反双曲函数: arcsinh、arccosh、arctanh、arcsech、arccsch、arccoth
+ A5 [$ a: L. M- m贝赛尔函数: BesselI、BesselJ、BesselK、BesselY: z  P0 D1 s% t" J
Gamma函数: GAMMA
$ P* I/ @8 g1 ~误差函数: erf
# ?5 d+ T. r0 G$ {" t* Q函数是数学研究与应用的基础之一, 现通过一些实验说明Maple中的函数的用法及功能. ( [$ [7 b6 w- g4 j
1) 确定乘积和不确定乘积
: S. j9 Z5 ~0 C8 s% _6 \命令格式: product(f,k);  * p. V  o1 X+ g
product(f,k=m..n);  
- H/ g7 l$ H4 Oproduct(f,k=alpha); : Z. f  Q( z" @6 x0 d4 E
product(f,k=expr);
  Y' J/ O0 Z+ W% I9 _其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—包含k的任意表达式.
. u. X' r& F  f' }> product(k^2,k=1..10);   #计算 关于1..10的连乘. m. z8 W3 _5 ~; N( H- D& ]6 {: c* ~

' m) Y  i/ e% g5 w; c0 s> product(k^2,k);         #计算 的不确定乘积- e: |5 g  J/ |$ n2 p% u$ |
+ Y8 O' [5 o  [& p8 @2 f
> product(a[k],k=0..5);    #计算ai(i=0..5)的连乘
4 V4 f) ~' o$ g% k& Z# g
3 Q' F7 G3 e. i  F" o/ D8 i> product(a[k],k=0..n);    #计算ai(i=0..n)的连乘  t8 X/ m8 B# a4 c9 e

6 w; k9 T/ A) B: j* k$ A8 [> Product(n+k,k=0..m)=product(n+k,k=0..m);   #计算(n+k)的连乘, 并写出其惰性表达式/ d2 G" A/ p& B5 i
0 x: [7 i9 h) U  n
> product(k,k=RootOf(x^3-2));     #计算 的三个根的乘积
5 g+ m, L6 S! D% n9 |: I8 f1 q * b4 E+ Z6 G0 z. e: z
    product命令计算符号乘积, 常常用来计算一个公式的确实或不确实的乘积. 如果这个公式不能求值计算, Maple返回 函数. 典型的例子是:   % Y( S0 N; z+ E$ ?; P* K
> product(x+k,k=0..n-1);
) T7 K1 X4 i# y8 M8 C$ S
% d8 m. V& [, }1 }% k如果求一个有限序列值的乘积而不是计算一个公式, 则用mul命令. 如:   
  q4 d" e' Y+ ]1 o9 D8 L> mul(x+k,k=0..3);
' {" d; m  I/ D7 J ) F9 U. Y" [. m" v. w
2)指数函数
- b* s( |  x. u" r计算指数函数exp关于x的表达式的命令格式为: exp(x); , L7 s" ]- B' }. {
> exp(1);! H- y/ [$ J% j) V
; r) c! }1 f$ C# g* I8 i
> evalf(%);
! y' e+ `! p3 O& B* y7 l2 D, H " N  i: O( ], T
> exp(1.29+2*I);5 j0 ]( w4 K3 ~  t' W

) Z1 Z1 G: D0 k( x+ ?> evalc(exp(x+I*y));* K& N8 F3 R# q# P/ R

8 c$ f8 Q+ Q% b% P+ P3)确定求和与不确定求和sum6 l, D' y# S4 D) n' @
命令格式: sum(f,k);  ; P: d5 w% b; P2 p5 Y- j6 A, x
sum(f,k=m..n);  - I2 H2 @1 }/ H# J
sum(f,k=alpha);
4 J' ]: M. O. x5 P; c! [5 wsum(f,k=expr);
" a; N: W( T8 @3 _7 B) J, C/ T9 u, n其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—不含k的表达式. / o! J* A( E9 \( i& e5 e( ~. M
> Sum(k^2,k=1..n)=sum(k^2,k=1..n);. f7 X6 g& [2 k  [5 r* {

; S, V! p1 a$ w$ E5 d> Sum(k^3,k=1..n)=sum(k^3,k=1..n);
4 Y% j8 y# S+ Z5 h+ A $ ~/ K: _3 }. ?
> Sum(k^4,k=1..n)=sum(k^4,k=1..n);  }4 y! p1 O3 E

( o" `+ l5 o8 e& t, F> Sum(1/k!,k=0..infinity)=sum(1/k!,k=0..infinity);. p& ?* m, b8 P, V! K4 G" j3 \# ]

1 \& k* r3 r0 I8 T> sum(a[k]*x[k],k=0..n);( F/ i2 r! k; F2 X5 T) h

4 i7 E" {+ [% |4 Z; [2 J> Sum(k/(k+1),k)=sum(k/(k+1),k);; V4 {* s  B% O

% @' J1 s+ S' ?> sum(k/(k+1),k=RootOf(x^2-3));% h) i* ?2 {; u$ [) L# k
) R( r- ]' r* n7 M3 D" ?) H& c2 g
sum函数可计算一个公式的确定和与不确定和, 如果Maple无法计算封闭形式, 则返回未求值的结果. 值得注意的是, 在sum命令中将f和k用单引号括起来, 可避免过早求值. 这一点在某些情况下是必需的.
* a' L! V0 e" f% J( F0 k> Sum('k','k'=0..n)=sum('k','k'=0..n);
8 X5 E8 G3 S* z- J+ L1 J* Z
8 E4 m* h3 Q4 r! F# k( r如果计算一个有限序列的值, 而不是计算一个公式, 可用add命令. 如:   
7 k4 }1 y% r2 M5 @> add(k,k=1..100);
* b/ ^, l3 j% ~/ O
5 T6 E* Q4 ~3 v! V1 R尽管sum命令常常用于计算显式求和, 但在程序设计中计算一个显式和应该使用add命令.
0 N1 S2 j5 t, V9 E! d& Q另外, sum知道各种求和方法, 并会对各类发散的求和给出正确的结果, 如果要将求和限制为收敛求和, 就必须检查显式的收敛性.
1 y3 Y9 ~9 r- e& ?8 ?3)三角函数/双曲函数
. \* a; P. Y; }0 I% \6 h% L( g) J命令格式:   sin(x);   cos(x);   tan(x);   cot(x);   sec(x);   csc(x);
* a& K  E! ^+ ^$ L          sinh(x);  cosh(x);  tanh(x);  coth(x);  sech(x);  csch(x);$ W- t- ]- X) p4 t& ?
其中, x为任意表达式. 4 h5 f5 w+ ?* j6 n) Y
值得注意的是三角函数/双曲函数的参数以弧度为单位. Maple提供了利用常见三角函数/双曲函数恒等式进行化简和展开的程序, 也有将其转化为其它函数的命令convert.
/ [' e/ z( F. L! z9 F> Sin(Pi)=sin(Pi);
. d; t" J2 Z- x9 ? ( D! ^. F+ a; A2 a
> coth(1.9+2.1*I);
, v6 B% R3 R  X; u. u/ r 4 ]( K' Y) n( B7 n! a
> expand(sin(x+y));     #展开表达式+ U. J4 d( A& u, `( g6 K+ `2 x
# U$ g9 o. H& p. @8 k
> combine(%);        #合并表达式
6 H; ^. b" P& i
$ e% q  g5 \% o" D3 v% @0 |; w> convert(sin(7*Pi/60),'radical');
, e7 g8 Y% x6 U. q) ?- q
8 Z0 f/ T' h- q. D9 x. c8 a- d, f# u> evalf(%);9 M9 Y$ I9 F- [+ D
( l8 `1 e6 F2 a3 {9 L% }- ?1 Y
但有趣的是, combine只对sin, cos有效, 对tan, cot竟无能为力.4 b- i; p2 }' q; F- B: ^" G
4)反三角函数/反双曲函数( [. Q6 @9 C- a, T8 b
命令格式: arcsin(x);   arccos(x);   arctan(x);   arccot(x);   arcsec(x);   arccsc(x);/ U4 r3 G2 w6 \/ J
     arcsinh(x);  arccosh(x);  arctanh(x);  arccoth(x);  arcsech(x);  arccsch(x);   7 V6 ^! {8 g7 k; w
arctan(y,x);
5 {9 a. A1 K0 E5 Q7 Q; o6 b1 S其中, x, y为表达式. 反三角函数/反双曲函数的参数必须按弧度计算. : Q- e! W) \. K  E0 Y0 p
算子记法可用于对于反三角函数和反双曲函数. 例如, sin@@(-1)求值为arcsin.& W$ o0 M9 u) J+ ~, X5 ]  A) E+ T
> arcsinh(1);
9 H3 M" u- o* U7 h& [1 ~
& R8 P7 m; {8 l, m" w' J. w7 t> cos(arcsin(x));+ U* V1 v; X/ H3 ]
, d+ Y* I3 k  v, P8 H2 M: L
> arcsin(1.9+2.1*I);  ~+ J9 P- q! o, G/ y

1 i4 j: M  S8 O5)对数函数
) i& j9 z2 P, q命令格式: ln(x);           #自然对数$ X) Y" [6 k6 |+ _0 L& J3 U
log[a](x);        #一般对数) \+ f7 i, \/ }
log10(x);        #常用对数
' U% z2 q3 ~1 b3 I' h一般地, 在ln(x)中要求x>0. 但对于复数型表达式x, 有:   
! _) g3 l% q3 j0 B( h/ W( u  (其中,  )
7 f8 n! ~  C2 Z! @" A; R> ln(2002.0);8 m7 F; ]! p2 v
) j5 s' C- F5 b/ g- A* r
> ln(3+4*I);
7 L6 j$ w# f5 r+ @4 n& U$ S3 `
* |* J1 i+ y8 e* Y5 |> evalc(%);    # 求出上式的实部、虚部7 w9 P+ {( \" p; Z1 j

5 F* L6 K0 n; u1 l; F> log10(1000000);
9 V) {( \! `3 Q
; S+ g" \" C+ b: Q1 m! \5 Q> simplify(%);   #化简上式3 o: A& m# ?1 _+ L$ C

  z7 ~7 y3 f* _' U# T; H2.2.2 函数的定义
7 T1 C) G4 t$ u- [( gMaple是一个计算机代数系统, 带未知或者已知字母变量的表达式是它的基本数据形式. 一个简单的问题是, 既然表达式中可以包含未知变量, 那么它是不是函数呢?试看下面一个例子:   
# M: Y7 `, w1 E6 |% L4 M/ E> f(x):=a*x^2+b*x+c;5 C! d3 N( Z7 m
2 @) u+ g/ u5 Z6 t
可以看出, Maple接受了这样的赋值语句, 但f(x)是不是一个函数呢?要回答这个问题,一个简单的方法是求函数值:   
/ L/ b+ A$ [% {5 I> f(x),f(0),f(1/a);
' ]7 F7 x6 c9 ~: v( J! u8 C% A- u
8 }8 E& E* {( s2 Q7 I- v由上述结果可以看出, 用赋值方法定义的f(x)是一个表达式而不是一个函数, 因为f(x)不能把所定义的“自变量”或者“参数”转换成别的变量或表达式. 但从赋值“过程”可以看出, f(x)虽然也算是一个“函数”, 但却是一个没有具体定义的函数:   ' j- o8 j) `: x2 |
> print(f);
# k) k% ^2 x5 v# d 6 ?5 `9 a3 X7 R1 q" L+ |
事实上, 我们所做的赋值运算, 只不过是在函数f的记忆表(remember table)中加入了f(x)在x上的值, 当我们把自变量换作0或1/a时, f(x)的记忆表中没有对应的表项, 所以输出结果就是抽象的表达式.
9 `! R, X# X5 i7 L* }& I. t" `! P在Maple中, 要真正完成一个函数的定义, 需要用算子(也称箭头操作符):   
2 b& c! G$ ~. U6 V/ l0 H4 l> f:=x->a*x^2+b*x+c;
" q. r7 z, e4 h  ^  Z4 _- E
3 i( T3 F( |3 f/ d# b, r> f(x),f(0),f(1/a);+ ?: f# I2 I8 G9 t/ A8 u& _

$ {1 V' s0 ]  y1 \- ~+ _多变量的函数也可以用同样的方法予以定义, 只不过要把所有的自变量定成一个序列, 并用一个括号“()”将它们括起来(这个括号是必须的, 因为括号运算优先于分隔符“,”). + i3 B; t- ^& }6 E. c" C
> f:=(x,y)->x^2+y^2;
8 j$ l6 G0 u9 ^+ Y1 }+ U' Z 3 _8 u2 c( ?% [% b3 j) |
> f(1,2);! _  z% g. V5 {$ x5 j' N

  c+ X1 S. K" }9 S9 l* i' |> f:=(x,y)->a*x*y*exp(x^2+y^2);
  g4 n9 x7 [, W$ c
$ T8 u& h# H  }6 q综上所述, 箭头操作符定义函数的方式一般为:   
0 [/ c' F! {4 x一元函数: 参数->函数表达式6 }$ B8 U# X  T$ [7 H
多多函数: (参数序列)->函数表达式
' Y& `* h! c( f1 |" O, C无参数函数也许不好理解, 但可以用来定义常函数:   
2 `& T. {5 l8 E0 `/ S* K1 ?' `> E:=()->exp(1);1 a. T& c  g8 p

. ~$ C2 J- {; K% X> E();! _4 n, m5 K) d( t3 R

0 X$ L% T& H$ ~3 }" u) O> E(x);, @4 U+ _* y7 ?# v: K
+ ~6 k. Z( i; ~8 c
另一个定义函数的命令是unapply,其作用是从一个表达式建立一个算子或函数.
8 Q( m1 y3 Q% a0 y0 r6 q+ K定义一个表达式为expr的关于x的函数f的命令格式为:  f:=unapply(expr, x);          / l1 J3 `! S5 ]( T: ^
定义一个表达式为expr的关于x,y,…的多元函数f的命令格式为:  f:=unapply(expr, x, y, …);     , L# `2 l4 {) t. Z( b
> f:=unapply(x^4+x^3+x^2+x+1,x);2 O' H4 j) v, z& g/ C+ t; v% t: ~
0 N! u) @: Z. W  ?- U
> f(4);
; @  p7 D: p4 d
* b7 O: t2 |8 b- G. j+ V9 U6 d8 I> f:=unapply(x*y/(x^2+y^2),x,y);, \/ ?/ q% @. U, T
0 [" l4 y3 W. g- K( q
> f(1,1);) z+ B1 j* N0 O+ s: x

/ f( ], H( a& k9 \& {0 @借助函数piecewise可以生成简单分段函数:+ I7 d1 C% ?8 e
> abs(x)=piecewise(x>0,x,x=0,0,x<0,-x);7 w, w. t3 x( g* b
+ x& M- V5 y" w/ q2 P
清除函数的定义用命令unassign. * ?) J3 q, H1 X5 Z* @) o2 t4 S
> unassign(f);
+ K  ?& l0 s2 M+ Y8 D, e. a: I. @> f(1,1);: J# L: ?, i$ Q9 G$ y
1 W+ X  [1 r" `
除此之外, 还可以通过程序设计方式定义函数(参见第6章). . |) A' m4 G1 z
定义了一个函数后, 就可以使用op或nops指令查看有关函数中操作数的信息. nops(expr)返回操作数的个数, 函数op的主要功能是获取表达式的操作数,其命令格式为:( d; _- M( u" `
op(expr);          2 Q) o  c3 k' g+ p
op(i, expr);         
3 R9 g: \$ R: `; j- hop(i .. j, expr);      
7 e6 @! N2 q( d6 s( Jnops(expr);
1 ~/ j6 k$ ?. Y: `7 v" ?% p5 p/ d, G) _如果函数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的类型.
" }5 v; Z+ y4 h) u1 M4 G' h命令op(i .. j, expr); 执行的结果是expr的第i到第j个操作数, i..j中含负整数时的情形同上.8 \2 G2 ?" P& x( y
命令op(expr); 等价于op(1..nops(expr), expr);
% B3 }* N! l1 g* Z* c( ]特别地, 当op函数中i为列表[a1, a2, ..., an], 则op([a1, a2, ..., an], expr); 等价于op(an, op(..., op(a2, op(a1, e))...)); ' Y0 \8 z, O! @$ @: y! g
而当expr为一般表达式时,nops(expr)命令返回的是表达式的项数, 当expr是级数时返回级数每一项的系数和指数的总和.   J' y: x( [& M9 m$ W. V
> expr:=6+cos(x)+sin(x)*cos(x)^2;
+ l' N% P; B3 D* @) E1 ^# [: t
) J6 ?% u' T& M, W- p> op(expr);- }. p- s% `/ u9 v5 E

/ N' K0 a$ B" k9 d# u8 A> nops(expr);
+ m. S9 s0 w3 a( p# u. Z : Y0 q" x" O* S. M
> p:=x^2*y+3*x^3*z+2;2 `1 `  K. r: y

4 T* ], i2 P1 R  H> op(1,p);
" v0 B, i% C% @) u+ p. V $ w& R4 R2 E: ~6 i6 `
> op(1..nops(p),p);! k7 l% T. F* {) f. C! ]# _

/ e- o9 \' r! N5 D4 `6 x> op(op(2,p));8 Q- W4 E$ f( g. S# J6 L

# F/ k# u* l+ u. ?# y> u:=[1,4,9];
. p- k- U, O% S2 }2 ?" X3 h# @* r
/ N' U7 R/ m6 V! f6 `8 |' W1 R> op(0,u);! d# G) @' ?2 |1 a& F
: {; c8 c% A$ ?9 s, i' X7 o
> s:=series(sin(x),x=1,3);- I. H% D; k' b+ R
0 w4 n3 S+ C. @  n
> op(0,s);
, j7 A( [& Y8 b5 D7 V7 G' f$ O1 b. |! v        
7 w" e( ?# j, g5 M> nops(s);
0 t, b4 Y" B, J0 b( U1 f : Q' r# s. `2 f/ \' M" ]" y: R
下面一个有趣的例子说明了Maple在处理算术运算时的“个性”:4 h0 N: @5 _& H; p
> op(x*y*z);' P+ P  U; _2 U' t0 P7 a3 R

1 _* X' \* d# g> op(x*y*z+1);2 c+ d, H, n* ^& c
* R% B' M: @' v3 W
2.2.3 Maple中的常量与变量名! N% |3 O* H4 i3 K
为了解决数学问题, 一些常用的数学常数是必要的. Maple系统中已经存储了一些数学常数在表达式序列constants中:   
2 _, Q5 u$ Y4 P& [7 p0 ~0 Z> constants;
! V: h, x" `# m" h' G+ X 2 m  b4 v7 u9 J/ G0 \7 B8 V
为了方便使用, 现将上述常数的具体含义列示如下:   
% r9 i7 c1 d' |6 V8 e. r& B3 s常    数        名 称        近似值4 U8 E$ s! {& \( K. j
圆周率 ( n8 @& B2 a! |* j, s
Pi        3.14159265357 a7 @$ f9 U6 n, C
Catalan常数 & q8 J4 \1 j' S# C3 g# [4 }
Catalan        0.9159655942& X) U: b' X7 u8 A3 F
Euler-Mascheroni常数 . d: Z2 u7 [7 q3 O! _0 T& s+ L1 n
gamma        0.5772156649" e% e" k: w1 S# M" {

0 b+ ]& x* {: }infinity       
# d/ S! y7 t* c! J) X& T
* o$ I) _( b6 {0 [6 }需要注意的是, 自然对数的底数e未作为一个常数出现, 但这个常数是存在的, 可以通过exp(1)来获取.
9 h; I6 P+ w& Q$ O0 @5 h在Maple中, 最简单的变量名是字符串, 变量名是由字母、数码或下划线组成的序列, 其中第一个字符必须是字母或是下划线. 名字的长度限制是499个字符. 在定义变量名时常用连接符“.”将两个字符串连接成一个名. 主要有三种形式: “名.自然数”、“名.字符串”、“名.表达式”. 5 k  c1 n+ @+ j9 i- h0 Y+ m) `
值得注意的是, 在Maple中是区分字母大小写的. 在使用变量、常量和函数时应记住这一点. 数学常量 用Pi表示, 而pi则仅为符号 无任何意义. 如g, G, new_term, New_Team, x13a, x13A都是不同的变量名.
2 [1 F: C! C' W% F在Maple中有一些保留字不可以被用作变量名:   
: d/ c# n% G$ k( n* H( Xby      do      done     elif     else     end        fi        for      # d8 _; X) C$ T6 u5 y" q( @$ E5 D! [
from    if       in       local     od     option    options     proc         
5 k. O* |" z3 l. K& V& M8 aquit    read     save     stop     then     to        while      D
5 W2 Z# G6 ^1 ^% qMaple中的内部函数如sin, cos, exp, sqrt, ……等也不可以作变量名.   }2 P7 u; {$ |
另外一个值得注意的是在Maple中三种类型引号的不同作用:   ' p( ]: O* ?! o8 P2 T. w' \
`  `:   界定一个包含特殊字符的符号, 是为了输入特殊字符串用的;   
; z6 e! i% d$ g, }1 ^3 D: d'  ':   界定一个暂时不求值的表达式;   
3 s4 N( _5 E" V1 u' S"  ":   界定一个字符串, 它不能被赋值.
' r: R) J) G, U' l, B8 w) t2.2.4 函数类型转换           
+ i2 E% K8 E2 a函数类型转换是数学应用中一个重要问题, 譬如, 将三角函数转换成指数函数, 双曲函数转换成指数函数, 等等. 在Maple中, 实现函数类型转换的命令是convert. 命令格式:  3 @4 F, B; i$ {4 N# Q
    convert(expr, form);        #把数学式expr转换成form的形式4 m, I5 P  l2 f) d6 U# F
convert(expr, form, x);      #指定变量x, 此时form只适于exp、sin、cos
" [$ [5 u9 p) W- `1 }% pconvert指令所提供的三角函数、指数与函数的转换共有exp等7种:   
+ K$ \" L% f* }$ W: ~) i(1) exp: 将三角函数转换成指数
" O+ ^7 c+ W- U1 b8 I(2) expln: 把数学式转换成指数与对数
* t: I/ v3 ?* b(3) expsincos: 分别把三角函数与双曲函数转换成sin、cos与指数的形式0 a) |" Z) ?/ \- a
(4) ln: 将反三角函数转换成对数# B' b1 k8 x6 ], k, q
(5) sincos: 将三角函数转换成sin与cos的形式, 而把双曲函数转换成sinh与cosh的形式
, F; r; i" n' M8 V  T(6) tan: 将三角函数转换成tan的形式# E2 S- M" j5 P2 k1 P( e
(7) trig: 将指数函数转换成三角函数与对数函数
( q! _. G7 [8 r! @3 D# h> convert(sinh(x),exp);   #将sinh(x)转换成exp类型
5 z" W6 r' t9 i1 ?! {  k# ]0 ^ $ q! O0 Y6 Y: ?8 O7 y
> convert(cos(x)*sinh(y),exp);
# I" {: n1 O' |  z/ k   t) q0 o0 {6 J+ o) ~
> convert(cos(x)*sinh(y),exp,y);- E( h2 n0 C& r3 p9 W$ H- N
2 C. s* G. B3 V" m- n
> convert(exp(x)*exp(x^(-2)),trig);9 @( E0 G! J. B# U! a& U
0 V7 h. Q3 Z5 |' k
> convert(arcsinh(x)*cos(x),expln);+ G! W3 W) f/ ~& X' ^

. L9 \* i) {+ F4 o$ s> convert(cot(x)+sinh(x),expsincos);5 U( g$ J1 w' |% q# f

) W! H4 D! r8 ~1 J% Y% q> convert(arctanh(x),ln);2 ~+ n" E8 m+ B3 A. R5 ]2 S& L

* |( K  D- v0 u. z4 h5 A- Sconvert在有理式的转换中也起着重要的作用. 在有关多项式运算的过程中, 利用秦九韶算法可以减少多项式求值的计算量. 在Maple中, 可以用函数convert将多项式转换为这种形式, 而cost则可以获取求值所需的计算量. 注意: cost命令是一个库函数, 第一次调用时需要使用with(codegen)加载. 例举如下:   ; ]/ w- ?! `/ X5 f% J
> with(codegen):
# H. ?  ~6 E) x> p:=4*x^4+3*x^3+2*x^2-x;
1 M. [+ f9 D/ u7 ?( O1 i ; f& H% E+ u. |  i5 }& F2 _8 @0 f. j$ T
> cost(p);
$ K: S1 e9 b1 ?3 |  Y: F6 D, c' \9 Y & r' ^/ d3 w1 f% U3 R
> convert(p,'horner');  #将展开的表达式转换成嵌套形式' ]7 ?$ \5 }: u0 v8 |( X# D
, n) m0 F( ?0 l% k6 O% ^" q( J: U
> cost(%);
" H2 ^" x# B/ f. j5 z& j* |2 Y ' ~' f5 U7 E% i
同样, 把分式化成连分式(continued fraction)形式也可以降低求值所需的计算量. & q/ R! l- p3 H0 K& j& b9 `. `
> (1+x+x^2+x^3)/p;  W% Q7 c- a0 _9 x, ], n+ ^
( M' O' M- D5 y- u; ?
> cost(%);) R" p2 {' K3 x4 t4 c) W. z

: H$ F7 h! ~6 w$ I> convert(%%,'confrac',x);2 X: ~$ t7 K- Y$ {8 t) m$ G
. e, S# G% Q4 s% R0 U8 |
> cost(%);
8 L3 ~% I) ]- l) F5 e
5 s9 U7 Q1 s% H- x在某些场合下(比如求微分、积分时), 把分式化成部分分式(partial fraction)也就是几个最简分式的和式的形式也可以简化运算, 但简化程度不及连分数形式. 9 [" y& M) w8 E9 V5 T1 k# n; E: k2 x0 m. R
> convert(%%, 'parfrac',x);
& a- M2 c  `# S & g% o# C5 O6 R- E
> cost(%);" E6 E, u  M- G5 o, P8 w4 m

+ S8 l! N1 E* @$ v. V$ d而把分数转换成连分数的方法为:
5 R8 N' T6 g$ @# B, Q( O+ B> with(numtheory):
6 ~9 E# g2 c) f( }2 P7 J7 U1 @> cfrac(339/284);, \& n2 n% k* I" `& Y
1 i, s' U$ @' N: r0 k
2.2.5 函数的映射—map指令! M8 A) P: H; F4 N% m$ b5 R7 S: Z
在符号运算的世界里, 映射指令map可以说是相当重要的一个指令, 它可以把函数或指令映射到这些结构里的元素, 而不破坏整个结构的完整性. 命令格式为:, V  G, p6 V& C1 C
map(f, expr);      #将函数f映射到expr的每个操作数
$ D* u0 s5 _! {6 D. B- _0 |map(f, expr, a);    #将函数f映射到expr的每个操作数, 并取出a为f的第2个自变量
6 w, d; g: d1 ?. v8 O2 M) W1 emap(f, expr, a1, a2,…, an); #将函数f映射到expr的每个操作数, 并取a1~an为f的第2~n+1个自变量
5 D0 \2 w. S8 B' W3 W6 Cmap2(f, a1, expr, a2, …, an);    #以a1为第1个自变量, expr的操作数为第2个自变量, a2为+ \0 I: E* F$ J& L6 Z
第3个自变量…, an为第n+1个自变量来映射函数f1 X0 ]9 i1 V3 w( a1 v
> map(f,x1+x2+x3+x4,a1,a2,a3,a4);7 E2 Z" f4 ~0 X4 t# `4 v
; ]- n  x) E, \% W/ a
> f:=x->sqrt(x)+x^2;" |6 C% X4 [2 ^: B  @' z5 n

2 P' ~, `( N8 x6 ^  ]> map(f,[a,b,c]);
/ }- n* f2 w# q/ V 3 z: j7 c0 U( L6 J8 a
> map(h, [a,b,c],x,y); ! @$ e: z4 B7 S" v

0 k/ ~' w+ U' s: u5 c2 x5 N> map(convert,[arcsinh(x/2),arccosh(x/2)],ln);
4 ^. r; ~4 G% i# w. h  a
2 ?- ^8 l! R3 @4 s7 ~. P: }> map(x->convert(x,exp),[sin(x),cos(x)]);# B- S9 @) D+ H

+ p( A; ^& a4 w& Q) w上式的映射关系可通过下式理解:. P2 J  a) r; K, Z8 n
> [convert(sin(x),exp),convert(cos(x),exp)];* N! z, v9 I( E9 C1 ?  m
1 o0 G/ ~5 z5 }; c+ |
> restart:
9 Z/ Y! _' x9 [4 b3 ]8 c- ~2 G: omap2(f,a1,x1+x2+x3+x4,a2,a3,a4);
. x9 }6 |3 g  G% O5 M4 X$ k3 Q- j
7 \/ r8 [  w: M  A: ~+ O* l6 I> map2(max,k,[a,b,c,d]); % y5 x# i  m" t5 B3 y& @3 l7 |

: M; W$ _( ^! r* Y再看下面示例:   
$ c1 y/ {2 l/ @2 r% o' Y: y/ B$ s> L:=[seq(i,i=1..10)];8 q0 e: m: G( M" N6 U% A& F( F
4 \# m" P0 [+ o: n0 @
> nops(L);
, E4 J+ R, R: E& s 3 ]7 v6 M5 q7 F) f  J$ O( m
> sqr:=(x)->x^2;3 ~. I* L5 C" ?3 `( d8 P- \
8 X3 j: h8 I) O3 q1 i
> map(sqr,L);* d8 w6 m/ k& x) W& e* u

$ ]5 m# z* i+ ~> map((x)->x+1,L);# J' {& S% C8 g7 L

) y4 L/ S1 y; Q7 ]$ B5 M% ?* x+ Z> map(f,L);4 F. V. U$ Y7 e

2 K: q' S5 p/ B2 E& r> map(f,{a,b,c});% e( k) X7 p* p7 r
( c4 e/ Z7 U/ I
> map(sqr,x+y*z);
" @$ D& H6 F8 S# n
+ P' |  Z& d- Y! x  N> M:=linalg[matrix](3,3,(i,j)->i+j);1 z! }  `! }  ^3 W

5 Z$ y) d/ i! Y# Q> map((x)->1/x,M);
; J1 k* {1 G5 ~1 n. c8 Q6 T
: j& P; ]" R8 T5 X! U3 求 值# M& e( k% i  W1 E/ l: b
3.1 赋值' s; U5 P) v) M% v
在Maple中, 不需要申明变量的类型, 甚至在使用变量前不需要将它赋值, 这是Maple与其它高级程序设计语言不同的一点, 也正是Maple符号演算的魅力所在, 这个特性是由Maple与众不同的赋值方法决定的. 为了理解其赋值机制, 先看下面的例子. + S# e8 Q& Q6 `# z! _! m2 u! _
> p:=9*x^3-37*x^2+47*x-19;
/ u8 K/ I6 I$ X0 R; u - d. W, m" q& [5 x: r/ D
> roots(p);4 R. O' h7 v- P  f* N5 [7 G. h. O
8 v' X$ m' W2 X! M8 K; f# M
> subs(x=19/9,p);
  n6 s$ r' x: T
  n0 x# A; W* k( B: |5 c- @7 t在这个例子中, 第一条语句是一个赋值语句, 它的作用是把变量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;”这样的简单语句即可验证. 3 M4 m# w6 w% N5 K# r1 c
3.2 变量代换. _- K( x5 c! K0 E8 m1 V0 \2 l
在表达式化简中, 变量代换是一个得力工具. 我们可以利用函数subs根据自己的意愿进行变量代换, 最简单的调用这个函数的形式是这样的:   1 n! m& }- m  a) M) l) A& ^
subs ( var = repacedment, expression);" ^- b% A( q# j6 c- T9 \& J
调用的结果是将表达式expression中所有变量var出现的地方替换成 replacement.
0 M2 ?$ [  M. l# U9 ?. f( F> f:=x^2+exp(x^3)-8;* z: j' e" t( t& ~( G9 S7 `

3 w$ E* `6 X4 z1 e9 h# F> subs(x=1,f);
8 x: z' K+ r* `8 N+ W* C / H; S4 b! n9 F" t1 g. M! {
> subs(x=0,cos(x)*(sin(x)+x^2+5));
8 S: z" r3 [" o& a8 }( w+ q" u
( V. t. _: k7 C7 a    由此可见, 变量替换只得到替换后的结果, 而不改变表达式的内容, 而且Maple只对替换的结果进行化简而不求值计算, 如果需要计算, 必须调用求值函数evalf. 如:   4 V0 D7 K. O6 }
> evalf(%);
0 W+ T) E* b* l8 D3 l1 L( n
- @  _, ]3 L% |8 |9 g2 r( k, E变量替换函数subs也可以进行多重的变量替换, 以两重代换为例:   * d7 J% {, o$ B
subs (var1 = repacedment1, var2 = repacedment2, expression)3 s5 f8 H' L( p! S1 K  i8 H# B
调用的结果和按从左到右的顺序连续两次调用是一样的, 也就是先将expression中的var1替换成replacement1, 再将其结果中的var2替换成replacement2, 把这种替换称作顺序替换;    与此相对, 还可以进行同步替换, 即同时将expression中的var1替换成replacement1, 而var2替换成replacement2. 同步替换的调用形式为:   
3 h/ ~1 ?7 r& C" @subs ( {var1 = repacedment1, var2 = repacedment2 }, expression)
; w8 d  \/ T+ G* u% M1 ^; S下面通过例子说明这几种形式的替换. * d. O) Z! U+ l# z3 N5 h- O
> subs(x=y,y=z,x^2*y);              (顺序替换)
: V& l. q, r0 l3 v( h
; ?/ `- M, g$ o% Y, `, O  J> subs({x=y,y=z},x^2*y);            (同步替换)/ ^) C4 x( s9 z8 ^- \1 U
( s$ S% [% n4 l0 Z, o
> subs((a=b,b=c,c=a),a+2*b+3*c);   (顺序替换)
4 W4 \- r. Q7 M 8 f; `( m+ f+ y
> subs({a=b,b=c,c=a},a+2*b+3*c);    (轮  换)/ L% O- T" [8 \: V4 M
3 x+ I; k* J! q- _; n& d6 I
> subs({p=q,q=p},f(p,q));             (互  换)- W& {3 w( L- e* u! c+ u9 j
- v# v3 G; d) Y/ ?2 h! Q  |
3.3 假设机制
9 p) y: ~2 E- j0 T$ q7 |) vMaple是一种计算机代数语言, 显然, 很多人会尝试用Maple(或其他计算机代数语言)解决分析问题. 但由于分析问题与处理问题的考虑方法不同, 使得问题的解决存在某些困难. 例如考虑方程 的解. 如果k是实数, 结果显然是x=1, 但如果k是 的复根, 为了保证解x=1的正确性, 必需添加附带条件: 也就是当 时x=1. 这是一个对结果进行正确分析的例子. 然而从代数的角度考虑这个问题时就会把k当作不定元, 此时k没有值, 从方程两端去除k的多项式是合法的, 只要这个多项式不是零多项式即可(这一点是可以保证的, 因为其所有系数不全为0). 在此情况下x=1就不需要任何附加条件. 计算机代数系统经常采用这种分析的观点. 2 H6 Y: q& U& n8 f% s% K% b+ L
在Maple中, 采用分析观点解决这类带有一定附加条件的实用工具是函数assume, 其命令格式为: assume(x, prop);0 T8 d% N% f* U: N, d
函数assume界定了变量与变量之间的关系式属性. assume最普遍的用法是assume(a>0), 该语句假设符号a为一个正实常数; 若假定某一符号c为常数,使用命令assume(c,constant); 另一方面, assume可以带多对参数或多个关系式. 当给定多个参数时, 所有假定均同时生效. 例如, 要定义a<b<c, 可以用assume(a<b, b<c); 同样地, 要定义0<x<1, 可以用assume(0<x,x<1). 当assume对x作出假定时, 以前所有对x的假定都将被删除. 这就允许在Maple中先写“assume(x>0);”后再写“assume(x<0);”也不会产生矛盾. 2 P- Y1 K3 n: W$ f" z, G- e
> Int(exp(-s*t),t=0..infinity);
* Z% z7 Q& @( Y' |8 J( C" F ( \% Z* S2 ~# |, E4 L2 S/ k3 I4 b
> value(%);
: ]0 C0 G6 v$ RDefinite integration: Can't determine if the integral is convergent.0 Y9 C6 {/ o) {, i: Z, r
Need to know the sign of --> s
  S6 @6 l; k; @$ p- u0 jWill now try indefinite integration and then take limits.* F. l4 |/ N. W3 q. e

4 E7 Q" }1 l( _6 y% l6 O! M8 M+ `> assume(s>0);2 _+ S0 z# ?4 N' v
> Int(exp(-s*t),t=0..infinity);1 w; K. r; a$ _

* g) w- l- O- Z2 {8 [; i> value(%);
1 `2 a( A; h* n( J: k( `2 \  ^
8 m: _* `9 H- w5 i3.4 求值规则
6 t6 M, |, a# E- a9 Q在多数情况下, Maple的求值规则设计为做用户期望的事情, 但要做到这一点很困难,因为不同的人在相同的情形下会有不同的期望. 在大多数情况下, 全局变量被完全求值, 局部变量被一层求值. 而由符号' '界定一个暂时不求值的表达式, 单步求值仅去掉引号, 不作计算, 这也是允许取消指定名字或清除变量的原因. 如下例:   
2 B7 n& ^7 `+ ], b# }, @# [# d> x:=y;/ y0 m7 q, b, l) e2 z/ I
6 ?9 R  P4 Y; Y( @
> y:=z;, P  R: ?- d, Y7 Q+ \) l2 g3 C/ t
1 I9 h# z1 A& }- |- }% I
> z:=3;8 U: _" V, t% R" ?

; C! w; `3 K: d6 Q$ a0 a> x;
8 `1 e7 U+ w: J* P3 g& ~9 ?/ @ $ m( e) R9 d7 ^+ p
> y;
+ a6 @" ]+ B7 W5 E0 Y$ i; E' m& | ( R6 |: u8 Z0 f& f/ d
> x:='x';/ Q* k  e2 u+ A3 |' c: I" o- f0 y0 v9 E

1 D3 Y- A9 @# v7 T( a1 a3 e$ p> x;! \! R0 b) @, `& z# R: ]

* O  n  h5 v! V> y;
/ x/ ^) u! H: [# e/ s % s0 s% A. |3 v( z& U
对于不同的问题, Maple设计了不同的求值命令. 现分述如下:   
6 f0 X4 i1 J9 V) [2 ]' x1) 对表达式求值
' K' X3 t( Q1 t4 q: M1 V命令格式: eval(e, x=a);  #求表达式e在x=a处的值7 A* }* D/ A' u/ f5 K; e% p) v2 j
             eval(e, eqns); #对方程或方程组eqns求值/ N  k( [/ T, x' D
             eval(e);      #表达式e求值到上面两层
3 s, [1 r  n3 \2 W/ K             eval(x,n);    #给出求值名称的第n层求值
6 e3 {& |; o8 H" [5 T. K> p:=x^5+x^4+x^3+x^2+x+73;
/ n1 P- @; J2 |" E/ F. d8 V
1 r$ [0 U! c! T) z& `" l> eval(p,x=7);
9 F  ?# F5 T  Q) _6 M0 x1 r  A
% x+ `" [% }3 f( u! l( }7 E> P:=exp(y)+x*y+exp(x);
, M0 e: f0 j9 A* k* n
- [  D1 Y6 h2 p8 [/ K: p8 X> eval(P,[x=2,y=3]);
, k3 d* @/ q1 w1 F& b; ^5 O' D$ C 4 G) k: r4 q! g: f/ s
    当表达式在异常点处求值时, eval会给一个错误消息. 如下:   ! g9 |2 h) X, _9 c* |& F, L9 m
> eval(sin(x)/x,x=0);3 Z% z0 X% O7 z. {0 X! ~
Error, numeric exception: division by zero; A4 }' r( U, h3 L  |
    下面再看使用eval进行全层求值或者对名称几层求值的示例:   
( O/ \; Q7 }% u/ u> a:=b: b:=c: c:=x+1:
3 T* ?3 _  i9 ?* @6 X2 ]+ ?1 J> a;              #默认的全层递归求值3 y$ q2 w: O) ~" T

& U3 L3 x( {6 i$ y& l3 E3 d1 t> eval(a);        #强制全层递归求值
4 K2 ^, f# m% W- I
; R& _* y, H* _# |' t> eval(a,1);       #对a一层求值+ B7 r8 G9 ~6 {; a  H: P/ S
; q( F4 B7 r1 R' f6 Y8 J9 _+ z
> eval(a,2);       #对a二层求值
: i$ G1 i1 Y4 J9 q9 j
2 m! g  i) C! b7 W9 \) _! V> eval(a,3);       #对a三层求值
7 W; S% J& j9 T
' L! U1 @  N' k0 p5 n7 R8 x5 V> eval(a,4);       #对a四层求值
7 [* b3 V) a$ Y4 W) Z
! z9 D6 Y7 [+ R* _* b! X1 b    2) 在代数数(或者函数)域求值
5 \. G( D, U6 s+ U命令格式: evala(expr);       # 对表达式或者未求值函数求值/ Y* J. b+ }5 X6 Q
             evala(expr,opts);   #求值时可加选项(opts)% b- |# b# O; k, p
所谓代数数(Algebraic number)就是整系数单变量多项式的根, 其范围比有理数大, 真包含于实数域, 也就是说任意实数都是整系数多项式的根(如 就不是任何整系数多项式的根). 另一方面, 代数数也不是都可以表示成为根式的, 如多项式 的根就不能表示成为根式的形式. ; e9 f% s- b& k" v7 j
代数数的计算, 算法复杂, 而且相当费时. 在Maple中, 代数数用函数RootOf()来表示. 如 作为一个代数数, 可以表示为:   
% E9 y$ L/ w: d* M) T3 @6 d> alpha:=RootOf(x^2-3,x);) W2 k5 U$ s& e1 B6 ^5 U

3 {- E. J3 \+ I1 r& ]7 i/ Z5 k6 D> simplify(alpha^2);! b: \7 D) x% c. ]; K" o. J
* N! Z6 ]% ~/ x( x; ^1 s
在Maple内部, 代数数 不再表示为根式, 而在化简时, 仅仅利用到 这样的事实. 这里, Maple用到一个内部变量_Z. 再看下面一个例子,其中alias是缩写的定义函数,而参数lenstra指lenstra椭圆曲线方法:( Y/ v- u/ j# O' x
> alias(alpha=RootOf(x^2-2)):- z3 u6 Z/ K9 `( |0 Z+ v
> evala(factor(x^2-2,alpha),lenstra);, r& ]7 {& S) c, t& @7 W/ h

% |2 D7 L5 }; O5 \> evala(quo(x^2-x+3,x-alpha,x,'r'));
6 }6 q" R. p7 R
1 F/ s2 Z! [8 f: W> r;
& q4 Y3 H2 |1 U8 `
# K' ?( m: N' W> simplify(%);
, N# S4 z4 F. D7 E0 b
5 C3 A6 G3 O1 j" r7 N9 T+ @3) 在复数域上符号求值2 x/ L7 Z' x7 P8 q  {' A" f
操纵复数型表达式并将其分离给出expr的实部和虚部的函数为evalc, 命令格式为:
* ~! I1 u6 g" m5 Bevalc(expr);   
1 v5 U# s, a" y" C+ Q0 Levalc假定所有变量表示数值, 且实数变量的函数是实数类型. 其输出规范形式为: expr1+I*expr2.
# g6 B) L6 B9 R> evalc(sin(6+8*I));& T( B2 |* d; k/ n( \! T) U

* p$ i) d2 m$ p* O) s  l> evalc(f(exp(alpha+x*I)));) u' }- g. @  L; y3 x; t

0 M) P' ?- x. E; p> evalc(abs(x+y*I)=cos(u(x)+I*v(y)));. n  ?3 a- x) r7 z4 \

2 u! b& x/ q% o8 Y* L( B0 W4) 使用浮点算法求值
( G1 y* P: H. A浮点算法是数值计算的一种基本方法,在任何情况下均可以对表达式expr使用evalf命令计算精度为n的浮点数(n=Digits), 如果n缺省, 则取系统默认值, 命令格式为: evalf(expr, n);     
- G: h0 g" P5 @& \! S> evalf(Pi,50);    7 G, E7 M8 X* {
" v: J4 k$ m8 s7 @) I) A  W
> evalf(sin(3+4*I));   
1 m$ c+ L8 Y: B1 r$ z) V4 c
5 `. x2 ?3 r) s% r" R> evalf(int(sin(x)/x,x=0..1),20);
6 ?% E" p. M2 E) I  T' N& @ # r% a5 U( p" z/ z
5) 对惰性函数求值
) X  V2 }$ ]2 i1 T2 P6 n/ d0 i把只用表达式表示而暂不求值的函数称为惰性函数, 除了第一个字母大写外, Maple中的惰性函数和活性函数的名字是相同的. 惰性函数调用的典型用法是预防对问题的符号求值, 这样可以节省对输入进行符号处理的时间, 而value函数强制对其求值. 对任意代数表达式f求值的命令格式为: value(f);     T" @* D5 o4 h$ [7 y+ }) o
> F:=Int(exp(x),x);
/ _( S9 ^, |$ E% k/ `% Z; U: f* T
6 i0 M* G) ~. p$ W: D3 u> value(%);
* z: b9 x0 ^& w/ ]1 K. y $ N% z5 B) Q$ G7 q* ]& T5 |8 A
> f:=Limit(sin(x)/x,x=0);$ {2 |- `* N3 Y* y0 h2 z4 G

2 c. b' ], U/ ?& r" b4 _- v+ i> value(%);
% ?4 F+ l# G5 ` + I0 Y& m" U9 h
另外, 将惰性函数的大写字母改为小写字母亦即可求值. 如下例:   + p8 f% k. S9 \  v0 C# x
> Limit(sin(x)/x,x=0)=limit(sin(x)/x,x=0);$ a3 D  y) b+ l

6 X; W5 x+ Z+ L' y4 数据结构  ]' [4 F4 J  }; W5 Q+ q
Maple中有许多内建的与FORTRAN、C或Pascal不同的数据结构. 主要的数据结构有序列(sequence)、列表(list)、集合(set)、代数数( algebraic number)、未求值或惰性函数调用、表(table)、级数(series)、串(string)、索引名(index)、关系(relation)、过程体(process)以及整数(integer)、分数(fraction)、浮点数(float)、复数(complex number)等数据结构, 而矩阵(matrix)在Maple中表示为阵列, 是一种特殊的表.
8 Y/ ?6 l+ g3 T$ F4.1 数据类型查询
/ P( b; h) F3 s7 j' E' v  h/ |$ D在Maple中, 用whattype指令来查询某个变量的数据类型或特定类型, 命令格式为:
9 R: s+ O! E: owhattype(expr)        # 查询expr的数据类型
) g, n) p( g; c! u  C& o0 Q. |type(expr, t)           # 查询expr是否为t类型, 若是则返回true, 否则返回false4 @1 M& i3 |+ b, Y. t0 B
> whattype(12);6 m' D. G2 f* d

/ J9 E% y1 M8 m) D8 P+ _' f> whattype(Pi);& P+ m( s& P: D
: |* k1 D7 e0 V+ `
> type(1.1,fraction);
: e. z2 o2 t0 B! ? ) v6 K" y! t8 C7 O% _
> whattype(1.1);
* W" O' A& h6 @/ ^: k 0 V2 G& I0 D: d! O0 _) }
4.2 序列, 列表和集合
1 K! F* f: e9 Q! z) i2 }4.2.1 序列
0 Y/ Y) w" @; }) T2 ?" ?4 U所谓序列(Sequence), 就是一组用逗号隔开的表达式列. 如:   + i# T& ^: S( G& n# ?
> s:=1,4,9,16,25;
8 E/ F) l2 w4 u& u 5 S% R4 R) m6 C4 }
> t:=sin,com,tan,cot;
8 J1 R9 e- ]% p' K ! Y% m- a5 {$ N6 V+ U! S& }( d) J
一个序列也可以由若干个序列复合而成, 如:   
1 t" g* j3 ]7 u7 u> s:=1,(4,9,16),25;
! P. O, l1 h8 S$ p3 D3 F; W 7 D/ @) g# Y+ l/ `* W
> s,s;5 _% n' H$ H$ {/ X' [; I
* J. K* g; P1 W/ G
而符号NULL表示一个空序列. 序列有很多用途, 如构成列表、集合等. 事实上, 有些函数命令也是由序列构成. 例如:   
. C7 H+ h/ W0 k7 o+ _6 ~7 R/ b0 S> max(s);
. L: W, @1 L7 f  n + Z: p: `# Z: G0 u5 E, `
> min(s,0,s);, L& F) \0 V: o% Q# z1 o3 p

: s2 R% [$ P/ C8 d7 s' ~& B值得注意的是, op和nops函数命令不适用于序列, 如op(s)或nops(s)都是错误的, 如果要使用op(s)或nops(s)前应先把序列s置于列表中.
7 t$ h1 P+ b7 i% K" |> s:=1, 2, abc, x^2+1, `hi world`, Pi, x -> x^2, 1/2, 1;' X* g, h' G. E- D7 d  R1 I* x
& O% x, B; ?1 A; z/ c  x5 q  c
> op(s);
; _: s" k, B5 F- P( ^Error, wrong number (or type) of parameters in function op
; m  n! [4 s* C' l> nops(s);4 M* D' W3 ]& `5 U5 Z
Error, wrong number (or type) of parameters in function nops) V5 Z  M3 c  p9 k3 u1 B, F  e
> op([s]);5 L; X8 T# B0 l2 k3 U3 V

. h& b% q0 s+ U' n/ `% f> nops([stuff]);* p; p# k5 c1 V, [
/ }" T, I& e. E' _2 u7 p
函数seq是最有用的生成序列的命令, 通常用于写出具有一定规律的序列的通项, 命令格式为:   2 p" {( L; h; Z; D% u7 ~. p
seq(f(i), i=m..n);  # 生成序列f(m), f(m+1), …, f(n) (m,n为任意有理数). m. e  J4 ^/ y/ X4 m7 p/ T4 I
seq(f(i), i=expr);  # 生成一个f映射expr操作数的序列% a  y# e' ?& ]8 p9 R7 n6 q7 i
seq(f(op(i,expr)), i=1..nops(expr));  # 生成nops(expr)个元素组成的序列, v1 w! ^1 S/ ~# t7 S
> seq(i^2,i=1..10);
7 C6 K/ c1 B5 ]& G$ e
' d+ |" K0 \3 _4 n> seq(ithprime(i),i=1..20);9 G: {$ R3 K9 D$ m# u7 ^
7 U4 B" h" |0 X$ W
> seq(i^3,i=x+y+z);
) D; P0 c) k8 W; g* L3 O/ H
; M0 Q9 i2 O; h# M$ o9 I> seq(D(f),f=[sin,cos,tan,cot]);: V2 D; @) K6 ~( p: ]: _, K

; g7 P4 x0 s2 W! J5 w5 J+ d6 C> seq(f(op(i,x1+x2+x3+x4)),i=1..nops(x1+x2+x3+x4));& p% U+ M( ?& e) o

' z: l! u& [0 V1 Q, o获得一个序列中的特定元素选用操作符[  ], 如:   9 H# W. F/ U0 H
> seq(ithprime(i),i=1..20);
% p. S7 m2 z9 g) s# \! l
. D3 i" a1 v  T3 F# t3 Y> %[6],%[17];
( J& E: Z+ \8 u. R+ Q: W7 x" J9 `
7 v8 y9 q$ _0 C4 I. F  N% j4.2.2 列表
3 J  v1 }' S0 O1 {: h2 B( h列表(list), 就是把对象(元素)放在一起的一种数据结构, 一般地, 用方括号[  ]表示列表. 如下例:   9 y' @% J) y1 `- N: ?9 ?; r1 d
> l:=[x,1,1-z,x];. f+ Q  V- u+ Y- n  ~+ Q

$ {! M' _0 w+ n  ]# L9 v7 L> whattype(%);
' d" x* A* L- ~% \# w + }; [  W" H7 T1 h8 x4 w8 V( T6 R% X2 l6 u
空列表定义为[ ].
6 |9 ~, o0 g. g但下述两个列表是不一样的, 因为对于列表而言, 次序是重要的:   
$ M5 F" {% r" z1 v" z% n> L:=[1,2,3,4];
  }$ o9 [! l# ~0 M0 E$ \6 b 2 S  d2 Y' z5 V" }5 `& D# t. E
> M:=[2,3,4,1];
8 i3 Q. d) h( B  [; }4 C
4 |) _( J& l; |. e8 N2 ]3 ^4.2.3 集合& U5 ~; u1 W6 |# R1 u  y
集合(set)也是把对象(元素)放在一起的数据结构, 与列表不同的是集合中不可以有相同的元素(如果有, Maple也会自动将其当作同一个元素), 另外, 集合中的元素不管次序. 一般地, 用花括号表示集合.
* ^- }7 g0 K6 z4 y$ @& M$ ~# G> s:={x,1,1-z,x};& ?6 V" N, b5 B4 }* Z: B9 u
6 ~( \. d5 {: A( @( B
> whattype(%);# ^" J$ a9 ^7 p  N5 s

4 L" C5 t- k8 H% ?# X( |空集定义为{ }. " B/ R4 U8 |% D& Y' d! u7 s& I
函数nop返回列表或集合的元素数, 而op则可返回其第I个元素.
2 E+ H, m) e0 I4 w) E> op(1,s);6 W0 K0 W* j+ @/ ^7 m

4 ?9 W# @+ o4 q. S  K+ D5 V- u> s[1];1 i- h6 E% i" p: S6 L* S; P; m4 f+ g
" _% e& v: t" L6 W/ E% ]
> op(1..3,s);
/ P* F2 F: q+ [  |: I* `
+ A: c, I2 J: l! g> s[1..3];! T, f0 b, \! O1 o& u

0 I5 [: z4 T& Q2 r# u' Z- D函数member可以判定元素是否属于一个列表或集合, 如果属于, 返回true, 否则返回false.
/ a$ m4 w# Y; M6 [1 v> member(1+x,s);0 z* q  V: O# S1 N2 r6 z: A
6 U; }/ Q; d; s' t) y" Q* o6 J9 d
可以通过下述方法在列表中增减元素:   
! I9 I! y1 v; A7 d> t:=[op(s),x];$ j2 h9 {" P, f  C! a. n
3 J5 {1 S& b2 F; W$ r7 n" M
> u:=[s[1..5],s[7..nops(s)]];- L8 X2 j7 `3 k6 }. X6 P' Y0 j* r

( Q$ X. m" L  t3 B* uMaple中集合的基本运算有交(intersect)、并(union)、差(minus):   & A9 P5 P8 I8 V1 B
> A:={seq(i^3,i=1..10)};B:={seq(i^2,i=1..10)};8 R: G# |/ W. u+ @  ^- _

; P. B" n& ]3 m) H. g2 j* t ! x+ W2 M8 o. T$ p: F2 l5 r6 G2 z
> A intersect B;
+ r5 X6 ]. S/ `. v' D( j
% J+ A5 m4 u2 {4 q; e  s> A union B; 6 N/ W1 }. J% S7 Y. b

3 @+ G/ u, ^0 `! h  D> A minus B;1 g0 B+ N: Z" I7 f4 y# {
% D6 v8 p) X$ j
4.3 数组和表
; f% I* m- _8 r' b在Maple中, 数组(array)由命令array产生, 其下标变量(index)可以自由指定. 下标由1开始的一维数组称为向量(vector), 二维以上的数组称为矩阵(matrix). 数组的元素按顺序排列, 任意存取一数组的元素要比列表或序列快的多. 区分一个数据结构是数组还是列表要用“type”命令.
5 X7 s! H- E( k6 o2 c4 n    表(table)在建立时使用圆括号, 变量能对一个表赋值, 但一个在存取在算子中的未赋值变量会被自动地假定是表, 表的索引可以成为任意Maple表达式. 表中元素的次序不是固定的.
: h% Z: R  v$ ^> A:=array(1..4);
7 N' _' _  J' q6 p' p6 C . v7 J3 E" L& U) t" z
> for i from 1 to 4 do A[i]:=i: od:& n8 U  q- X/ v# W1 ^: o
> eval(A);  D; \  t( \  x0 X6 P) n
9 [5 A: D9 ^; q' l& f
> type(A,array);
9 i9 C, Q6 R7 A
" z) J8 N: R2 X+ s# W# U3 a: `> type(A,list);( R; \4 m. l& T' R8 U0 S+ F! f$ C3 x
% y9 \7 b/ L) z6 s
> T:=table();
( G$ I6 Q$ A. B/ h( F# m) g % R- j. r% {3 Q
> T[1]:= 1;. J8 L* b- n2 K0 V! J3 g) E
# J( a3 l/ _0 Z
> T[5]:= 5;/ _8 w8 X0 l: p# D* F: |$ N

9 u" |- B4 E; j5 p/ Z2 C7 S: [> T[3]:= 3;7 C* i6 o; Y3 I

! B4 \0 F& i! j! Q; c  t& l> T[sam]:=sally;# ^0 v2 }4 Z" e& H1 H# H

& x4 X% U  ~; z" }4 B8 t. K> T[Pi]:=exp(1);! A5 E  t0 I- u7 m6 V1 Q

. g% N3 ~" H3 v! f> x:='x';
2 J4 i; K, Z$ C 2 i( v: @0 e$ e4 \, Y
> T[(1+x+x^3)*sin(x)] := 0;
8 T& _( J# x; h" I
* m% x: }9 U. H4 j$ @> eval(T);
8 O9 N2 F: q9 n- G. Z7 D' A) v 2 q3 G# a% e3 D- k
> T[3]:='T[3]';7 [: j" f5 a  R# V6 ^- }4 i: c
) [- u8 U& U& P2 Z: \# b8 L4 b
> eval(T);- d5 N$ Y( H/ o  x  I

8 N1 J6 z& b, z% U9 q4.4 其他数据结构. b4 x# @; H* ^/ l0 q
串在Maple中是很重要的, 他们主要用于取名字和显示信息. 一个Maple的串可以作为变量名, 它们中的大多数是简单的、不需要加引号的串, 但是如果变量名中包含/. 例如“diff/T”则必须把变量名用引号括起来.
# _  v+ l% A  r  F! T索引名是像Database[1,2,drawer]或A[3]这样的对象, 在使用索引前不需要直接建立表, 如果不得不做, Maple会自动建立表. 索引名通常被用于矩阵和向量. 为了保证Maple建立表的正确次序, 建议在赋值前直接建立.
( e9 X0 x! p5 y7 F" @( t! Y> x:=T[3];" b1 ^6 ^( @' O4 f
  y" l7 Q: t. H6 f
> eval(T);5 g/ m/ k. D9 b9 H6 @1 ]1 ^; u

2 G9 u- O% I3 `> T[5]:=y;3 g9 |7 {: H8 S3 x! X- ^

9 t; y8 g  ?6 E8 z: |2 [> eval(T);
* B$ P. o% {) o+ B) V
: {: f0 i! q- U% T由此可见, Maple并不直接建立T的表, 直到给T[5]赋了值.     7 r. p3 [  j" @1 n
数值数据结构(整数、分数、有理数、浮点数、硬件浮点数和复数等)在它们的使用中是大量透明的. 浮点数是有传染性的, 这意味着如果数值结构中有一个是浮点数, 则整个结构自动转换为浮点数. 5 Z2 y- [1 y- ]0 h1 u
4.5 数据类型转换和合并
; N4 g! a9 e7 K& S) |convert是一个功能强大的类型转换函数, 它可以实现列表和数组的类型转换:   
( Z" v! a9 i# W> L:=[1,2,3,4];" D2 u$ f/ k) n1 I- k, s, Q! ]( K3 [

1 Z: o, y2 U. }> type(L,list);
& e/ V! U; s+ u: O 6 a( y) B0 {$ _( @& t8 T% r
> A:=convert(L,array);
5 e, j5 @( x# e* D& l   E) k" D. b! T5 `" u2 }3 j
> type(A,list);
( b1 p: j! ], L& S& g
4 P1 ^" J$ O( g* X! o0 u7 e# ?> type(A,array);
6 r8 o& D* x2 r6 m ( G( B1 V, ~% G* Q9 h
另一个有用的函数zip则可把两个列表或向量合并:   2 c9 ]$ m' P5 `: r
>L:=[seq(i,i=1..10)];$ U  K0 I$ k$ |& x
8 ^) D% |$ R( v: b- q. w
> Sqr:=(x)->x^2;! ^: w/ m! K% S% J  b3 N

; E9 f2 u/ B4 F. _> M:=map(sqr,L);
. ~' g+ ~2 i* }) C/ C ! O, e1 L( x+ X
> LM:=zip((x,y)->[x,y],L,M);* l/ z7 A9 @+ o* K& @' F2 ^* M
5 R/ n- e0 p* I+ u+ m( S: `
> map(op,LM);
  R5 G8 Z. {1 i: p/ g0 @* s# G: n' M ' ?! U3 I8 z) ?( r
5 Maple高级输入与输出操作7 B% K+ y' n6 U' s- i
Maple提供了良好的接口来编辑与计算数学式. 许多时候, 我们可能需要把Maple的运算结果输出到一个文件中, 或者在一个文本编辑器里先编好一个较大的Maple程序, 再将它加载到Maple的环境里. % h7 j1 l; D0 e$ W
5.1 写入文件
. w! V& `( r( E5.1.1 将数值数据写入到一个文件  P4 ?6 z* {" u, S4 `
如果Maple的计算结果是一长串的数值串行或数组, 而想把它写到一个文件时, 用writedata命令. + {" w3 @3 t0 O  R
若Maple的计算结果data为集合、矩阵、列表、向量等形式时, 将其写入名为filename的文件时命令格式为: writedata("filename", data);* w& T' C( @7 N; K* P$ S3 a
> with(linalg):
5 J) q9 o6 H: F8 x0 f> M:=matrix(3,3,[1,2,3,4,5,6,7,8,9]);
2 X0 }4 N% \( x: i3 }  D 2 Y& z* |2 k  b& _
> writedata("e:\\filename.txt",M);
2 M; o3 \& E- M% J而将结果附加在一个已存在的文件后时,使用命令: writedata[APPEND]("filename", data);
8 _7 j  ^1 }' T8 `> W:=matrix(2,2,[1,2,3,4]);
4 n3 P/ F1 d. o! K% a
" P) k" [$ C2 O8 Q9 l" b2 |> writedata[APPEND]("e:\\filename.txt",W);
4 b3 L: h) x. Z2 Z  x' @2 H1 P需要注意的是, 这里的APPEND是必需的, 否则W结果将会覆盖M结果.
2 v5 q" o0 O* ^: t另外, 若想将结果显示在屏幕上时, 用命令: writedata('terminal', data);0 {% ]; N% d3 _( I) y+ C: }. O5 M
> writedata[APPEND]("e:\\filename.txt",W); $ d% E: w5 B. L0 h3 Y5 X8 ]% k# ~
> writedata('terminal',M);
8 n: l4 A9 L3 v! u  ^& C7 C- D1                   2                   3           . t& z# B' M" S9 _0 r  W
4                   5                   6           6 S, t6 U7 l0 }' D' E7 M
7                   8                   9    : k. @1 K. A3 d% }
5.1.2 将Maple语句写入一个文件
0 X" E) g, G  K如果所要写入文件的是表达式、函数的定义或者是一个完整的程序, 则使用命令save, 写入一个或多个语句的命令格式分别如下:: `+ O. V- J, n' L, ]' R1 Y: N4 |
save name, "filename";
) w$ g/ U/ l5 Q: l  }save name1, name2, …, "filename";
# Z" y2 P6 c. J# C: f若filename的扩展名为.m, 则Maple会以内定的格式储存, 若扩展名为.txt, 则以纯文本文件储存. 以内定的格式储存的文件作纯文本编辑器无法读取, 但在大多数情况下, 它会比纯文本文件的加载速度更快, 且文件容量小.) d5 ^; E4 V* k6 M+ }1 N
> myfunc:=(k,n)->sum(x^k/k!,x=1..n);  n7 o+ f' x: }$ E

, S7 J7 l) `, c* G& P- F> myresult:=myfunc(6,8);2 I" M: D5 P: p& V% d) i

- e$ N5 z6 p, h9 N8 [> save myfunc,myresult,"e:\\test.m";, F. V3 E5 T( Y. g& m8 o
调用已存m文件用命令read. 试看下述实验:
* C3 t7 v/ e3 D( A2 {! m# ]> restart:
  g3 T& @+ t9 Y! u' }> myfunc(6,8);& V3 L# d0 K+ c  a) c( U7 E: B0 @

' w, O- B5 X$ u6 c9 l* }! r> read "e:\\test.m";& w, t8 O) N6 @* v( x1 i% M
> myfunc(6,8);
" m( p1 j$ v1 o7 k/ ` 6 m3 y; c2 N$ N  [! \6 g
> myresult;. l' z% q0 J$ v0 y+ A2 b0 t: T: X% P

4 O% B0 G, F+ n6 Z5 o! `    而存为txt文件时则将整个语句存为一个文件:
) j9 x$ C5 w  I7 V5 B, p7 V- k8 ]$ O> save myfunc,myresult,"e:\\test.txt";
5 U! m0 v- P$ u> restart: read"e:\\test.txt";# n0 `: |4 K7 U7 q. z

6 g( \! T* k- [* T: W
1 b% {# y0 U; s- d! \, |5.2 读取文件
- I+ N1 T; t# P# B* I. u/ ~( O在Maple里最常用的两个读取文件的命令, 一个是读取数值数据, 另一个是是读取Maple的指令.- e4 s  q6 Y) d2 r+ U
5.2.1 读取数值数据: m* l5 w9 M' v
如果想把大量的数据导入Maple里进行进一步的运算或者要运用大量的实验数据在Maple环境绘图时, 可以用readdata( )命令完成.5 @- R* T+ F# r" i! h4 S
从filename文件里读取n行数据时使用命令: readdata("filename",n);' X. M/ ~9 D2 P; Q/ c! R
以指定的格式读取数据时使用命令: readdata("filename",[tyep1,type2,…]);
9 f' k. l" |% r, L/ S9 @! k) K/ a9 h7 B> readdata("e:\\filename.txt",3);' N2 b7 B; Q# m% v) i/ u( a

! I, B. U* p2 v( m. @    读取filename的前三列, 第一列为整数形式, 第二、三列为浮点数形式:1 }" G. l2 r- ~# S0 r0 E" e
> readdata("e:\\filename.txt",[integer,float,float]);
' F+ g1 e/ R1 r3 b# G- J; w
4 Y( G  T5 A/ v- W* d下面再看一个运用大量的实验数据在Maple环境绘图的实验:
  i! D: c7 \" |9 B4 S! A- m> mypts:=[seq([x/1000,cos(x^2/100000)],x=1..1000)]:
8 [2 t0 H5 I& |> writedata("e:\\data.txt",evalf(mypts));
2 }8 G9 s! ~7 P/ K0 h> dots:=readdata("e:\\data.txt",100):
' ]4 t* C, f7 Q$ G$ |  ~> nops(dots);
2 r1 W% ]4 D# t7 X+ R( b
2 u" `" _4 J, ~5 p- q. K, X> dots[1..4];
2 d3 i- B' |7 u# f" }5 n; y1 j
; R( d& M& U- J$ D( B> plot(dots,style=line);
2 H, H3 V1 Y8 w
; F7 J" M: z: _; n$ J/ ]" S1 U" B9 J5.2.2 读取Maple的指令0 Z0 Z% S9 z! k8 k" v9 O
在编写程序时, 在普通软件中先编好程序再将其读入Maple环境中常常比直接在Maple中编写更为方便. 如果要将程序代码或Maple指令加载用read命令:
( a7 ], Z2 e) j2 B$ j! Jread "filename";) C1 {0 w; s! m& S& r8 L7 `$ }2 l
如下例:
9 N5 J% ^; l# q. O> reatart:
) F* c8 n2 t; d1 a, j> myfunc:=(a::list)->add(i,i=a);7 g+ ^- S/ r1 \+ f7 l* p
$ m% m2 v" ~+ ]5 h
> avg:=(a::list)->myfunc(a)/nops(a);
/ @6 e0 q7 g3 Y" R, K2 ^4 |
0 x# n9 f* W6 u) b' ^; V( q" h> save myfunc,avg,"e:\\function.m";
; G- V0 b4 F$ E6 v. Z1 m* j8 E( i, ~> restart:
. y3 w2 C6 J6 v3 Y> read "e:\\function.m";
4 a1 k6 j+ \9 f) W> myfunc([1,2,3,4,5,6,7,8,9]);, t% J( C, w# L) y
- r4 v0 G* j! |0 e7 e
> avg([1,2,3,4,5,6,7,8,9]);; Q0 M+ _- S% q8 t7 J* J. k3 H: q

" |- ]7 k# v6 |" T* h/ o  W5.3 与其它程序语言的连接
7 R' ~$ }" A8 g5.3.1 转换成FORTRAN或C语言
2 n2 O3 M, c+ C' E/ [: ]  a调用codegen程序包中的fortran命令可以把Maple的结果转换成FORTRAN语言:7 t- i: [. c- u9 w/ l) N
> with(codegen,fortran):
. G7 t7 q2 \) `7 N8 ?2 d; gf:= 1-2*x+3*x^2-2*x^3+x^4;
) ~* |: `5 v1 Z6 i* |4 g9 x3 D( N" Z - O( u* j/ K+ E8 r1 `
> fortran(%);3 h) U  \6 w3 m. l5 A
      t0 = 1-2*x+3*x**2-2*x**3+x**4! Y4 V0 m6 t5 z9 w* r! [
> fortran(f,optimized);$ s0 @1 r4 _& J3 F4 D# D6 A9 o0 C
      t2 = x**2! h0 N& h" z# T1 \
      t6 = t2**2
& H4 r& x+ ]$ Z5 y      t7 = 1-2*x+3*t2-2*t2*x+t6
# p* v* w- c2 Q* C/ M> fortran(convert(f,horner,x));* ]! G9 P7 ^% ]1 S( _4 U7 P
      t0 = 1+(-2+(3+(-2+x)*x)*x)*x
" D! ?3 G" h# K% x% o+ r' B而codegen程序包中的C命令可以把Maple结果转换成C语言格式:
, P* U4 v; c( r" m> with(codegen,C):& G, t2 x6 [) T
f:=1-x/2+3*x^2-x^3+x^4;
1 `( o0 [! j# ^, V' B+ d9 G# {( b/ I , D8 u$ `, Q$ C" I* U# [
> C(f);
- u2 T% A% Y8 A1 ~6 m; ~6 Y      t0 = 1.0-x/2.0+3.0*x*x-x*x*x+x*x*x*x;' I8 F( e# N+ H" v. u8 D
> C(f,optimized);, J* f" I% r1 c4 F. J4 j
      t2 = x*x;# z& [! W' a6 [9 Q
      t5 = t2*t2;
% W5 o) ^7 Y, N6 K, ~      t6 = 1.0-x/2.0+3.0*t2-t2*x+t5;
; u  a2 _2 \) j) R3 y: Joptimized命令表示要对转换的表达式进行优化, 如果不加此可选参数, 则直接对表达式进行一一对应的转换.
7 e$ m3 E! J% ^: W  J% s5.3.2 生成LATEX
# K. T2 Q( F: q1 Z1 `( RMaple可以把它的表达式转换成LATEX, 使用latex命令即可:
4 ]8 z1 z# n& q% o> latex(x^2+y^2=z^2);' N7 w6 \- B$ N7 D
{x}^{2}+{y}^{2}={z}^{2}
& O3 i2 H9 b* B7 b    还可以将转换结果存为一个文件(LatexFile):& f$ H6 e( h* N5 K
> latex(x^2 + y^2 = z^2, LatexFile);$ J- ^# x+ ?0 J7 }6 s* h7 e
    再如下例:4 k6 P5 v; ?0 Q. Z7 v
> latex(Int(1/(x^2+1),x)=int(1/(x^2+1),x));
  s. |* u+ r. G: w# i\int \! \left( {x}^{2}+1 \right) ^{-1}{dx}=\arctan\left( x \right)
' A. x2 z& M0 J: L; O7 L$ d5 R( E2 k
zan
已有 1 人评分体力 收起 理由
darker50 + 2 用word发不是很好吗?呵呵!

总评分: 体力 + 2   查看全部评分

转播转播0 分享淘帖0 分享分享0 收藏收藏1 支持支持0 反对反对0 微信微信
darker50        

107

主题

45

听众

1万

积分

  • TA的每日心情
    开心
    2015-4-9 15:42
  • 签到天数: 47 天

    [LV.5]常住居民I

    自我介绍
    开朗,爱各种娱乐的不老男生就是我了,喜欢数学建模,喜欢那种帮助别人的感觉。

    社区QQ达人 助人为乐奖 新人进步奖

    回复

    使用道具 举报

    33

    主题

    10

    听众

    1691

    积分

    升级  69.1%

  • TA的每日心情
    开心
    2014-7-8 08:29
  • 签到天数: 201 天

    [LV.7]常住居民III

    发帖功臣 新人进步奖

    群组PLC和单片机

    群组2012第三期美赛培训

    群组MCM优秀论文解析专题

    群组沈阳理工应用技术学院

    群组学术交流B

    回复

    使用道具 举报

    33

    主题

    10

    听众

    1691

    积分

    升级  69.1%

  • TA的每日心情
    开心
    2014-7-8 08:29
  • 签到天数: 201 天

    [LV.7]常住居民III

    发帖功臣 新人进步奖

    群组PLC和单片机

    群组2012第三期美赛培训

    群组MCM优秀论文解析专题

    群组沈阳理工应用技术学院

    群组学术交流B

    回复

    使用道具 举报

    46

    主题

    3

    听众

    1967

    积分

    升级  96.7%

  • TA的每日心情

    2014-4-15 00:06
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    社区QQ达人 新人进步奖

    群组数学建模

    群组数学趣味、游戏、IQ等

    群组LINGO

    听说女人如衣服,兄弟如手足。回想起来,我竟然七手八脚的裸奔了20年!9 q4 B2 q* R9 d! j% [, Y3 U3 @

    , p& I& p. D9 Q. d
    4 E5 l+ [2 B5 V! _
    回复

    使用道具 举报

    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-25 03:59 , Processed in 0.555958 second(s), 96 queries .

    回顶部