QQ登录

只需要一步,快速开始

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

maple基础

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

1

主题

5

听众

4

积分

升级  80%

该用户从未签到

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

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

" T( ^  X& [; d7 ?( ^) O7 h: I
/ S& T8 c) U3 h& A  `
9 J; H# {7 f  D% Z: H- l7 N! \
6 q, S# b: C( w2 P * u& y9 J. ?4 m" |  J) i; F7 b
# S7 f& K) Z, t. l
+ l! H6 t) c7 w/ W3 X
# ]4 w0 n% W, ]. I6 R( j% q

+ h3 T% }+ w. w2 s4 ?0 f
: Q5 j9 e* E5 r! M& g+ p* M
) U% B7 q3 k0 X0 R( D. R 2 d3 m' K  }) }/ g$ E6 L: E

6 Y6 L3 U5 a( s  Palpha        beta        gamma        delta        epsilon        zeta        eta        theta        iota        kappa        lambda        mu3 ]( r; U4 Y# |

8 x/ x9 e' v& }; H" v4 P: Q0 a3 i 2 m! l% L; u7 x: y+ m% r
6 }' X$ l, b! P5 k  C  u
2 H: C3 O( f- U/ n

: ]! Z8 L# D; V - u: d, t0 t- O4 n
2 r: R9 Y% ]4 s9 F7 ]4 R  H& e* z
: J; d* d! Y3 l+ \: L! g1 I* G

) w& ]* e, `+ U- c/ N2 s9 }
8 U9 C1 K1 {; Y3 L
% r. a# w9 \- u
9 V/ A' c( M; u# v
  @% {1 n2 K, T7 x( J; t# Gnu        xi        omicron        pi        rho        sigma        tau        upsilon        phi        chi        psi        omega/ C. v. t# `& r6 _* P
有时候为了美观或特殊需要,可以采用Maple中的函数或程序设计方式控制其输出方式,如下例:
* h9 o" ]7 o7 x; i  x* c> for i to 10 do . ^- J. s2 F* _* E2 ~8 _- f( S( W
printf("i=%+2d and i^(1/2)=%+6.3f", i, eval(sqrt(i)));
: k% _# X5 f8 Q3 a, Bod;! ]7 L2 u! S" E/ ^) A) x
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( h9 F" i4 m0 L# E
+2d的含义是带符号的十进位整数,域宽为2. 显然,这种输出方式不是我们想要的,为了得到更美观的输出效果,在语句中加入换行控制符“\n”即可:
0 K' H& x0 C8 T4 {; g! n6 ?: y  s> for i to 10 do
2 |6 O0 T9 a( ?- _printf("i=%+2d and i^(1/2)=%+6.3f\n", i, eval(sqrt(i)));3 F; o% F  _7 C7 i  c, B  F
od;
) e0 q2 A5 F* f6 G- @i=+1 and i^(1/2)=+1.000! c2 b2 y8 f* ^, d0 \
i=+2 and i^(1/2)=+1.414  a9 U6 y/ e- v. V2 O( ?% C4 n
i=+3 and i^(1/2)=+1.732% P7 r5 N' q; a+ S
i=+4 and i^(1/2)=+2.0003 H$ R8 G8 M3 ^5 t- F, E
i=+5 and i^(1/2)=+2.236
6 j$ c7 z" h' v3 a( di=+6 and i^(1/2)=+2.449
3 d1 Y2 G4 B: O# v, G& wi=+7 and i^(1/2)=+2.646
) s7 m+ i* r9 c( T% e) ?3 ii=+8 and i^(1/2)=+2.828
3 w3 Y6 D" l3 U7 G% v; W+ ~i=+9 and i^(1/2)=+3.000
2 U, y: z( \/ v5 s& v/ E: Xi=+10 and i^(1/2)=+3.162
& r/ G  T! I. q7 A再看下例:将输入的两个数字用特殊形式打印:
' \" i4 z2 P$ }/ N5 Z0 P> niceP:=proc(x,y)
; j% W/ z. |* s& L8 W, wprintf("value of x=%6.4f, value of y=%6.4f",x,y);
% h, c2 N; u4 x0 }7 Send proc;4 j" C) l- ?# p# h( t

6 j: w# g! S; l4 z. S, D> niceP(2.4,2002.204);# W/ d2 ~! c  U# v0 w+ J" t
value of x=2.4000, value of y=2002.2040% g. S4 y: _  D6 @) C( u
1.4 Maple联机帮助
% L1 s+ C- v2 g) c学会寻求联机帮助是掌握一个软件的钥匙. Maple有一个非常好的联机帮助系统, 它包含了90%以上命令的使用说明. 要了解Maple的功能可用菜单帮助“Help”, 它给出Maple内容的浏览表, 这是一种树结构的目录表, 跟有…的词条说明其后还有子目录, 点击这样的词条后子目录就会出现(也可以用Tab键和up, down选定). 可以从底栏中看到函数命令全称, 例如, 我们选graphics…, 出现该条的子目录, 从中选2D…, 再选plot就可得到作函数图象的命令plot的完整帮助信息. 一般帮助信息都有实例, 我们可以将实例中的命令部分拷贝到作业面进行计算、演示, 由此可了解该命令的作用.
( a; X- ^% x* R在使用过程中, 如果对一个命令把握不准, 可用键盘命令对某个命令进行查询. 例如, 在命令区输入命令“?plot”(或help(plot);), 然后回车将给出plot命令的帮助信息, 或者将鼠标放在选定的要查询的命令的任何位置再点击菜单中的“Help”即可. ( ^; K0 _7 G1 B& C; X/ Y
2  Maple的基本运算
6 x- ~2 F& X- c4 x2.1 数值计算问题) \5 H- q& }7 s. H* l8 d# w7 |3 }
算术是数学中最古老、最基础和最初等的一个分支, 它研究数的性质及其运算, 主要包括自然数、分数、小数的性质以及他们的加、减、乘、除四则运算. 在应用Maple做算术运算时, 只需将Maple当作一个“计算器”使用, 所不同的是命令结束时需加“;”或“:”.
" k$ P. y1 |9 h$ ~+ u0 E在Maple中, 主要的算术运算符有“+”(加)、“–”(减)、“*”(乘)、“/”(除)以及“^”(乘方或幂,或记为**), 算术运算符与数字或字母一起组成任意表达式, 但其中“+”、“*”是最基本的运算, 其余运算均可归诸于求和或乘积形式. 算述表达式运算的次序为: 从左到右, 圆括号最先, 幂运算优先, 其次是乘除,最后是加减. 值得注意的是, “^”的表达式只能有两个操作数, 换言之,  是错误的, 而“+”或“*”的任意表达式可以有两个或者两个以上的操作数.
& o- k+ O, B5 m/ F4 OMaple有能力精确计算任意位的整数、有理数或者实数、复数的四则运算, 以及模算术、硬件浮点数和任意精度的浮点数甚至于矩阵的计算等等. 总之, Maple可以进行任意数值计算.
9 ~& l8 k# ^. k1 L, O但是, 任何软件或程序毕竟只是人们进行科学研究的一种必要的辅助, 即便它有很多优点, 但也有它的局限性, 为了客观地认识数学软件、认识Maple, 下面通过两个简单例子予以说明.   \9 G4 G$ X" L( }' N
第一个简单的数值计算实例想说明Maple数值计算的答案的正确性:   
, R8 r" P$ ]: q* I. d> 3!!!;2 u% b) L# `1 J% ~! e- ~
2601218943565795100204903227081043611191521875016945785727541837850835631156947382240678577958130457082619920575892247259536641565162052015873791984587740832529105244690388811884123764341191951045505346658616243271940197113909845536727278537099345629855586719369774070003700430783758997420676784016967207846280629229032107161669867260548988445514257193985499448939594496064045132362140265986193073249369770477606067680670176491669403034819961881455625195592566918830825514942947596537274845624628824234526597789737740896466553992435928786212515967483220976029505696699927284670563747137533019248313587076125412683415860129447566011455420749589952563543068288634631084965650682771552996256790845235702552186222358130016700834523443236821935793184701956510729781804354173890560727428048583995919729021726612291298420516067579036232337699453964191475175567557695392233803056825308599977441675784352815913461340394604901269542028838347101363733824484506660093348484440711931292537694657354337375724772230181534032647177531984537341478674327048457983786618703257405938924215709695994630557521063203263493209220738320923356309923267504401701760572026010829288042335606643089888710297380797578013056049576342838683057190662205291174822510536697756603029574043387983471518552602805333866357139101046336419769097397432285994219837046979109956303389604675889865795711176566670039156748153115943980043625399399731203066490601325311304719028898491856203766669164468791125249193754425845895000311561682974304641142538074897281723375955380661719801404677935614793635266265683339509760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, r& p3 z& A) i: D& _
上述运算结果在IBM PC机(1G, 128M)上计算只需要0.01秒, 得到如此复杂的结果(1747位), 一个自然的问题是: 答案正确吗?
9 c, Z+ m1 E, N) J3 w' }为了回答这个问题, 我们借助于数值分析方法, 由Stiring公式
5 E" `- T" \' n7 K/ ]1 p" D1 h2 C
7 g* X+ L* c1 x% c: {可得:  , 前三位数字与Maple输出结果相同, 且两者结果均为1747位. 另外, 在720!的计算中, 5的因子的个数为:   * _) s, I# V" A
! Z: M' @9 a0 W, R
这些5与足够多的2相乘将得到178个0, 而Maple的输出结果中最后178位数为零. 由此, 可以相信Maple结果的正确性. 0 l! u0 k6 b/ M8 `
另一个例子则想说明Maple计算的局限性:   
3 r! ~! Y. x0 ?& y5 a  
; b  ?, F7 }& r* o( L7 A  EMaple在处理问题时, 为了避免失根, 从不求算术式的近似值, 分数则化简为既约分数. 因此, 在Maple中很容易得到:   ( `2 j& n" P: }5 M. h. P9 \
8 G+ e4 J( O2 L, h2 u
显然这是错误的. 这一点可以从代数的角度予以分析. , x- P. J' e% p$ k1 k( x
不妨设 , 则 , 即 , 显然 有3个结果, -2是其实数结果.
4 v  j) @, J6 P  r) ?另一方面, 设 , 则 , 即:, x6 O+ i9 D# E
' Z5 ~+ s: f* V) z
显然 有6个结果, -2、2是其实数结果.
& M0 `6 d* [: `0 Q. C% l这个简单的例子说明了Maple在数值计算方面绝对不是万能的, 其计算结果也不是完全正确的, 但是, 通过更多的实验可以发现: Maple只可能丢失部分结果, 而不会增加或很少给出完全错误的结果(如上例中Maple的浮点数结果皆为 ). 这一点提醒我们, 在利用Maple或其他任何数学软件或应用程序进行科学计算时, 必须运用相关数学基础知识校验结果的正确性.
- E3 n% ?0 @5 _$ D3 v1 @尽管Maple存在缺陷(实际上, 任何一个数学软件或程序都存在缺陷), 但无数的事实说明Maple仍然不失为一个具有强大科学计算功能的计算机代数系统. 事实上, Maple同其他数学软件或程序一样只是科学计算的一个辅助工具, 数学基础才是数学科学中最重要的.
- B4 \5 E, }  F4 E4 {8 B' v# i2.1.1 有理数运算
8 Y' m. o  Y8 ~2 L' |  }作为一个符号代数系统, Maple可以绝对避免算术运算的舍入误差. 与计算器不同, Maple从来不自作主张把算术式近似成浮点数, 而只是把两个有公因数的整数的商作化简处理. 如果要求出两个整数运算的近似值时, 只需在任意一个整数后加“.”(或“.0”), 或者利用“evalf”命令把表达式转换成浮点形式, 默认浮点数位是10 (即: Digits:=10, 据此可任意改变浮点数位, 如Digits:=20). * P5 t/ t# v- I$ B$ s9 w
> 12!+(7*8^2)-12345/125;) r8 ^  g: ]+ t: Y6 n8 W

/ X& R! J/ g1 P- y> 123456789/987654321;
4 S! e7 U2 R& l& E5 l$ N6 @% a( O 7 j% v8 N! y5 C! Z; Y0 z, f* }0 S
> evalf(%);2 d8 }4 }8 U' O; f5 ^

6 ^1 y2 O. B2 w8 k" U+ d> 10!; 100*100+1000+10+1; (100+100)*100-9;
4 o7 ?+ o( x0 C' `1 I3 Y
/ C& K3 e# C3 r. M% h7 h* V. t1 _+ s/ Y7 r
/ ~3 N+ A- u) F/ u" ~ ; E1 `0 N: y* b( p" I& C( g: @
> big_number:=3^(3^3);
3 p/ F: N& K$ k( ^ ' N5 y  g. Q$ p* S: o
> length(%);
% C# p; A; \' H8 z
1 `8 z9 p( L; T# q2 J2 \上述实验中使用了一个变量“big_number”并用“:=”对其赋值, 与Pascal语言一样为一个变量赋值用的是“:=”. 而另一个函数“length”作用在整数上时是整数的十进制位数即数字的长度. “%”是一个非常有用的简写形式, 表示最后一次执行结果, 在本例中是上一行输出结果. 再看下面数值计算例子:   
. i2 R, m" K9 m3 X% S# C    1)整数的余(irem)/商(iquo)
' E% [# G( j6 y# v  Q/ b4 \命令格式:   4 z! i7 Q: m: P) s/ U
irem(m,n);        #求m除以n的余数
( D2 w8 s$ x  ~' a" rirem(m,n,'q');    #求m除以n的余数, 并将商赋给q& A2 p# r( ]: P; K
iquo(m,n);        #求m除以n的商数
- B8 R+ p$ y$ Piquo(m,n,'r');    #求m除以n的商数, 并将余数赋给r
9 m# |0 B6 D+ b' e其中, m, n是整数或整数函数, 也可以是代数值, 此时, irem保留为未求值. 7 c( Y  u3 X* l/ _2 c
> irem(2002,101,'q'); # 求2002除以101的余数, 将商赋给q/ l- I5 U6 i: d; r4 E0 k% _
3 O9 Y; N8 `& f
> q; #显示q/ w7 }: p8 M$ @- Z
" u, E1 o0 t7 T0 C# W7 P# W8 D
> iquo(2002,101,'r'); # 求2002除以101的商, 将余数赋给r
4 b" k* _" k; _8 H( u" O+ S
# D! \5 l! R, W0 i# |+ Y: _) Z> r; #显示r- I# l3 K, ~, J1 v
& R- B+ ]& o( r% l' [' l
> irem(x,3);. E( w- _! h/ N/ ^0 o8 C: ]

- N- @; u0 {! Y& W, I2)素数判别(isprime)6 J3 F- y( V$ e9 g
素数判别一直是初等数论的一个难点, 也是整数分解问题的基础. Maple提供的isprime命令可以判定一个整数n是否为素数. 命令格式: isprime(n); , U$ q  ~; ~  z! r
    如果判定n可分解, 则返回false, 如果返回true, 则n“很可能”是素数.
3 N1 b7 A/ k! ]- T3 ]% ?0 i> isprime(2^(2^4)+1);" ]7 m/ A7 X$ k6 r2 N. W

& v, G( G; h4 v7 C> isprime(2^(2^5)+1);, b) Q9 `# y6 i! y) T$ h& Q& W

4 v# j$ t8 |; D0 q  o4 J上述两个例子是一个有趣的数论难题。形如 的数称为Fermat数, 其中的素数称为Fermat素数, 显然, F0=3、F1=5、F2=17、F3=257、F4=65537都是素数. Fermat曾经猜想所有的Fn都是素数, 但是Euler在1732年证明了F5=641•6700417不是素数. 目前, 这仍是一个未解决的问题, 人们不知道还有没有Fermat素数, 更不知道这样的素数是否有无穷多. ; m6 r$ _% A0 [  ]/ R7 V
3) 确定第i个素数(ithprime), ~1 [8 Q( |2 Z) x. j) Q
若记第1个素数为2,判断第i个素数的命令格式: ithprime(i);    ' T* f# q" a) ?  l, P! r
> ithprime(2002);
) b, X7 }0 t7 h7 j' \ 8 Q# b2 \) `4 M5 U, k
> ithprime(10000);
6 v# |8 ^; U3 ]+ B- W& B5 { 2 e5 W2 n3 W& h% _" ]/ |* A
4) 确定下一个较大(nextprime)/较小(prevprime)素数
, D+ I8 R( e* b; V当n为整数时,判断比n稍大或稍小的素数的命令格式为:   
/ |; [$ ]' `$ b6 h, X$ z8 I7 xnextprime(n);    a& d7 X% X8 b1 _( m
prevprime(n); 5 M, n, W% W, S  m! |: Z$ `
> nextprime(2002);9 B3 K  _: i& |" b3 T! N) h
' ^- h3 i3 D' ^" d" J
> prevprime(2002);2 f& q" j/ l3 h2 Q  K$ `1 K$ a5 J
( Z* |+ P! Z4 T' g3 @
5) 一组数的最大值(max)/最小值(min)
* A0 n  b! M2 u" y命令格式: max(x1,x2,…,xn);   #求x1,x2,…,xn中的最大值) Q7 Y9 N) m: R5 D6 M
             min(x1,x2,…,xn);   #求x1,x2,…,xn中的最小值. U1 u* k# b1 G) U/ t% x
> max(1/5,ln(3),9/17,-infinity);' E# L2 }/ i" `" k5 X/ H3 B
  c% E* ?4 y% c0 S% I
> min(x+1,x+2,y);
% a2 ^9 o9 y* [; n
; J0 Y  U! I  c& l7 a/ T6)模运算(mod/modp/mods)$ q: n, p, V; h. k$ w5 B; O
命令格式:  e mod m;    # 表达式e对m的整数的模运算" `4 |5 n7 W8 T2 ^5 n' ?9 o
modp(e,m);  # e对正数m的模运算
' j* p* c) i* d7 wmods(e,m);  # e对m负对称数(即 -m)的模运算( @( X% Y  n+ E1 J) `1 I4 q
`mod`(e,m);  # 表达式e对m的整数的模运算, 与e mod m等价
: @+ S1 t" h. L9 d* W值得注意的是, 要计算i^n mod m(其中i是一整数), 使用这种“明显的”语法是不必要的, 因为在计算模m之前, 指数要先在整数(可能导致一个非常大的整数)上计算. 更适合的是使用惰性运算符“&^”即: i &^n mod m, 此时, 指数运算将由mod运算符智能地处理. 另一方面, mod运算符的左面优先比其他运算符低, 而右面优先高于+和-, 但低于*和/.
4 U. E( e9 }3 I- J> 2002 mod 101;
* r+ G$ `9 b: v
% w" r4 s- z1 }3 A' ^> modp(2002,101);
& A) R/ ^* y/ E$ x, ` , [+ p2 l2 f. T3 Z
> mods(49,100);
( A# Q( H% m& n. f$ I, \1 r 8 _& N4 ~$ G% ]2 B
> mods(51,100);& J! R% l: a- E) h0 O8 [6 C' ]4 ]* L

# j( d& `1 D3 g* q9 d; C0 b7 Z. R& h! A> 2^101 mod 2002;  # 同 2 &^101 mod 2002;- D: G2 r, z# n  o

; O) {3 A4 c- Z$ |2 K* y7)随机数生成器(rand)! {5 Z) r5 P5 S1 C4 w6 j
命令格式:   - U8 ^; h2 Y8 {+ ~
rand( );    #随机返回一个12位数字的非负整数
5 N8 V6 q. H& Q8 l2 w$ Q! orand(a..b);  #调用rand(a..b)返回一个程序, 它在调用时生成一个在范围[a, b]内的随机数) Q! [) p4 ~4 U2 S7 T
> rand();
2 B, j$ f+ B. g: { 6 Z$ v$ a7 c9 r' I2 k3 M& q
> myproc:=rand(1..2002):
0 s  I6 A0 n& S+ Q* Y. s> myproc();
3 W, K4 E6 v2 L0 R, C , S" g1 T! K7 J% Y/ ^% @; _5 L
> myproc();
1 N; B: u5 N2 { + s* ^) c# H: C" N4 u  `
    注意, rand(n)是rand(0..n-1)的简写形式.
( v1 s) l$ d$ D3 `' \( T2.1.2 复数运算
1 S  k4 X' I: p/ p复数是Maple中的基本数据类型. 虚数单位i在Maple中用I表示. 在运算中, 数值类型转化成复数类型是自动的, 所有的算术运算符对复数类型均适用. 另外还可以用Re( )、Im( )、conjugate( )和argument( )等函数分别计算实数的实部、虚部、共轭复数和幅角主值等运算. 试作如下实验:   " U. t% h$ ?# S0 C. \3 ]* I% J
> complex_number:=(1+2*I)*(3+4*I);
+ A3 Z& o, z# n1 l! R6 p. A8 t
2 m6 n! t. @4 ^9 R: B> Re(%);Im(%%);conjugate(%%%);argument(complex_number);( v! A9 U& Q* T+ O/ P  s, X

1 k6 }  |' K+ U& Q. h 6 g9 K* I0 d2 z0 Y( I7 @8 L2 A* j" J

1 k! v( Q% B# F8 t5 u8 L
/ `% q8 M, d: E; j7 B. [, E0 e6 \值得注意的是上行命令中均以“;”结束, 因此不能将命令中的2个%或3个%(最多只能用3个%)改为1个%, 因为%表示上一次输出结果, 若上行命令改为“,”结束, 则均可用1个%.
( @! O8 ?& `1 z6 c为了在符号表达式中进行复数运算, 可以用函数evalc( ), 函数evalc把表达式中所有的符号变量都当成实数, 也就是认为所有的复变量都写成 的形式, 其中a、b都是实变量. 另外还有一些实用命令, 分述如下:   ) c+ |+ U, j2 h" H. y, x
1) 绝对值函数
% R: p) R2 M" j) T$ {5 o命令格式: abs(expr);  : E  p  r# x3 W4 m' O8 Q; t" L) m
当expr为实数时,返回其绝对值,当expr为复数时,返回复数的模./ ~; p: U4 p7 `, ]
> abs(-2002);    #常数的绝对值; N4 a' x  w3 W

1 p8 K0 u$ E/ U8 r' X> abs(1+2*I);   #复数的模
% A! H' v) w: \/ U) y2 O; i % z, n- f) B5 S1 G: |, J/ e& @
> abs(sqrt(3)*I*u^2*v);  #复数表达式的绝对值& Z5 Q6 D8 j. y( G( |% N
. w8 `, n' _% d3 g/ \
> abs(2*x-5);   #函数表达式的绝对值
2 f& u' h! W3 ~9 i. V, M# b * F! q& d! R" z+ a' `2 u3 O
2)复数的幅角函数
; Y' _, h+ B7 a& H: _命令格式:   argument(x);  #返回复数x的幅角的主值, d& }! E8 F/ d/ U' b6 j9 J
> argument(6+11*I);8 o& Z7 L  x8 K  {0 B8 u0 ^
' u* c& X! @! U3 T  u6 Z- N
> argument(exp(4*Pi/3*I));
/ }7 @0 r  o9 {- B
, Z8 Z+ c) ^' a6 ~) m3)共轭复数
  U( ]9 {7 e  \命令格式:   conjugate(x);  #返回x的共轭复数. @' ~* N- R9 V  s( v3 @: K
> conjugate(6+8*I);
1 z" N. G& X9 }" r7 Z. Y
$ z! i$ T$ m0 C6 ]& S> conjugate(exp(4*Pi/3*I));! @7 W/ Y9 k) q) Y3 }

) n- J5 G9 v  I  J2.1.3 数的进制转换
3 w- K/ p7 `- U( h数的进制是数值运算中的一个重要问题. 而在Maple中数的进制转换非常容易, 使用convert命令即可. / B) B( `6 E0 W3 ]5 }; S5 K
命令格式:   convert(expr, form, arg3, ...);   
& e0 D) d$ f7 K. y# m& O其中, expr为任意表达式, form为一名称, arg3, ... 可选项.
8 p, w! w1 Y7 J) X5 ]下面对其中常用数的转换予以概述. 而convert的其它功能将在后叙章节详述. 8 x! }  o" I) I' ^& I) p
    1)基数之间的转换
" d9 C) X! ?! _# N1 `命令格式:   7 j9 p2 _6 }5 |4 p. q) h( Y/ }. r* n
convert(n, base, beta);      #将基数为10的数n转换为基数为beta的数
1 \6 _4 G2 n5 {- E# |+ y* m    convert(n, base, alpha, beta);#将基数为alpha的数字n转换为基数为beta的数$ J' j3 h) I, `# z1 r0 }# t
> convert(2003,base,7); #将10进制数2002转换为7进制数, 结果为: (5561)7
5 s2 ^$ `# N/ N- E ( k) j) @% R1 ^+ Z
> convert([1,6,5,5],base,7,10); #将7进制数5561转换为10进制数( B7 I# ]9 r& r4 m2 w; Y) a- J; L% G

6 E: m+ U; @4 O> convert(2002,base,60);       #将十进制数2002转换为60进制数, 得33(分钟)22(秒)
: R+ c. [! i$ P6 d& L 0 Y( r; j5 a* T; ?2 \
    2)转换为二进制形式
' V" g6 \# Q$ J/ f% s2 t7 g命令格式: convert(n, binary);3 z- o" h3 e, B
其功能是将十进制数n转换为2进制数. 值得注意的是, 数可以是正的, 也可以是负的, 或者是整数, 或者是浮点数, 是浮点数时情况较为复杂.
) ?& t% k  i! N% V; w+ y) `, U. M> convert(2002,binary);   ; k2 D5 e, G' g( g5 u/ [

* {/ r% W/ X: e: @% E/ T4 q4 C> convert(-1999,binary); 1 ?4 P6 i& P9 y1 O5 G9 P
( p4 c) ~0 ^0 e  `8 S
> convert(1999.7,binary);
' }- U3 b0 C9 C  O0 Y, x
7 T' N& N$ g) i" b% `4 Y3)转换为十进制形式3 {8 f0 C- g) M8 v* K) Q
其它数值转换为十进制的命令格式为:   " ?$ U+ F+ M" r1 k$ _7 r+ k
convert(n, decimal, binary);   #将一个2进制数n转换为10进制数( d$ j/ g& Z4 f  E- {
    convert(n, decimal, octal);    #将一个8进制数n转换为10进制数, q& o! R2 Z6 N
    convert(string, decimal, hex);  #将一个16进制字符串string转换为10进制数/ j$ e( [' n% C; O; i6 `& `2 Q) a8 ^
> convert(11111010010, decimal, binary);   
! B  W7 K- [5 ~& y6 N( _ ! }) p" U% n/ E0 R; ^' w
> convert(-1234, decimal, octal);           : p, Q- t! o7 `1 m& |" ~

+ I2 f! B, W" g3 _3 d' w1 Z: B> convert("2A.C", decimal, hex);         
% y3 U- p( z7 L, N 9 l. H" |, R  ~3 u4 g, |1 z
4) 转换为16进制数( E, F- X2 S9 x# c. |0 M
将自然数n转换为16进制数的命令格式为: convert(n, hex);   + r6 z4 c( E. ~0 h$ T# _, S. M7 R5 w
> convert(2002,hex);  convert(1999,hex);
- Y6 k, x* i0 L" k6 c
8 W, H0 U1 G$ \. D. q0 q; _2 b- |: Y. T 1 H% ]: A* n4 G
5)转换为浮点数
8 B3 U% X/ Z/ W1 V命令格式: convert(expr, float);2 |3 T" \  y! |2 T5 a* n: ~# S0 @" C
注意, convert/float命令将任意表达式转换为精度为全局变量Digits的浮点数, 且仅是对evalf的调用. . o) ?# P  r* _6 J# f. t& m
> convert(1999/2002,float);
2 _9 Y$ V9 Y# o% L& _1 i  ]8 d 1 `, M( n3 I0 j( t) a" Q4 Z
> convert(Pi,float);
; [9 H: r: {8 r! ]& H
- q. c" y6 W  s3 U$ A- b2.2 初等数学
7 A! t4 k! T* r. Q4 g  ~/ e" Q    初等数学是数学的基础之一, 也是数学中最有魅力的一部分内容. 通过下面的内容我们可以领略Maple对初等数学的驾驭能力, 也可以通过这些实验对Maple产生一些感性认识. . N1 b0 t7 d  T
2.2.1 常用函数, M8 D: O4 X4 C0 B% [$ v0 x
作为一个数学工具, 基本的数学函数是必不可少的, Maple中的数学函数很多, 现例举一二如下:   ! ^* w% g3 D; X  Y0 x1 }
指数函数: exp
! Y& w! x3 R5 ^+ ]. ]: p一般对数: log[a]' ^0 ^  e; Q$ W3 F+ Z9 z
自然函数: ln
7 U, ?  X. _3 ], J& f" Z7 e, w常用对数: log10  b7 N) o& a+ q3 a
平方根: sqrt
# M1 a6 h  `! L3 G* W绝对值: abs- j8 H' ]% _& B" ]! E4 _. C
三角函数: sin、cos、tan、sec、csc、cot
' B1 W+ e9 ^& M! h3 `, ]反三角函数: arcsin、arccos、arctan、arcsec、arccsc、arccot
3 f! R: f3 c* G* T3 s双曲函数: sinh、cosh、tanh、sech、csch、coth
) H/ ^, z7 r& y' Y$ S反双曲函数: arcsinh、arccosh、arctanh、arcsech、arccsch、arccoth! X& @0 ^8 f# u1 t7 r! ]# f" D
贝赛尔函数: BesselI、BesselJ、BesselK、BesselY# N4 w& M( s" h& G
Gamma函数: GAMMA
2 Z4 n8 t* Q. p5 z0 \- ?0 g5 s/ `% p误差函数: erf& ?$ N5 j- b+ n0 `' @. V
函数是数学研究与应用的基础之一, 现通过一些实验说明Maple中的函数的用法及功能. $ n! S" D/ b* n, f1 R
1) 确定乘积和不确定乘积
7 e) Q4 \- j* x- \: M& z. `* h: g命令格式: product(f,k);  
& ^8 a; r% I% @- q1 uproduct(f,k=m..n);  
: l6 l* T7 X8 J% ~, vproduct(f,k=alpha);
6 T1 x$ T( u" Q8 Gproduct(f,k=expr);
' [5 m( C2 Q2 k其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—包含k的任意表达式.
# K, V+ v4 y6 H4 v8 l- e/ Y> product(k^2,k=1..10);   #计算 关于1..10的连乘
! F5 i& i9 P. L) b
1 D7 L. r/ d2 e> product(k^2,k);         #计算 的不确定乘积2 ~( x- W) W4 ?7 _9 P$ E
7 o) f3 S2 t# ?8 f
> product(a[k],k=0..5);    #计算ai(i=0..5)的连乘' K- A$ O0 V0 p4 F% }3 J* z% |

; S# P3 z1 ?, |7 L5 B> product(a[k],k=0..n);    #计算ai(i=0..n)的连乘% Y, P9 F; _% v" W$ q
* P/ m! @, s2 R- I
> Product(n+k,k=0..m)=product(n+k,k=0..m);   #计算(n+k)的连乘, 并写出其惰性表达式- {+ D/ y, T. N3 @9 V$ Q( ~

2 _; n. k: _6 {8 n) ~4 |6 D> product(k,k=RootOf(x^3-2));     #计算 的三个根的乘积
7 y+ Y  S* S! K7 r) i , S( G; M: t) H4 V- Y
    product命令计算符号乘积, 常常用来计算一个公式的确实或不确实的乘积. 如果这个公式不能求值计算, Maple返回 函数. 典型的例子是:   
# r; d' G; B7 v6 ?* z* @9 {" ^> product(x+k,k=0..n-1);0 h, k% b/ D' k! A

  ~( ^. |% B: g- s; Y如果求一个有限序列值的乘积而不是计算一个公式, 则用mul命令. 如:   0 f  q+ A2 n5 x+ X
> mul(x+k,k=0..3);
( d, E3 h# j9 L$ l( `
& |1 e& a& m" ?) l8 p, B. b2)指数函数# l) q- F3 |* b0 V
计算指数函数exp关于x的表达式的命令格式为: exp(x);
5 U) Y' K8 ?$ I5 @) s/ T2 I> exp(1);
2 e) j: a' {, G/ I) m
5 V2 L  d* h5 d/ L> evalf(%);8 w5 m  V* t, Q
/ G- e( r3 ?5 K2 Z0 a
> exp(1.29+2*I);
- }9 x* [0 W( S5 ]9 O - G* y& @, c1 ?6 ~2 v* H8 }
> evalc(exp(x+I*y));
, @4 N3 M- B- Z9 ]+ C) n 3 K4 A, C$ c! L
3)确定求和与不确定求和sum' {6 C/ w. w$ o: J8 j
命令格式: sum(f,k);  
7 D9 I: t' h* e& p: }* k2 j0 M& R! M, tsum(f,k=m..n);  - T( |! t# ]. {" _9 Z/ a: d6 B7 M. G
sum(f,k=alpha); # W) e$ v' e8 r2 s0 a
sum(f,k=expr);! b$ K& X0 w& u6 [6 M3 g/ u
其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—不含k的表达式. ' c5 B. G# d* p' w/ @; _
> Sum(k^2,k=1..n)=sum(k^2,k=1..n);
, C" A. [* |7 @; W6 Y0 }7 _+ V3 t
/ J- y6 y& f& N: g) T% u2 r/ ^> Sum(k^3,k=1..n)=sum(k^3,k=1..n);
- @# a& [; S* _, e1 ~4 D
# P1 U6 U$ Z& D6 q> Sum(k^4,k=1..n)=sum(k^4,k=1..n);
% V8 g( M, O* L ( L9 J/ Z' k7 ^2 n! T' ]5 m6 J
> Sum(1/k!,k=0..infinity)=sum(1/k!,k=0..infinity);5 G) b, }5 R: j2 M3 d3 h
6 ]* Z: y& p/ f3 \$ `- v
> sum(a[k]*x[k],k=0..n);' n% m# v- Z5 g4 `- ^

3 u; v* r0 F9 \> Sum(k/(k+1),k)=sum(k/(k+1),k);
( U( g; T! S. j$ ^* \ 1 T! ]5 b5 F* i. {2 I) s
> sum(k/(k+1),k=RootOf(x^2-3));
& t- {% t; D/ F! j/ Q& ~
0 C8 v- O3 S8 m! ysum函数可计算一个公式的确定和与不确定和, 如果Maple无法计算封闭形式, 则返回未求值的结果. 值得注意的是, 在sum命令中将f和k用单引号括起来, 可避免过早求值. 这一点在某些情况下是必需的.
) Q& @3 C0 k5 [! |+ w> Sum('k','k'=0..n)=sum('k','k'=0..n);6 p5 c0 R7 i7 q

$ W5 h( s4 o2 Z  m. z/ f如果计算一个有限序列的值, 而不是计算一个公式, 可用add命令. 如:   
; z, m1 B) r! G) C3 Z6 `0 W> add(k,k=1..100);
. K  a, u' [& j! [% m3 ~ * C4 S4 |1 _. [6 {' `) B
尽管sum命令常常用于计算显式求和, 但在程序设计中计算一个显式和应该使用add命令. . S4 \$ v0 u0 X4 I  a7 _
另外, sum知道各种求和方法, 并会对各类发散的求和给出正确的结果, 如果要将求和限制为收敛求和, 就必须检查显式的收敛性.
& s7 o" R, y0 n# L# X& p6 s7 U3)三角函数/双曲函数
6 U! E6 k3 R, g/ c  {6 k0 z0 m: T命令格式:   sin(x);   cos(x);   tan(x);   cot(x);   sec(x);   csc(x);
3 \$ s2 ?! @% Y" x. @4 r          sinh(x);  cosh(x);  tanh(x);  coth(x);  sech(x);  csch(x);% K3 x: t5 [% b* k
其中, x为任意表达式.
; z. `4 U" Q* q- X0 T& |1 o( D值得注意的是三角函数/双曲函数的参数以弧度为单位. Maple提供了利用常见三角函数/双曲函数恒等式进行化简和展开的程序, 也有将其转化为其它函数的命令convert.5 ?, D! R) E) A
> Sin(Pi)=sin(Pi);
# ]9 f- B5 Y: R, K   U) Z( o* H- e; n8 ^
> coth(1.9+2.1*I);' I, k8 y7 B' F* P
% `: \0 B! a0 i/ v+ A
> expand(sin(x+y));     #展开表达式* Y9 |$ }7 y  B! Y
' R6 c/ u1 |# a8 x# \% O
> combine(%);        #合并表达式; k0 T# Q) e% r. w1 \# Y
6 i- }9 m) _! k! a; F
> convert(sin(7*Pi/60),'radical');
( x6 b* Z$ {$ r" @0 j . {" W, i3 T4 d
> evalf(%);: L( h% Z& u/ X+ p7 s

& E0 O, E" _) L' Q  d. l但有趣的是, combine只对sin, cos有效, 对tan, cot竟无能为力.
( M' E! K( \: l  u+ {3 K, {4)反三角函数/反双曲函数! Y  [/ C0 c3 ?  M9 ~. j
命令格式: arcsin(x);   arccos(x);   arctan(x);   arccot(x);   arcsec(x);   arccsc(x);) R9 L3 |4 Z, z* c+ h
     arcsinh(x);  arccosh(x);  arctanh(x);  arccoth(x);  arcsech(x);  arccsch(x);   / W6 {) x) V. x$ ~  D. [! z
arctan(y,x);& n5 k( y) J$ x; \
其中, x, y为表达式. 反三角函数/反双曲函数的参数必须按弧度计算.
' }' A$ y9 _. T. y! m' n" L算子记法可用于对于反三角函数和反双曲函数. 例如, sin@@(-1)求值为arcsin.
6 m1 [2 B$ c/ K> arcsinh(1);
  c  X' T. Y9 O% X
8 i/ h  W# y8 t  {$ _6 K( B4 Q> cos(arcsin(x));) X! }( l8 v- N8 b- X" l/ Y6 f% b

$ J3 K# ?# `; q/ q0 N: \> arcsin(1.9+2.1*I);
3 |$ |" E- `1 i$ _+ ^
- a$ ^3 u& C1 G7 _. X5)对数函数
- S7 Q! \0 `. R. }命令格式: ln(x);           #自然对数
! Z$ W3 R! B3 {$ p/ C6 _log[a](x);        #一般对数
5 m' u$ V7 K" q" Y0 Jlog10(x);        #常用对数6 l7 i) o; p1 f: U- s9 y
一般地, 在ln(x)中要求x>0. 但对于复数型表达式x, 有:   + d& q& ]2 M. t. `" o3 K
  (其中,  )2 j& i4 x# [0 n1 C7 ^6 Y8 E
> ln(2002.0);
# s# w4 [/ O' }8 q
& w( m. l. e4 V$ d$ \1 `( W> ln(3+4*I);# ~- v- k1 z2 ?4 f+ u
& S% r5 [* b; q9 A
> evalc(%);    # 求出上式的实部、虚部
* n0 [! P, Y" \* ?5 z' h1 O . \+ B* k3 e  x$ I9 j
> log10(1000000);( h4 i# k0 K& s1 m( ~. n
! A; P/ {9 ^- `7 P, O
> simplify(%);   #化简上式
1 v- V' k# y% R; X' [ , ^: L; A/ p# b( k7 o6 D- t1 I
2.2.2 函数的定义
9 v6 p3 a- [* B8 h  N/ i( d; b% E2 ]! oMaple是一个计算机代数系统, 带未知或者已知字母变量的表达式是它的基本数据形式. 一个简单的问题是, 既然表达式中可以包含未知变量, 那么它是不是函数呢?试看下面一个例子:   4 z1 t( S/ _7 |6 h1 \  ^+ I; C
> f(x):=a*x^2+b*x+c;  j; V/ m1 v. I
# m9 w( h8 J. d& f" g: `
可以看出, Maple接受了这样的赋值语句, 但f(x)是不是一个函数呢?要回答这个问题,一个简单的方法是求函数值:   6 Y+ f. Z/ I7 C  `6 @3 U  W
> f(x),f(0),f(1/a);
$ F4 L* ?6 o: X& L ; A/ w* Z  a" b- R' g
由上述结果可以看出, 用赋值方法定义的f(x)是一个表达式而不是一个函数, 因为f(x)不能把所定义的“自变量”或者“参数”转换成别的变量或表达式. 但从赋值“过程”可以看出, f(x)虽然也算是一个“函数”, 但却是一个没有具体定义的函数:   
4 ?+ h! a& C/ k0 _! |1 J7 A> print(f);
. v* F; `$ T7 {- z7 h; v9 f
% e; E+ C$ T2 S( _事实上, 我们所做的赋值运算, 只不过是在函数f的记忆表(remember table)中加入了f(x)在x上的值, 当我们把自变量换作0或1/a时, f(x)的记忆表中没有对应的表项, 所以输出结果就是抽象的表达式.
( G- o7 @, o7 c, _在Maple中, 要真正完成一个函数的定义, 需要用算子(也称箭头操作符):   
/ h: Q1 A7 {* n> f:=x->a*x^2+b*x+c;3 |' n& P! j* k+ d7 B5 P, E3 H* y) i

& u0 r+ `- t# m" F' e> f(x),f(0),f(1/a);
8 V8 P, z' f% D
3 R8 G  \0 N! e1 t4 r5 K1 [多变量的函数也可以用同样的方法予以定义, 只不过要把所有的自变量定成一个序列, 并用一个括号“()”将它们括起来(这个括号是必须的, 因为括号运算优先于分隔符“,”).
) B+ Y, U8 Y% R' b+ C. o- j> f:=(x,y)->x^2+y^2;
% G# F1 I+ H  i3 A * I. v& R! Z' l/ ^( Y, z
> f(1,2);
) E: X7 g- l6 n ; r1 I# J% [- a; T
> f:=(x,y)->a*x*y*exp(x^2+y^2);
0 ^- {: [* ?+ U% A7 Q7 M2 p% r
; o5 b4 y: o. B* a综上所述, 箭头操作符定义函数的方式一般为:   4 O; m1 I/ ^0 S( r6 i6 K1 g
一元函数: 参数->函数表达式, ^  d: u% d# j9 v: k1 @
多多函数: (参数序列)->函数表达式
/ p2 M" l9 x4 m# ?( N7 y无参数函数也许不好理解, 但可以用来定义常函数:   
: S3 P8 S$ l! O9 S3 ~> E:=()->exp(1);
+ e; L! Q+ W. |) X0 q& ~) R  Q
# P5 I" x" i, D" ^" p$ X! U> E();6 h4 p5 g7 F& E  w. P
$ U; ^. r+ y0 V
> E(x);
3 l1 n) R: b; d
0 Y" x0 |4 r8 {4 M& j另一个定义函数的命令是unapply,其作用是从一个表达式建立一个算子或函数.
) U. j& R/ J) w) T定义一个表达式为expr的关于x的函数f的命令格式为:  f:=unapply(expr, x);         
# P, Y+ v* n: Z& ^$ s6 ^, c定义一个表达式为expr的关于x,y,…的多元函数f的命令格式为:  f:=unapply(expr, x, y, …);     
( P! G4 ?7 l5 Y+ l2 S$ y! E6 H( f> f:=unapply(x^4+x^3+x^2+x+1,x);, y  L% f: D+ e# R

$ {0 d6 e6 m" T1 X, @( i& T4 s> f(4);
& t. Q$ Y  s$ c3 t9 ]. ], b9 N 0 B9 s) ]1 ?4 O9 \. T8 i4 t
> f:=unapply(x*y/(x^2+y^2),x,y);
; I2 l7 x1 q9 h& C( x
# v$ `# Z+ A' }' o  |> f(1,1);
. y$ F# A# U* r- g4 K9 X0 M' Z ( f& |$ o* F4 O, `
借助函数piecewise可以生成简单分段函数:, e! I0 G% d- X$ |- O' Q. K# _% _
> abs(x)=piecewise(x>0,x,x=0,0,x<0,-x);
, b/ t! H/ `/ s 8 C7 D5 C9 \- @: T5 C8 X- Y4 p) ^
清除函数的定义用命令unassign.
; X: c2 S9 ~) p; z  y> unassign(f);% J% K# |) E3 o8 @
> f(1,1);
7 a: H& R/ o1 X& m9 e ( d( F! [/ _( h0 t
除此之外, 还可以通过程序设计方式定义函数(参见第6章).
. r3 m$ u2 F8 V" r9 M定义了一个函数后, 就可以使用op或nops指令查看有关函数中操作数的信息. nops(expr)返回操作数的个数, 函数op的主要功能是获取表达式的操作数,其命令格式为:& F$ ^" _4 V- s
op(expr);          + V3 R, c# V; R- i
op(i, expr);         
2 _% ^" d' Y+ J6 Y) C4 zop(i .. j, expr);      4 [+ `' T( L. O% b/ y9 \$ Q9 H
nops(expr);) Y. e  h. ~- S* e/ ]- |$ \
如果函数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的类型.
( a& E6 q6 N0 r& W8 U命令op(i .. j, expr); 执行的结果是expr的第i到第j个操作数, i..j中含负整数时的情形同上.- ^+ v5 R. y7 |9 v
命令op(expr); 等价于op(1..nops(expr), expr);
2 }5 }6 m. D8 e; l$ h; S特别地, 当op函数中i为列表[a1, a2, ..., an], 则op([a1, a2, ..., an], expr); 等价于op(an, op(..., op(a2, op(a1, e))...));
: s# g! _, A/ I7 d0 T2 _而当expr为一般表达式时,nops(expr)命令返回的是表达式的项数, 当expr是级数时返回级数每一项的系数和指数的总和.
5 Y* f5 L5 T$ z, `0 g> expr:=6+cos(x)+sin(x)*cos(x)^2;+ i+ L' D/ Q+ p/ m; U  p$ l- w6 H' A
! D& p1 q8 j9 @" |' f) \* ^
> op(expr);! [: y, f- G2 M0 N$ O1 b; C* c
3 G% S; y9 O, T- v6 [, Z- ]
> nops(expr);
6 `. x/ p. |2 B# M* K! M
! O' G6 a+ Z; k3 z> p:=x^2*y+3*x^3*z+2;  G& F% d  e6 D- v' m( i' `; z

6 Z7 f3 u4 Q% W, j) o' v> op(1,p);4 t0 \. z0 f% p% B6 c) V
- a& q* D5 e' o0 o& j
> op(1..nops(p),p);
+ [# D' d( W* ~8 u4 G& @
, Y1 \% C# j$ I. e- K( }5 q> op(op(2,p));
1 z( T0 X8 q; Q0 l) j. m* E: M $ C. O0 l- h, O2 S' h) c4 [  O
> u:=[1,4,9];
0 p# K. }' s* d5 x1 ~+ d4 n+ w0 U 9 ~5 v  Y  z- q" _- F4 a
> op(0,u);0 u4 O* |1 f% l) D+ N/ p

+ B, |, h7 V/ I3 x> s:=series(sin(x),x=1,3);, \3 ~1 W' l: \2 V6 }" A
# y- J2 V/ H" @4 Q7 B1 {, ]: p
> op(0,s);
# Z2 o6 u! X! w4 z: i: W           D% F' V8 ~6 q  C/ I
> nops(s);3 t% s$ \) A6 P- T

7 m- H! k& K* T9 M: \! z下面一个有趣的例子说明了Maple在处理算术运算时的“个性”:
. K# h8 Y4 I7 K9 N6 Q& F> op(x*y*z);) p6 J2 g% U9 S* ?' q( ?* t; Z/ o

# Y1 A8 y& B0 p4 T* O  Y> op(x*y*z+1);
" Z* u+ K% v( l 0 U4 ?! Z9 k1 h& ^, W
2.2.3 Maple中的常量与变量名% w, u+ `. o. N4 c2 E5 X( R- N/ x2 L
为了解决数学问题, 一些常用的数学常数是必要的. Maple系统中已经存储了一些数学常数在表达式序列constants中:   
6 f! Z/ R' @& b> constants;
9 L( i0 i0 K  r# G, C
: [) ?/ s  S% D$ ?! }4 `  r* j为了方便使用, 现将上述常数的具体含义列示如下:   2 Q6 N8 l3 |. R) l/ J; ~5 p$ p
常    数        名 称        近似值
- n2 |% A* f3 |! ?0 g圆周率 0 p5 M& ?% b1 d# M4 {- u
Pi        3.14159265358 M% _# m4 R, }6 q6 X6 P. ~5 V
Catalan常数 # M; y3 p9 L* O8 q7 p
Catalan        0.9159655942
, W5 p6 `. H2 qEuler-Mascheroni常数
2 [1 `7 W9 M$ ?2 @gamma        0.5772156649
: }1 d+ i8 u6 q& w9 ^; f7 ~" K& F ' l& H, u! _, t( D& U5 Q9 F( G
infinity        " L* h* Y4 E1 [0 M) J" O' i- T

, B0 c& p  _' I& ]) Z! ]需要注意的是, 自然对数的底数e未作为一个常数出现, 但这个常数是存在的, 可以通过exp(1)来获取. 9 h$ @  J1 F' L
在Maple中, 最简单的变量名是字符串, 变量名是由字母、数码或下划线组成的序列, 其中第一个字符必须是字母或是下划线. 名字的长度限制是499个字符. 在定义变量名时常用连接符“.”将两个字符串连接成一个名. 主要有三种形式: “名.自然数”、“名.字符串”、“名.表达式”.
% q1 j; c- H4 ?/ o9 V  J( H值得注意的是, 在Maple中是区分字母大小写的. 在使用变量、常量和函数时应记住这一点. 数学常量 用Pi表示, 而pi则仅为符号 无任何意义. 如g, G, new_term, New_Team, x13a, x13A都是不同的变量名. 0 I% W. }' ~$ p# S$ H) K0 P
在Maple中有一些保留字不可以被用作变量名:   
) R* L# y" T" g/ T3 M! [( Qby      do      done     elif     else     end        fi        for      
/ k. H! I9 m  c; E& @from    if       in       local     od     option    options     proc         ; I" C- G" |0 d* _) m: Q; I
quit    read     save     stop     then     to        while      D. n! n1 Q$ _$ h  J* a& o2 k* d
Maple中的内部函数如sin, cos, exp, sqrt, ……等也不可以作变量名. * j) N3 H3 G* w4 Z
另外一个值得注意的是在Maple中三种类型引号的不同作用:   1 K1 t1 Z8 Q" q' z6 @% g, O
`  `:   界定一个包含特殊字符的符号, 是为了输入特殊字符串用的;   
9 h- d4 ]) n9 Q; `( f; x6 {8 F'  ':   界定一个暂时不求值的表达式;   
% B# F2 l0 ?  X. ~- w"  ":   界定一个字符串, 它不能被赋值. % X1 j. U3 N* }4 k+ o
2.2.4 函数类型转换           
+ s, t& a9 u( z7 j0 |+ b/ e+ X7 a函数类型转换是数学应用中一个重要问题, 譬如, 将三角函数转换成指数函数, 双曲函数转换成指数函数, 等等. 在Maple中, 实现函数类型转换的命令是convert. 命令格式:  # l( U: G8 ~8 o! t
    convert(expr, form);        #把数学式expr转换成form的形式8 y* e9 D9 v( c. P# Q+ G1 O  ?
convert(expr, form, x);      #指定变量x, 此时form只适于exp、sin、cos
, u/ z* M3 s4 K& n# J+ ^- lconvert指令所提供的三角函数、指数与函数的转换共有exp等7种:   
. C* V8 |( S* {- n) s, W* h(1) exp: 将三角函数转换成指数1 \: S: H+ F$ o8 H! W
(2) expln: 把数学式转换成指数与对数' ^% g6 B# M( e4 }" i
(3) expsincos: 分别把三角函数与双曲函数转换成sin、cos与指数的形式; z7 J. h- d! W7 i* M* ^
(4) ln: 将反三角函数转换成对数
& N6 F+ I9 z- o4 A, K(5) sincos: 将三角函数转换成sin与cos的形式, 而把双曲函数转换成sinh与cosh的形式7 l5 i! w1 g! [% v3 F7 W% L- j
(6) tan: 将三角函数转换成tan的形式) Y2 T8 O+ ?9 |# _9 j; N  \* O, v7 ^
(7) trig: 将指数函数转换成三角函数与对数函数1 V1 G( c' k- \
> convert(sinh(x),exp);   #将sinh(x)转换成exp类型
# v4 O: [$ d5 v2 s8 ?8 r
$ v: ]# E# c+ a> convert(cos(x)*sinh(y),exp);! p  g; D4 l. _( X! @
5 e( N/ T/ C. h; m' J5 `
> convert(cos(x)*sinh(y),exp,y);
! w6 |: F4 b5 e$ ^+ `
$ G3 j$ m+ E7 j- M$ L0 ^5 ?5 Z+ B> convert(exp(x)*exp(x^(-2)),trig);
( e; ]+ c1 X7 ]. g' O" B% B 5 w0 X+ o7 {  E# _5 f
> convert(arcsinh(x)*cos(x),expln);- p9 ]$ C: d' P, s' i8 e

  G1 u* p  k& f1 m1 |> convert(cot(x)+sinh(x),expsincos);
" H$ q  h+ X% ~
( M  ?9 E! H: W7 g> convert(arctanh(x),ln);7 A0 {& u0 @" \8 s3 P2 Z
0 l: P) \4 s  P- I/ R
convert在有理式的转换中也起着重要的作用. 在有关多项式运算的过程中, 利用秦九韶算法可以减少多项式求值的计算量. 在Maple中, 可以用函数convert将多项式转换为这种形式, 而cost则可以获取求值所需的计算量. 注意: cost命令是一个库函数, 第一次调用时需要使用with(codegen)加载. 例举如下:   ; J& w5 e- H1 g: _+ G
> with(codegen):# Z" I/ {8 Q3 V; F0 K
> p:=4*x^4+3*x^3+2*x^2-x;
( Y& F, ]" [' A$ i; n6 p) K% e $ i% }8 _5 j$ M
> cost(p);
; Y. B. m" B6 n* _- U3 s: E
: G; l- u0 g, g5 O" ~> convert(p,'horner');  #将展开的表达式转换成嵌套形式* J& `1 ^! d) d# @5 d
0 `% `) u2 U+ ?
> cost(%);; w! `7 k; u/ f* Q( q6 W6 @! Z7 T

& t0 V$ E* i# K) t# J  n* ^0 @同样, 把分式化成连分式(continued fraction)形式也可以降低求值所需的计算量.
) }3 E4 z0 \( ?3 k: s> (1+x+x^2+x^3)/p;
) g  n6 T6 G' |) k: |& a
" [& n9 A! O) u8 g( t8 G% p> cost(%);
/ o9 Q3 |% F; y$ F. ] 1 [8 n* ]6 U; U: [
> convert(%%,'confrac',x);
4 z7 d" Z! N1 l# m9 j+ n) k
: a: v& w) R# I5 s7 @; O# I+ Z> cost(%);+ ?9 l6 S& W, k4 O

- ~5 ~5 f5 q. Q在某些场合下(比如求微分、积分时), 把分式化成部分分式(partial fraction)也就是几个最简分式的和式的形式也可以简化运算, 但简化程度不及连分数形式.
& u6 Q2 t' C3 n2 y) W> convert(%%, 'parfrac',x);
+ j% k  W+ w" W. Q9 Q , q/ {# ^  \! D' [
> cost(%);4 g. w7 z% i& z! x7 D' \
$ W7 G& S5 `/ c
而把分数转换成连分数的方法为:
+ F1 {: w( L) P! y9 X> with(numtheory):
1 m  g/ B0 F" @* o! A3 L> cfrac(339/284);  [' v7 _4 k' s" @% E6 y% _  j9 U' _
% Y  a5 ]8 C  u, n# I( R
2.2.5 函数的映射—map指令
/ D5 L5 @2 O& V: v7 v$ ?- x在符号运算的世界里, 映射指令map可以说是相当重要的一个指令, 它可以把函数或指令映射到这些结构里的元素, 而不破坏整个结构的完整性. 命令格式为:0 P& ^) g" s' E& Q: i! f, X/ p
map(f, expr);      #将函数f映射到expr的每个操作数  O8 r) t2 G' i' ^
map(f, expr, a);    #将函数f映射到expr的每个操作数, 并取出a为f的第2个自变量! y/ W* \4 O# |( r0 C) e+ Q% F' h
map(f, expr, a1, a2,…, an); #将函数f映射到expr的每个操作数, 并取a1~an为f的第2~n+1个自变量4 Z2 G- e; k! B9 o+ a  V
map2(f, a1, expr, a2, …, an);    #以a1为第1个自变量, expr的操作数为第2个自变量, a2为
. @7 V3 I: V2 N, L1 f  L$ N6 U" ?第3个自变量…, an为第n+1个自变量来映射函数f
7 e+ e: T* \( q( Q: l. T; z> map(f,x1+x2+x3+x4,a1,a2,a3,a4);' q1 l0 l  b- R) |
% p$ j$ u1 P7 a4 f
> f:=x->sqrt(x)+x^2;2 h4 P& N, E6 v/ u( _# P
5 H- I( X9 s" |( p8 X5 L& N, q
> map(f,[a,b,c]);8 u: J9 I: v( F1 X9 q5 B

( W: D1 l7 `8 M8 Z) y> map(h, [a,b,c],x,y);
6 G4 C# j! B5 r; o! b4 z) J 5 v- y- v& ]* c* w9 O6 q  A% V
> map(convert,[arcsinh(x/2),arccosh(x/2)],ln);
3 G2 I" y, k7 m3 u) D& S. s
4 r' ^9 g+ t6 _! T/ I# {! k6 v> map(x->convert(x,exp),[sin(x),cos(x)]);
+ I5 }2 E0 p6 t; `, r! M
  X: r' i( f; P1 b; W' T4 C上式的映射关系可通过下式理解:
0 f: u0 H5 l' e2 H8 P! G% E> [convert(sin(x),exp),convert(cos(x),exp)];
( B+ f8 Z. R5 b* x3 {% H! T8 P9 J" S
  N2 u) I5 ]9 e  Y. i5 ?5 F0 ?  b> restart:
' p8 z7 G/ @* w1 \  K+ Kmap2(f,a1,x1+x2+x3+x4,a2,a3,a4);
( c1 s6 R9 Y* y" r9 ?; d! h" D : |/ `: C' W' g* C; ]% v# m
> map2(max,k,[a,b,c,d]); % v* w! K  a* l& t3 k/ F
- z, L% ~0 O& Z6 b
再看下面示例:   
2 }7 ^% i/ Z0 w" S5 M> L:=[seq(i,i=1..10)];
9 p2 M) G( r) [# ~( _ * K# L: f* }, K' T' B$ F5 W
> nops(L);$ C) w% v) i! U' X, g9 M2 s

6 R& x/ x* g" r7 f3 \/ O' F  v% L> sqr:=(x)->x^2;
0 A( D9 D2 Z- R: f0 ]
5 E. P. W) @( Q7 i# t> map(sqr,L);
7 f5 g+ ^( T$ F& e8 H9 r
7 x& K* F1 c6 g9 o; v/ I! f> map((x)->x+1,L);+ E! T& `+ C; c1 F: J
9 J. n2 b+ H! U
> map(f,L);
( G2 {8 M; }' d0 O- x / i( U& J" J3 o, M0 p4 h
> map(f,{a,b,c});- ^+ O' Y9 ^0 W* n* j+ C+ a% E
! u: _) _4 a% e9 ]1 k/ `/ E
> map(sqr,x+y*z);
: Z/ Q$ D; H7 h! O; M / {2 A/ p3 X: g9 f3 ^' {
> M:=linalg[matrix](3,3,(i,j)->i+j);: |4 m  K6 T: c; }( o3 u# t' K3 ~
! |4 x  v5 ]0 f8 m# k0 i
> map((x)->1/x,M);9 j% M1 o5 V7 q% H

. |6 ]. G1 \* T: t. n3 求 值
8 l9 j+ M" V; R8 R3.1 赋值
* q# K( t% k% ~3 ~4 G- R在Maple中, 不需要申明变量的类型, 甚至在使用变量前不需要将它赋值, 这是Maple与其它高级程序设计语言不同的一点, 也正是Maple符号演算的魅力所在, 这个特性是由Maple与众不同的赋值方法决定的. 为了理解其赋值机制, 先看下面的例子. 0 a7 ?* ~) }4 ^9 j. \7 `
> p:=9*x^3-37*x^2+47*x-19;' [3 R/ N7 h" v

1 \4 w4 ~2 Y" J' X& j6 S> roots(p);
& G3 y. s. M! Q
1 T( C% B0 J5 Z+ V' ^% x> subs(x=19/9,p);3 D' D: q* }6 d8 C% q2 [5 l

3 z  Q% _& h% s" i- k9 S在这个例子中, 第一条语句是一个赋值语句, 它的作用是把变量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;”这样的简单语句即可验证.
2 u1 [4 m/ l' T$ Q! a/ R' S* ?3.2 变量代换
; A/ D$ Q$ m0 u+ W5 c在表达式化简中, 变量代换是一个得力工具. 我们可以利用函数subs根据自己的意愿进行变量代换, 最简单的调用这个函数的形式是这样的:   
( X. \1 C* P& W. {& p# ?. Csubs ( var = repacedment, expression);$ R4 @0 Z) I7 R1 ]
调用的结果是将表达式expression中所有变量var出现的地方替换成 replacement. ) W( B, C+ n2 t% [; H9 N
> f:=x^2+exp(x^3)-8;
+ w/ ?6 V1 {* |( z* l6 V
2 O9 @; R1 d& {6 O( F> subs(x=1,f);
9 [  V/ A3 D: e8 y' B. x& Y : b# w0 Q- y' w5 p2 C3 }9 U* }
> subs(x=0,cos(x)*(sin(x)+x^2+5));
; w1 x2 ~( |5 ?0 a
. A, D* _$ M1 r& E    由此可见, 变量替换只得到替换后的结果, 而不改变表达式的内容, 而且Maple只对替换的结果进行化简而不求值计算, 如果需要计算, 必须调用求值函数evalf. 如:   $ t) A8 v3 }( q" y# A% J
> evalf(%);
, _6 L: B9 I6 `
* J4 U! p- f' u. n' ?变量替换函数subs也可以进行多重的变量替换, 以两重代换为例:   
- \+ b( G; u6 E0 C6 q# [0 usubs (var1 = repacedment1, var2 = repacedment2, expression)
" D; M0 C2 V/ W, N7 O0 ]6 D, v调用的结果和按从左到右的顺序连续两次调用是一样的, 也就是先将expression中的var1替换成replacement1, 再将其结果中的var2替换成replacement2, 把这种替换称作顺序替换;    与此相对, 还可以进行同步替换, 即同时将expression中的var1替换成replacement1, 而var2替换成replacement2. 同步替换的调用形式为:   % e. Z; v- d# K
subs ( {var1 = repacedment1, var2 = repacedment2 }, expression)! H; A9 T2 o& ^& I
下面通过例子说明这几种形式的替换. $ G: ~0 h1 l- ]( s; s+ F0 G1 O9 B  l
> subs(x=y,y=z,x^2*y);              (顺序替换)( D& n0 c$ ^! }: S. G, \
+ R$ k6 \" Z! N" P- C) e
> subs({x=y,y=z},x^2*y);            (同步替换)+ l* W2 u' r2 Y0 Z

& h* ?# Z1 ?# [$ `> subs((a=b,b=c,c=a),a+2*b+3*c);   (顺序替换)$ ]  {* w1 v# x' k' ?0 L/ l
- E4 d& E0 A, K3 B; k4 T& c
> subs({a=b,b=c,c=a},a+2*b+3*c);    (轮  换)( g" g$ k9 |9 d% e( K9 C
+ r& E/ N  A1 t' N1 s- x+ P
> subs({p=q,q=p},f(p,q));             (互  换)
' D2 o# m  H4 J. f+ s 2 Z6 F7 X# h4 D' T# I1 ?
3.3 假设机制
) P) D, h0 Z8 ~( \7 }Maple是一种计算机代数语言, 显然, 很多人会尝试用Maple(或其他计算机代数语言)解决分析问题. 但由于分析问题与处理问题的考虑方法不同, 使得问题的解决存在某些困难. 例如考虑方程 的解. 如果k是实数, 结果显然是x=1, 但如果k是 的复根, 为了保证解x=1的正确性, 必需添加附带条件: 也就是当 时x=1. 这是一个对结果进行正确分析的例子. 然而从代数的角度考虑这个问题时就会把k当作不定元, 此时k没有值, 从方程两端去除k的多项式是合法的, 只要这个多项式不是零多项式即可(这一点是可以保证的, 因为其所有系数不全为0). 在此情况下x=1就不需要任何附加条件. 计算机代数系统经常采用这种分析的观点.
  d: j! Y) U& x; |1 V! q, `% w6 }4 c在Maple中, 采用分析观点解决这类带有一定附加条件的实用工具是函数assume, 其命令格式为: assume(x, prop);
! `0 ?5 B& N/ N3 R函数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);”也不会产生矛盾. - U6 V# R4 R3 x
> Int(exp(-s*t),t=0..infinity);, C, u7 e2 _2 D* k! {0 l8 A
; J9 D$ M: M' \+ k% b
> value(%);- F: X& l1 u. e( \1 R' s- \
Definite integration: Can't determine if the integral is convergent." X0 O. x. A1 e2 y; U/ v. t
Need to know the sign of --> s
, c3 X3 b9 b+ d# jWill now try indefinite integration and then take limits.
  ^# ]9 O4 [3 U# r
) B1 F5 W7 L4 f- K, j> assume(s>0);
7 s/ ^$ z9 B, z, k3 s> Int(exp(-s*t),t=0..infinity);
0 D+ N- s% J/ S; R6 } . I/ k! R. X0 n/ }
> value(%);3 R  q* A" c' E6 [3 e/ }, V* g( K
. g; x& f9 s  F. }8 c$ ?. h# ?( M
3.4 求值规则
/ ]: V/ |: o* W7 m1 Q% d. S在多数情况下, Maple的求值规则设计为做用户期望的事情, 但要做到这一点很困难,因为不同的人在相同的情形下会有不同的期望. 在大多数情况下, 全局变量被完全求值, 局部变量被一层求值. 而由符号' '界定一个暂时不求值的表达式, 单步求值仅去掉引号, 不作计算, 这也是允许取消指定名字或清除变量的原因. 如下例:   
* k, J$ q- r/ j1 C6 z3 S# k7 w> x:=y;" k5 U& {4 h, e$ |! U) U

) z$ O6 W2 X' u+ j  Z> y:=z;! A0 B; P7 s( Y' E  }3 h) ^$ ?
( k( B& R1 t" I' ?
> z:=3;
6 a# O. A0 g( S) T0 a4 v: t & k' K1 e( H$ R. u0 x) q9 o1 q
> x;
* ]3 h) N3 S' u* o* h2 B" e2 U 1 f0 T) C2 z2 A8 T, T, c
> y;
* N* s+ A$ ]. k
- q. _9 o6 ~" C+ p  O- X> x:='x';
& H# F8 x" W6 Q% a" \: D4 W2 |0 x5 J9 t0 _ ( c& g: G# x7 f+ ]5 H$ X6 ^
> x;
8 o2 x1 w' M# i& h8 l- \0 }, ?  {
) y; b3 Y& E2 e" @- x6 M: H4 K> y;2 O' H) ]& G4 u. D

& [; m& M: M" Z) n- x对于不同的问题, Maple设计了不同的求值命令. 现分述如下:   + A/ C/ W5 o% ]3 M: L
1) 对表达式求值8 l5 p+ ~+ |( B
命令格式: eval(e, x=a);  #求表达式e在x=a处的值
2 z/ h  g. p* O; ?5 D! V             eval(e, eqns); #对方程或方程组eqns求值
( R/ o( \9 ?+ i2 f; x6 b             eval(e);      #表达式e求值到上面两层  z* U) r$ [# I( i, T
             eval(x,n);    #给出求值名称的第n层求值
9 I6 ?6 l, e- @# j8 ]> p:=x^5+x^4+x^3+x^2+x+73;! L6 b( T! H" ~" s; G

# W+ Z6 T9 K6 z! e( H+ X- h> eval(p,x=7);6 U! A2 k; l3 S; D' t  ]

, [7 y1 z9 k/ K+ z4 t> P:=exp(y)+x*y+exp(x);1 G! A5 ]0 B. O
. R3 g1 m& F; O" f; w
> eval(P,[x=2,y=3]);
  v6 v* J! ~$ s* _% ~+ C8 \
# ^' f6 j+ ]2 y4 c4 a6 ^/ B    当表达式在异常点处求值时, eval会给一个错误消息. 如下:   7 }; C% [0 P! a
> eval(sin(x)/x,x=0);" H+ t% m) r) e8 |
Error, numeric exception: division by zero7 g- I3 A1 A! n4 }' P
    下面再看使用eval进行全层求值或者对名称几层求值的示例:   
+ H5 K( ^9 c5 h4 q5 M$ E% W> a:=b: b:=c: c:=x+1:( o( x- T+ }% _9 A$ F, O
> a;              #默认的全层递归求值
0 j4 n! S  u' }" ^3 N% @! p# W # p# F6 j6 P, w+ z' a3 A
> eval(a);        #强制全层递归求值4 N* Q8 o* ~* n/ q% i1 u

1 z# v" ^2 e1 g* D3 g' B) A2 {> eval(a,1);       #对a一层求值
9 {: R* n6 Q. ` ; n/ G3 R$ ?7 H+ d* g7 n8 k% a
> eval(a,2);       #对a二层求值" x- c/ z5 k9 v' p  ]' f9 f9 f
+ L0 w  B: j8 s- w0 o/ A% H
> eval(a,3);       #对a三层求值0 ~% }: \$ A$ S! t4 D& g

1 h$ ^9 E5 Z  n2 E> eval(a,4);       #对a四层求值
6 E( i0 m6 N% _) B
( V8 z, a8 ~2 _, ~% u% }% }6 z    2) 在代数数(或者函数)域求值
* }* i  T6 ~" m1 N2 I6 u3 a命令格式: evala(expr);       # 对表达式或者未求值函数求值
/ O) a/ R% {& e, z+ F             evala(expr,opts);   #求值时可加选项(opts)
6 e* r! G, [5 g) a1 l所谓代数数(Algebraic number)就是整系数单变量多项式的根, 其范围比有理数大, 真包含于实数域, 也就是说任意实数都是整系数多项式的根(如 就不是任何整系数多项式的根). 另一方面, 代数数也不是都可以表示成为根式的, 如多项式 的根就不能表示成为根式的形式.
- I9 a' ^2 F* }' }代数数的计算, 算法复杂, 而且相当费时. 在Maple中, 代数数用函数RootOf()来表示. 如 作为一个代数数, 可以表示为:   
. D' ?# Q3 w% V; m> alpha:=RootOf(x^2-3,x);! P7 n9 [4 o/ V  _1 A/ k. A9 ^
% _7 ], s3 B- D0 O
> simplify(alpha^2);: @; [, c2 M* H( m% K7 ~4 E
  [3 u3 w# z. s2 C
在Maple内部, 代数数 不再表示为根式, 而在化简时, 仅仅利用到 这样的事实. 这里, Maple用到一个内部变量_Z. 再看下面一个例子,其中alias是缩写的定义函数,而参数lenstra指lenstra椭圆曲线方法:9 A' c% `# P( N" Y1 _+ s2 T
> alias(alpha=RootOf(x^2-2)):
# ^& p1 v& C- l> evala(factor(x^2-2,alpha),lenstra);9 x5 f" l5 }; K+ \1 m5 R) y3 x6 i8 z

, D3 }2 z  i2 h> evala(quo(x^2-x+3,x-alpha,x,'r'));
" S' q# V8 V9 S# x) |4 q
/ T2 u  E6 ]' c; v; B- g# S> r;$ j* ?2 c+ `! c$ |
$ B- ^! E0 F9 e  L- F+ y
> simplify(%);; ^  _8 j3 Y1 e" U7 q( h  d+ j: a. M

' A1 i1 U  |( K2 h$ i3) 在复数域上符号求值8 J5 y) J$ c2 R& A
操纵复数型表达式并将其分离给出expr的实部和虚部的函数为evalc, 命令格式为:
! K! C& r& B: f) R& C7 A* p2 Kevalc(expr);   . Y* `- Z; J. N2 K9 J9 w+ @
evalc假定所有变量表示数值, 且实数变量的函数是实数类型. 其输出规范形式为: expr1+I*expr2. : I9 e; c3 H$ c0 o1 E6 W, p' V6 X
> evalc(sin(6+8*I));4 `4 ~/ \# ^2 o* o. W( ^% s

% }; V; X& l/ v; L) ?> evalc(f(exp(alpha+x*I)));
3 B+ v" [: ^7 F$ ? 8 l7 m; D6 I* N3 {
> evalc(abs(x+y*I)=cos(u(x)+I*v(y)));' `" [% P5 ~) w# i* H2 i4 {% ?- D4 ^  ^
; m+ i7 N$ y4 O$ I
4) 使用浮点算法求值& X. ^! {/ v7 `
浮点算法是数值计算的一种基本方法,在任何情况下均可以对表达式expr使用evalf命令计算精度为n的浮点数(n=Digits), 如果n缺省, 则取系统默认值, 命令格式为: evalf(expr, n);     
; N# Y+ ~( ]# ~, j! t$ D> evalf(Pi,50);   
8 ~' Z9 p: E% R
* ^2 _; s/ Q% h$ F! m6 z> evalf(sin(3+4*I));   
& u9 G4 E9 s: T  J
! ]: F* f) e% S: d) y. N> evalf(int(sin(x)/x,x=0..1),20);& G3 h& k0 ?: I! l; c$ G. A
: p6 C# K- N" B1 F- t3 C; r
5) 对惰性函数求值
. L# A2 I1 h) ^1 c; m2 p& ~把只用表达式表示而暂不求值的函数称为惰性函数, 除了第一个字母大写外, Maple中的惰性函数和活性函数的名字是相同的. 惰性函数调用的典型用法是预防对问题的符号求值, 这样可以节省对输入进行符号处理的时间, 而value函数强制对其求值. 对任意代数表达式f求值的命令格式为: value(f);   5 n1 J" B! X8 i/ w" M" U2 `1 K0 b
> F:=Int(exp(x),x);
" U2 f7 E& }; N* U" x
. Z" W6 @' M& g9 W> value(%);; O" ]. V0 Z( {

) w' _) V5 H, [' G6 e# g  M/ V> f:=Limit(sin(x)/x,x=0);
2 J; `' ?" `4 C' T  q
* r! V6 a# M& j" n# _% |> value(%);
# c% a: D4 o- p& y, g. r% j
5 f: u+ @0 H+ \/ \0 V. g% N另外, 将惰性函数的大写字母改为小写字母亦即可求值. 如下例:   
3 n/ ~6 G5 ~: \/ C7 b> Limit(sin(x)/x,x=0)=limit(sin(x)/x,x=0);6 v6 {$ @" i" X# T  M0 }  W, y
9 Z6 p' h% Z: \7 }7 \# m
4 数据结构
& e7 ?1 k  B( H: k; YMaple中有许多内建的与FORTRAN、C或Pascal不同的数据结构. 主要的数据结构有序列(sequence)、列表(list)、集合(set)、代数数( algebraic number)、未求值或惰性函数调用、表(table)、级数(series)、串(string)、索引名(index)、关系(relation)、过程体(process)以及整数(integer)、分数(fraction)、浮点数(float)、复数(complex number)等数据结构, 而矩阵(matrix)在Maple中表示为阵列, 是一种特殊的表. 0 Q4 I& U8 U- i0 o  X
4.1 数据类型查询' \* ]( s7 j1 ^/ x8 K
在Maple中, 用whattype指令来查询某个变量的数据类型或特定类型, 命令格式为:
# T  W. a5 }9 U" Kwhattype(expr)        # 查询expr的数据类型$ f$ j( A6 i1 t! g7 a9 I
type(expr, t)           # 查询expr是否为t类型, 若是则返回true, 否则返回false( h1 z5 q% z* o
> whattype(12);% Z$ s# Y4 o! D, T4 H& ~2 S
0 U( F) G* }2 P
> whattype(Pi);( \9 v: ]3 k+ N; N$ M* d7 d
- ~5 d, p9 l  ?) p2 D: H
> type(1.1,fraction);5 T3 n7 X. c+ {. l" s' p
3 g8 S) I: i/ L
> whattype(1.1);
9 V. \3 e8 j5 _. N2 s' f ; M* n0 a; f2 W8 I* R3 G
4.2 序列, 列表和集合
; K0 Z3 K5 c8 _8 D- h: Z& r4.2.1 序列
6 R% i% s% N' \( l2 {所谓序列(Sequence), 就是一组用逗号隔开的表达式列. 如:   
. l( \- H6 b! W/ q9 E> s:=1,4,9,16,25;" f" t; n" c6 y/ ^! O1 N) p

% L3 P' d. Y1 q2 m> t:=sin,com,tan,cot;# w9 P. ~, i2 ]7 [

$ Q9 }  j! }5 }9 X一个序列也可以由若干个序列复合而成, 如:   
# t3 S0 p3 I, O9 Y8 G' K: v* a> s:=1,(4,9,16),25;. J3 U5 f! q' a2 T

4 ]' ^+ Y9 J* u( y4 K> s,s;1 L  G. G* q9 M( b+ ~

; C, g7 w  |  H8 B而符号NULL表示一个空序列. 序列有很多用途, 如构成列表、集合等. 事实上, 有些函数命令也是由序列构成. 例如:   
: P; j$ ?7 ?/ w' |, W$ z$ @! X> max(s);
9 _2 U" O& _7 K' r9 j9 i# c + ^: f+ y) q. U
> min(s,0,s);
* f: F& {" `/ F- B6 q3 A$ Y* o: j 4 z5 q3 k( i! M. L( n# C
值得注意的是, op和nops函数命令不适用于序列, 如op(s)或nops(s)都是错误的, 如果要使用op(s)或nops(s)前应先把序列s置于列表中.
- W( j3 v. ?7 \% I> s:=1, 2, abc, x^2+1, `hi world`, Pi, x -> x^2, 1/2, 1;, {* j9 D0 I! G" c# j
% F% S5 O& ?4 M% t
> op(s);8 p5 h2 ]1 F2 F9 b9 _  Y
Error, wrong number (or type) of parameters in function op
2 Y/ o% D+ a" O/ S- w3 R: u3 _> nops(s);
) P/ ~7 P9 e" r% B% X: t% sError, wrong number (or type) of parameters in function nops
- ?, X/ E$ Y& S) A% Y+ N> op([s]);
6 J8 d' H( e+ x* i- L+ R/ b
1 ^) x. b- y/ \6 ]> nops([stuff]);5 U8 g: i0 j9 V2 M/ l/ k( ]4 h

' h8 y8 o, m3 H1 t. f* Y函数seq是最有用的生成序列的命令, 通常用于写出具有一定规律的序列的通项, 命令格式为:   % z2 H$ [  ~+ t8 C7 @/ e% @  v( S
seq(f(i), i=m..n);  # 生成序列f(m), f(m+1), …, f(n) (m,n为任意有理数)
6 l' `; I. V' X5 h5 p: K4 b# T4 gseq(f(i), i=expr);  # 生成一个f映射expr操作数的序列, J1 E+ E9 Z# d& K7 X0 P: i( j/ N
seq(f(op(i,expr)), i=1..nops(expr));  # 生成nops(expr)个元素组成的序列: H* f/ i) w7 D: |" L% F4 Q
> seq(i^2,i=1..10);
+ [2 f* U6 e$ O- p! U; O 1 ?) Q. I: G6 E7 \* z) o; Z
> seq(ithprime(i),i=1..20);
$ b! ?, ?) l+ j8 N* Z# ^
! n! b9 [) p- K& f9 X- x> seq(i^3,i=x+y+z);
2 @( r% W3 b" {& c
9 L% ~& X) R, |7 }9 `> seq(D(f),f=[sin,cos,tan,cot]);
8 `+ ~5 Q& T' T& O' u$ l- D. f * R5 z* p- w8 o2 i
> seq(f(op(i,x1+x2+x3+x4)),i=1..nops(x1+x2+x3+x4));
7 [2 W/ i7 o  O- w
% W. W  e; m; s7 x: }0 u获得一个序列中的特定元素选用操作符[  ], 如:     I" E! s3 J1 k8 A( a+ i& |
> seq(ithprime(i),i=1..20);$ K7 d4 o0 o! l( h

+ k4 x( d# n7 e  r; J> %[6],%[17];
% p  L- [/ J0 K9 t! L$ S
7 {2 n' @2 q' a. O8 `5 Z4.2.2 列表$ f5 z; S) k7 {  s
列表(list), 就是把对象(元素)放在一起的一种数据结构, 一般地, 用方括号[  ]表示列表. 如下例:   
; A/ G6 x, j" g& d" _> l:=[x,1,1-z,x];2 x2 ~3 i- ~4 {# o; [! W# q: M
7 M6 s" \9 x7 ]# G/ [2 r' Z7 [/ Y3 @
> whattype(%);
1 T4 [4 z$ o( s# s8 d 7 Z1 h- u* T# F5 q
空列表定义为[ ].
0 [' O! L7 c6 i7 W8 K但下述两个列表是不一样的, 因为对于列表而言, 次序是重要的:   7 Q: D: Y/ {* s' }$ q
> L:=[1,2,3,4];
, }9 S" H/ E% z- ~
1 @. J8 l3 S2 P, H: Z) W> M:=[2,3,4,1];
+ f& P/ ^3 t  V
5 q/ E+ `' c( o9 Z: J# S9 z' S4.2.3 集合) t2 J/ A% {, W$ \% r; ]
集合(set)也是把对象(元素)放在一起的数据结构, 与列表不同的是集合中不可以有相同的元素(如果有, Maple也会自动将其当作同一个元素), 另外, 集合中的元素不管次序. 一般地, 用花括号表示集合.
2 T! L, w$ z7 K8 T! ?" P> s:={x,1,1-z,x};
4 j) N2 {0 g) I; X; C1 z / c& y" c! y" w2 Y3 [9 K
> whattype(%);$ }. [5 T+ F; v1 x; f5 F
/ F% k/ B; D; H8 T+ H% T! ~% R+ P
空集定义为{ }.
6 Q$ P$ D7 B1 _0 h7 {函数nop返回列表或集合的元素数, 而op则可返回其第I个元素.
8 S+ w3 P" l, [9 c4 k> op(1,s);* W' M7 D: s6 k* u

% p" T" b' G. K$ ]6 r/ K; q2 u> s[1];2 d2 S/ R: |  W& D2 h4 t
$ G" z/ n, `' C- ]
> op(1..3,s);: S, o' }4 s3 ]+ D. }/ e- ~! d

# S: ^' [7 ^( k$ U> s[1..3];
9 S* E! Z* @7 y4 H, Q
6 N* S) U9 D5 b7 H# Q! R9 H+ ]1 S函数member可以判定元素是否属于一个列表或集合, 如果属于, 返回true, 否则返回false.
! S' k# S% u  P0 f  t% |% D+ ]> member(1+x,s);  G; ?# @* B5 G. t. t

; O; U7 |, N1 b* S" y- F) a' L可以通过下述方法在列表中增减元素:   
; _& f: }/ _: U> t:=[op(s),x];
0 e7 V/ c: V4 K2 C ' m5 Q1 p0 g; a$ d- |- u" N/ O; N
> u:=[s[1..5],s[7..nops(s)]];3 [( Z1 b3 O! h0 O+ T
9 t8 V6 A  u! x, b- K5 E
Maple中集合的基本运算有交(intersect)、并(union)、差(minus):   
& a/ o7 k9 R- R+ O- f7 K; }9 I> A:={seq(i^3,i=1..10)};B:={seq(i^2,i=1..10)};& g: ~  g9 t+ l

: T/ r8 P7 w' i( W$ B2 T
, a$ L5 {" U  G: \! }> A intersect B; # D" K* `8 a9 l" s- a
2 o0 G1 X! R3 I
> A union B; : e' I: Q4 s" d

- o/ K$ d. n& _9 i7 |, T8 ?8 o> A minus B;3 k/ x) |& a6 w; l

, H" N" J- M8 U4.3 数组和表
; j& Q2 ]0 x& k* \! q4 Z在Maple中, 数组(array)由命令array产生, 其下标变量(index)可以自由指定. 下标由1开始的一维数组称为向量(vector), 二维以上的数组称为矩阵(matrix). 数组的元素按顺序排列, 任意存取一数组的元素要比列表或序列快的多. 区分一个数据结构是数组还是列表要用“type”命令.
" |0 B- `& o( D2 G1 U+ e    表(table)在建立时使用圆括号, 变量能对一个表赋值, 但一个在存取在算子中的未赋值变量会被自动地假定是表, 表的索引可以成为任意Maple表达式. 表中元素的次序不是固定的. 3 i$ d( B8 g, d4 O/ [
> A:=array(1..4);
+ j$ ~: T' c; H& k' r % k, O( L9 C. n5 l5 K, w$ L$ V2 i
> for i from 1 to 4 do A[i]:=i: od:! @2 P! C) |! T8 K5 }
> eval(A);
- m; I9 ^& E- T8 Y) e; R8 q8 v ; ]+ S2 Q. o, z% K
> type(A,array);$ G1 C2 q2 W: B# F) p5 o. e0 @

2 V6 R9 m# Q! w; Z% b> type(A,list);
( Q3 F5 r& F: q4 Z( _) W5 }  _7 [ % @$ X' E4 A) N" G# l3 @
> T:=table();
* o/ L8 A; `/ I  z6 K% B. W 3 D: }8 l: \; {/ J
> T[1]:= 1;+ q+ h$ y2 o0 \+ z, r

  _9 ]1 M8 L/ c1 ]# _> T[5]:= 5;
9 ?8 J; T  Q+ q6 S" U: X3 i3 w9 X + x4 U  X* p: G/ k/ F$ D) f" E  _
> T[3]:= 3;
6 h6 y" R8 b9 e5 v 8 w! M5 ~) H' L* J, E0 P8 Z
> T[sam]:=sally;2 q) B" W5 p' z- Z
' w! I. Q5 s7 L7 F
> T[Pi]:=exp(1);! \8 \! V' P; s% x) ?! K( Z
; m, ]3 G/ q% p1 ~
> x:='x';
  S5 ~' f/ a5 X# ~ " }- U0 y# l, J2 X. ]' F# @$ ]; u
> T[(1+x+x^3)*sin(x)] := 0;
2 W3 }& L, h1 \ $ u6 B2 X  |/ O
> eval(T);
  R* D) B8 C! n1 n% o  a
' w8 I' C5 Y/ n9 @( t7 _> T[3]:='T[3]';
7 x8 E% [3 ?: u* j
9 u* Q- }7 S9 \/ L> eval(T);
* a: R7 b$ o7 p6 ]+ P
% v0 X( _1 v4 I1 d9 q; B) y* ]* Q4.4 其他数据结构
" B' P4 t5 r# g# H" u% _串在Maple中是很重要的, 他们主要用于取名字和显示信息. 一个Maple的串可以作为变量名, 它们中的大多数是简单的、不需要加引号的串, 但是如果变量名中包含/. 例如“diff/T”则必须把变量名用引号括起来.
3 j/ W. Q4 a/ V) O! X  z索引名是像Database[1,2,drawer]或A[3]这样的对象, 在使用索引前不需要直接建立表, 如果不得不做, Maple会自动建立表. 索引名通常被用于矩阵和向量. 为了保证Maple建立表的正确次序, 建议在赋值前直接建立.
4 x8 J: d$ Z# h* C/ u! F> x:=T[3];
# _9 |4 s; e3 R3 d( @) o 7 g: ?) X9 Q9 e4 ^* V6 y; ?
> eval(T);
, Z& P3 L* {6 ^( V8 v6 Y
- ?) g9 Z+ ~4 a' t& P$ i> T[5]:=y;4 c6 |9 U  H8 y& r0 o5 E2 K0 c

6 x3 \6 C9 x6 X! s! ~> eval(T);; F8 n) E9 t/ t+ M

8 ~& S$ J; g* J  K& N由此可见, Maple并不直接建立T的表, 直到给T[5]赋了值.     
( l( u' ^7 i3 o数值数据结构(整数、分数、有理数、浮点数、硬件浮点数和复数等)在它们的使用中是大量透明的. 浮点数是有传染性的, 这意味着如果数值结构中有一个是浮点数, 则整个结构自动转换为浮点数.
# J4 m- H% ?/ v  f% }( i( E4.5 数据类型转换和合并3 ~+ @& T5 g2 _* b7 U% [
convert是一个功能强大的类型转换函数, 它可以实现列表和数组的类型转换:   3 n$ w8 V$ |  Q
> L:=[1,2,3,4];
7 x2 s) w; S! B9 k6 t
4 @% |! i- }* L4 U8 u! s> type(L,list);) y& W: t- f& r% H4 _3 N* ~7 q7 K4 K
. B' M. q+ ^+ P  e3 E1 k) }8 }
> A:=convert(L,array);
: G2 R  g; b( J4 K; Q . k2 ~" K, T+ t  @. Q7 A8 p
> type(A,list);% H, g- b2 f5 N8 `5 A4 B' W) U6 E
2 z. b# L: U$ T8 R* M
> type(A,array);3 H1 r- x% d6 x. W6 r
& p- I# b1 p  u8 j  s9 `1 E' h
另一个有用的函数zip则可把两个列表或向量合并:   ! t6 v; b7 U2 U' i
>L:=[seq(i,i=1..10)];
, A1 S5 P% d4 J3 F/ s; @4 ^1 k
" r) h3 I2 p$ V" ^1 V; ]$ W6 y! Z> Sqr:=(x)->x^2;
. m% ~# d5 q5 J* ^! @ $ L: c. T, S; g
> M:=map(sqr,L);
$ u7 O# K  X1 h : b6 E  P' b7 Z' x  {
> LM:=zip((x,y)->[x,y],L,M);; V/ c8 o2 g. d4 K

# c" y6 U- [) L' l# M$ h& ], V> map(op,LM);4 o; M# @+ R$ T
3 e/ U) N- ]' d
5 Maple高级输入与输出操作
) g6 Z; e# J' _Maple提供了良好的接口来编辑与计算数学式. 许多时候, 我们可能需要把Maple的运算结果输出到一个文件中, 或者在一个文本编辑器里先编好一个较大的Maple程序, 再将它加载到Maple的环境里. 4 q( c, [. @0 O
5.1 写入文件, Y4 N8 |) I8 y/ i; K/ B( Q6 `/ J- O0 Q
5.1.1 将数值数据写入到一个文件
. c: X$ L2 w- k0 z如果Maple的计算结果是一长串的数值串行或数组, 而想把它写到一个文件时, 用writedata命令.
; N+ [7 c* I7 N5 z若Maple的计算结果data为集合、矩阵、列表、向量等形式时, 将其写入名为filename的文件时命令格式为: writedata("filename", data);
( G" o' w6 ]- W! N  v; R> with(linalg):5 E. h! O, \0 b1 J- `
> M:=matrix(3,3,[1,2,3,4,5,6,7,8,9]);9 |/ A4 ~  |: S$ C! z
4 n/ [' J. e4 Y9 o
> writedata("e:\\filename.txt",M);
) U( r$ i4 n& Q+ X0 I而将结果附加在一个已存在的文件后时,使用命令: writedata[APPEND]("filename", data);! q$ K; P/ o5 w; J' K" P1 X5 c
> W:=matrix(2,2,[1,2,3,4]);' v3 X. r% C' K
  M+ ?3 [( c- B, G3 k, H+ e6 t
> writedata[APPEND]("e:\\filename.txt",W);) j: q6 {6 s- F( h
需要注意的是, 这里的APPEND是必需的, 否则W结果将会覆盖M结果.6 q" Z2 W! y# L
另外, 若想将结果显示在屏幕上时, 用命令: writedata('terminal', data);$ w; i5 D& V2 k3 U8 K
> writedata[APPEND]("e:\\filename.txt",W); 5 X4 b! D% M$ p6 M
> writedata('terminal',M);
6 `  a& Y0 w1 p! N( s9 |1                   2                   3           
, b, y% J/ J8 S0 _* S$ _% h4                   5                   6           
5 P( ^1 f; h" q' W- y7                   8                   9    4 k* J6 e; k0 n, x/ P5 {' n$ Z8 i6 S
5.1.2 将Maple语句写入一个文件& j4 @' r: }+ u. n3 n6 D
如果所要写入文件的是表达式、函数的定义或者是一个完整的程序, 则使用命令save, 写入一个或多个语句的命令格式分别如下:/ g' e/ F" y! C% B) @- ]* H
save name, "filename";
2 B) g( [/ ~) Z  E! O) C& bsave name1, name2, …, "filename";1 |; m4 Q! M: W2 I& e; F
若filename的扩展名为.m, 则Maple会以内定的格式储存, 若扩展名为.txt, 则以纯文本文件储存. 以内定的格式储存的文件作纯文本编辑器无法读取, 但在大多数情况下, 它会比纯文本文件的加载速度更快, 且文件容量小.
$ Y2 g# e/ Y* r/ }# ?& q> myfunc:=(k,n)->sum(x^k/k!,x=1..n);6 y5 n6 s: x6 z* X( e( ~- p! J- S

! F0 Q0 X0 O5 A/ E; q) }# R, j1 J> myresult:=myfunc(6,8);
$ g( t8 p# W& ]& L. b6 P
. o+ V  E1 v1 [0 v, g> save myfunc,myresult,"e:\\test.m";
4 F6 H4 ^  U0 r5 K调用已存m文件用命令read. 试看下述实验:
" s' ]' r! P3 O" f2 N( R> restart:
  ~; ~: I  Q( q% ^0 L8 U+ V> myfunc(6,8);
" i2 A* U8 v3 y/ @0 g5 ]2 x7 `! Q $ b. Y- z+ ~3 X
> read "e:\\test.m";( C$ m) U* z2 X* D/ w" {  Q6 p
> myfunc(6,8);' E3 q3 M% u. ~" K  A) C
& ?* A' ?3 [9 X$ A$ K) r& E4 T* \" _
> myresult;4 a' P/ H$ L6 u$ J
- h/ V* `/ X' q
    而存为txt文件时则将整个语句存为一个文件:0 ^, l6 h& j% ]/ M0 D* H7 I
> save myfunc,myresult,"e:\\test.txt";) S6 v& r+ B0 L1 A! h6 Y/ e
> restart: read"e:\\test.txt";
" b' _, S/ |) { # V7 [4 B/ K( W
5 g* V" ?" c0 U2 \' d
5.2 读取文件
, n% o. f0 j$ D( _! e) d在Maple里最常用的两个读取文件的命令, 一个是读取数值数据, 另一个是是读取Maple的指令.) j; R" v  v- W( I+ `$ O, n
5.2.1 读取数值数据
& x9 \1 F; e" |; X+ t6 o如果想把大量的数据导入Maple里进行进一步的运算或者要运用大量的实验数据在Maple环境绘图时, 可以用readdata( )命令完成.$ |  ^- X! Y* H, d# ]
从filename文件里读取n行数据时使用命令: readdata("filename",n);! ?( q9 J) w8 m# H2 b) V" s# \
以指定的格式读取数据时使用命令: readdata("filename",[tyep1,type2,…]);
4 b1 c/ y6 z! a) D2 C# ^3 c> readdata("e:\\filename.txt",3);
$ f' d% K6 C8 M' y5 Q" a5 U0 s& Q * O' r; O: I  \1 T7 d4 L9 C
    读取filename的前三列, 第一列为整数形式, 第二、三列为浮点数形式:
# R8 A( F' R9 W# k% h% s$ w8 k# j% q3 h> readdata("e:\\filename.txt",[integer,float,float]);3 H  H4 Z0 N. |! y" X4 v3 X. U  j

, Z. q9 G+ \, {2 A0 c# s. Q下面再看一个运用大量的实验数据在Maple环境绘图的实验:
/ }* J/ d5 X" k2 S! J> mypts:=[seq([x/1000,cos(x^2/100000)],x=1..1000)]:* [% [5 S" g1 {2 C
> writedata("e:\\data.txt",evalf(mypts));4 Z7 }. m' B- }' v+ }
> dots:=readdata("e:\\data.txt",100):+ y% `* E" J* u$ T
> nops(dots);
9 b+ n7 K0 ^# Z* n- b6 y- a
" L0 c! J/ Q" I& h3 I> dots[1..4];8 \( p* ^) b* |- n7 A/ |7 T$ O

" i& a* G, q3 a> plot(dots,style=line);
4 g3 F" ?7 r% { . u. r$ Z7 ?. Q9 g, m8 x! \
5.2.2 读取Maple的指令
5 E6 w; w& M3 K/ ?) V+ y; }4 t在编写程序时, 在普通软件中先编好程序再将其读入Maple环境中常常比直接在Maple中编写更为方便. 如果要将程序代码或Maple指令加载用read命令:
- G/ F1 Q0 M8 q+ t% I% b$ n' gread "filename";2 H* Y4 ~2 I( U, r# A. ]
如下例:3 `. z# u1 z. p( H
> reatart:
& ~2 _% T3 T) U2 r, G  x0 T> myfunc:=(a::list)->add(i,i=a);  `7 b6 l5 Q0 h# o4 I

8 Q' j! Y  g( }3 u& `' f% L/ n> avg:=(a::list)->myfunc(a)/nops(a);+ @/ m# ]5 Q1 {/ C- ~1 Y

9 ]- Q, }. ^: [9 a' k. X> save myfunc,avg,"e:\\function.m";
, M' `* c( A% b; p6 `& `# y> restart:6 s) c3 K( K. u0 l$ {
> read "e:\\function.m";* H! r# Y3 n, \8 `9 E  I0 h& z
> myfunc([1,2,3,4,5,6,7,8,9]);
, a6 f! Q( j. {+ j% i6 l
% x5 l( _6 `3 G: M- w> avg([1,2,3,4,5,6,7,8,9]);: ^+ P0 h) Y/ ?4 V# T) t
* w- r9 I, ~" k0 R- |  O
5.3 与其它程序语言的连接/ a7 K4 S8 L  Z. z4 S4 c- ~; Y
5.3.1 转换成FORTRAN或C语言# P% d4 s/ [8 s/ X, `6 K# y
调用codegen程序包中的fortran命令可以把Maple的结果转换成FORTRAN语言:
# I8 ^6 L+ n3 V9 W( j. W> with(codegen,fortran):0 ~! [7 i: @0 X
f:= 1-2*x+3*x^2-2*x^3+x^4;
' ~% V7 G  m% E" `. x, R, H , j0 `+ t8 S$ ]  C
> fortran(%);" i! e/ L" {9 R1 a
      t0 = 1-2*x+3*x**2-2*x**3+x**4
, j) }5 V* {4 `, a& r > fortran(f,optimized);
, U5 H- m" \$ i      t2 = x**2
0 B% ^, i7 R& F% x      t6 = t2**2
4 a# S7 i, }2 {# G4 L' |' ~      t7 = 1-2*x+3*t2-2*t2*x+t65 R6 \( j. e* T' j0 G7 M2 g
> fortran(convert(f,horner,x));1 @7 D# w- s$ D0 A/ |9 t. v0 U
      t0 = 1+(-2+(3+(-2+x)*x)*x)*x
) _7 P  N. k% u" l7 X+ o而codegen程序包中的C命令可以把Maple结果转换成C语言格式:, b( X5 L6 r* k: p
> with(codegen,C):
0 M, e, [8 o$ g6 i' j% b; q4 \( Q  xf:=1-x/2+3*x^2-x^3+x^4;  ~( X: ?) e5 g; k: `! f! ?
1 T' x8 p( a7 e7 V* a* R! X2 ]
> C(f);
2 N7 `6 ^$ t' l+ L4 I7 N9 Q( ]+ B3 F      t0 = 1.0-x/2.0+3.0*x*x-x*x*x+x*x*x*x;% [. z. |4 @( P1 q; `: q
> C(f,optimized);+ z; T' W4 G; T6 d( `; }% |9 n
      t2 = x*x;# ]8 o  J6 Z0 x
      t5 = t2*t2;; A: ^; w# c5 n" b
      t6 = 1.0-x/2.0+3.0*t2-t2*x+t5;
8 ~! q+ v3 `5 D+ Y: M, f1 Roptimized命令表示要对转换的表达式进行优化, 如果不加此可选参数, 则直接对表达式进行一一对应的转换.
6 A/ E2 n5 ~% Q: G5 L  c! h5.3.2 生成LATEX$ M) Q- w% w* U# S' v
Maple可以把它的表达式转换成LATEX, 使用latex命令即可:
% b4 y. c5 l1 t+ [* Z> latex(x^2+y^2=z^2);
' \3 B7 P% L! g9 t9 k2 K{x}^{2}+{y}^{2}={z}^{2}  a7 U% ~3 r' g8 s  G& R# {+ N( d; v
    还可以将转换结果存为一个文件(LatexFile):
6 `( [( r, v2 _4 Y' p6 {2 o% {: v> latex(x^2 + y^2 = z^2, LatexFile);
2 u  u0 L7 `3 }+ H5 {% L7 N8 ]    再如下例:9 _. F7 e2 e# F
> latex(Int(1/(x^2+1),x)=int(1/(x^2+1),x));
# V) P0 p: ]- o\int \! \left( {x}^{2}+1 \right) ^{-1}{dx}=\arctan\left( x \right)2 \7 Q( a7 C, p3 x: a& z7 X

' |+ ^0 T- u3 ^3 w4 B* m/ @# B, A5 A8 a
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年!2 w) u% j7 ~6 z  ^9 E8 Y( }

    # q0 ~5 y9 K9 ^- H+ X
    3 h. c* q% `* B; H; k  v9 K
    回复

    使用道具 举报

    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-8-6 09:35 , Processed in 0.615768 second(s), 101 queries .

    回顶部