QQ登录

只需要一步,快速开始

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

maple基础

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

1

主题

5

听众

4

积分

升级  80%

该用户从未签到

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

2 i( H: ]  |6 x2 {% T6 _$ W8 D第一章  Maple基础
1 Q" C& ~+ b) p$ i; Y9 J- ^# O! c1 A3 [% o2 N4 m/ X
1 初识计算机代数系统Maple7 s5 `& ~2 b* ~
1.1 Maple简说- Q2 {# p7 Z4 {7 L4 D
1980年9月, 加拿大Waterloo大学的符号计算机研究小组成立, 开始了符号计算在计算机上实现的研究项目, 数学软件Maple是这个项目的产品. 目前, 这仍是一个正在研究的项目.
/ Y2 Z2 h! {) ^2 m8 T  F5 m- uMaple的第一个商业版本是1985年出版的. 随后几经更新, 到1992年, Windows系统下的Maple 2面世后, Maple被广泛地使用, 得到越来越多的用户. 特别是1994年, Maple 3出版后, 兴起了Maple热. 1996年初, Maple 4问世, 1998年初, Maple 5正式发行. 目前广泛流行的是Maple 7以及2002年5月面市的Maple 8. ' q9 \7 k8 ^3 D9 R5 f* d
Maple是一个具有强大符号运算能力、数值计算能力、图形处理能力的交互式计算机代数系统(Computer Algebra System). 它可以借助键盘和显示器代替原来的笔和纸进行各种科学计算、数学推理、猜想的证明以及智能化文字处理.
# D: a$ M( ?/ `6 D- UMaple这个超强数学工具不仅适合数学家、物理学家、工程师, 还适合化学家、生物学家和社会学家, 总之, 它适合于所有需要科学计算的人.
# g- {8 s9 S) U1.2 Maple结构
; K8 b0 \) r. N3 j6 EMaple软件主要由三个部分组成: 用户界面(Iris)、代数运算器(Kernel)、外部函数库(External library). 用户界面和代数运算器是用C语言写成的, 只占整个软件的一小部分, 当系统启动时, 即被装入, 主要负责输入命令和算式的初步处理、显示结果、函数图象的显示等. 代数运算器负责输入的编译、基本的代数运算(如有理数运算、初等代数运算等)以及内存的管理. Maple的大部分数学函数和过程是用Maple自身的语言写成的, 存于外部函数库中. 当一个函数被调用时, 在多数情况下, Maple会自动将该函数的过程调入内存, 一些不常用的函数才需要用户自己调入, 如线性代数包、统计包等, 这使得Maple在资源的利用上具有很大的优势, 只有最有用的东西才留驻内存, 这保证了Maple可以在较小内存的计算机上正常运行. 用户可以查看Maple的非内存函数的源程序, 也可以将自己编的函数、过程加到Maple的程序库中, 或建立自己的函数库.
: ^. |: N1 ^+ F9 I1.3 Maple输入输出方式, ^* D/ Q8 S; T; J5 F
为了满足不同用户的需要, Maple可以更换输入输出格式: 从菜单“Options | Input Display和Out Display下可以选择所需的输入输出格式.
% ^, B2 z) b& K  `( rMaple 7有2种输入方式: Maple语言(Maple Notation)和标准数学记法(Standard Math Notation). Maple语言是一种结构良好、方便实用的内建高级语言, 它的语法和Pascal或C有一定程度的相似, 但有很大差别. 它支持多种数据操作命令, 如函数、序列、集合、列表、数组、表, 还包含许多数据操作命令, 如类型检验、选择、组合等. 标准数学记法就是我们常用的数学语言.
: J( _7 ?0 r- |: y- C启动Maple, 会出现新建文档中的“[>”提示符, 这是Maple中可执行块的标志, 在“>”后即可输入命令, 结束用“;”(显示输出结果)或者“:”(不显示输出结果). 但是, 值得注意的是, 并不是说Maple的每一行只能执行一句命令, 而是在一个完整的可执行块中健入回车之后, Maple会执行当前执行块中所有命令(可以是若干条命令或者是一段程序). 如果要输入的命令很长, 不能在一行输完, 可以换行输入, 此时换行命令用“shift+Enter”组合键, 而在最后一行加入结束标志“;”或“:”, 也可在非末行尾加符号“\”完成.
8 S& c) T( a0 F; u( @Maple 7有4种输出方式: Maple语言、格式化文本(Character Notation)、固定格式记法(Typeset Notation)、标准数学记法(Standard Math Notation). 通常采用标准数学记法. ' o" X% o' ?( [2 V" J
Maple会认识一些输入的变量名称, 如希腊字母等. 为了使用方便, 现将希腊字母表罗列如下,输入时只需录入相应的英文,要输入大写希腊字母, 只需把英文首字母大写:   
5 `' _  |6 f, {4 U4 h2 S% i) R 7 ?. V0 T: n5 v4 u' K! w& |+ a& ?
" d& [# l1 o! @+ j; Q' u
/ u' O6 ~. x( e! u6 c' P9 D& a- d

0 C, {# q6 s3 Q& y3 ` : y( l/ x, m- z7 A( I& K
' D. ^; \; t9 ]% J) ]" F% V# {

- p8 v  b  w: N2 K ! H( G# q# |/ E( S6 g! U5 r2 g
/ ~% N- {- J. ?9 t# ?! _  {4 O

- k. x" A* T; M7 `5 ?2 M) b 0 a3 o0 E" B" u" _
2 x  D! h0 s% d  s/ U

0 W- J( J  T2 i6 I9 W, }alpha        beta        gamma        delta        epsilon        zeta        eta        theta        iota        kappa        lambda        mu
3 m- X9 q' t4 h7 L) I  u  L 5 O) X4 Q( U4 f0 o

9 K2 {/ \( ?% o/ D! n8 d$ B( a
: u! V1 @* w8 F& n3 @. a; k : t) X  t, P. _& j
  X2 Q, d3 |/ n% h+ E5 ?( W" Z
4 v" q1 d$ z: x; X9 z" P7 x

! g& y1 A+ `4 n6 @/ H4 f, t
0 P' ^; g7 K/ E( R
9 \' k- f* @+ `, ]: A  j
& }7 a- d$ R% F8 v! t3 W' ~ % ^/ x. K8 [: _: z+ z4 z' I
  l8 l2 b  \+ k! T+ D
" r# Q3 d6 j$ B6 R$ Z4 @' n
nu        xi        omicron        pi        rho        sigma        tau        upsilon        phi        chi        psi        omega
5 b) r8 p5 m8 O- f, [# v9 Z6 ?有时候为了美观或特殊需要,可以采用Maple中的函数或程序设计方式控制其输出方式,如下例:/ q2 y+ O$ f$ f
> for i to 10 do
7 [" g7 _  ~# x# M+ cprintf("i=%+2d and i^(1/2)=%+6.3f", i, eval(sqrt(i)));
* v2 \! ~  A+ Iod;, \+ }# q0 U6 j( j$ {2 {8 D
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
, x) |1 M! q1 _+2d的含义是带符号的十进位整数,域宽为2. 显然,这种输出方式不是我们想要的,为了得到更美观的输出效果,在语句中加入换行控制符“\n”即可:  q( i* c6 h- Q3 ^: T
> for i to 10 do ( ]2 K, D( f9 x5 Q9 x+ R
printf("i=%+2d and i^(1/2)=%+6.3f\n", i, eval(sqrt(i)));3 w' q  l) v: ]) w4 r# C7 O
od;
+ B, v- _; a+ x* q/ P9 Yi=+1 and i^(1/2)=+1.000
6 k3 [/ W( s  `! N: `5 Z. ni=+2 and i^(1/2)=+1.414) E& z9 Z" e) {
i=+3 and i^(1/2)=+1.732" T, k' E% V" K. ~6 [
i=+4 and i^(1/2)=+2.000
1 J2 M7 f  M2 ^: Li=+5 and i^(1/2)=+2.2368 c' ^4 }/ _( {+ s3 |% C
i=+6 and i^(1/2)=+2.449# ?# X/ u1 J% l8 r# H
i=+7 and i^(1/2)=+2.646
# L& o6 f3 s1 R* w7 D  ^* [/ hi=+8 and i^(1/2)=+2.828
# C7 j* n3 C, _) Q0 Q( g* ^! V. Ai=+9 and i^(1/2)=+3.000. O6 P  W0 k4 }0 b8 O) Q, M
i=+10 and i^(1/2)=+3.1625 _; T. G2 _* W4 e" y4 q# S
再看下例:将输入的两个数字用特殊形式打印:7 \0 q0 \0 S9 b3 \9 A) i& P* }3 w
> niceP:=proc(x,y)/ d  A. j6 f0 j4 C
printf("value of x=%6.4f, value of y=%6.4f",x,y);
) {) F$ |5 E9 E8 v5 Lend proc;) X% a$ w& m/ C: j- m

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

) H5 n& m% m# R/ t% U> 123456789/987654321;' {- [8 g) n  d' G- m

" A5 y- R7 {- p6 ~) l) u> evalf(%);  a) |. H! g* x2 F6 U

2 r! C" t/ P$ [( z4 Y> 10!; 100*100+1000+10+1; (100+100)*100-9;
  i: y/ J* a9 B- a- j5 o
% r' H+ q# b! k6 s( M/ H
. M# }! F6 T" }" n) | 8 h8 w2 }# D; ]0 g$ g/ h( \8 w
> big_number:=3^(3^3);( z' P: b3 M) b* v: @8 n# ~

/ Y( X0 v7 J* s' q# P6 l% M> length(%);
5 R4 U2 I7 M5 t; b" ]% E) n3 c ( ?1 T+ T) q2 u  ^7 }2 }
上述实验中使用了一个变量“big_number”并用“:=”对其赋值, 与Pascal语言一样为一个变量赋值用的是“:=”. 而另一个函数“length”作用在整数上时是整数的十进制位数即数字的长度. “%”是一个非常有用的简写形式, 表示最后一次执行结果, 在本例中是上一行输出结果. 再看下面数值计算例子:   
3 h9 ]; B- j( ], e' B% Y5 R    1)整数的余(irem)/商(iquo)
- Z, p7 t; N2 b5 z6 ~2 O命令格式:   4 B/ n5 g' f' A2 I; u; O6 v+ S
irem(m,n);        #求m除以n的余数
1 S% [) I$ y* o) i% Y; Zirem(m,n,'q');    #求m除以n的余数, 并将商赋给q/ d8 u0 g" b* ?1 ?- `
iquo(m,n);        #求m除以n的商数
- k( A3 P  m3 X9 |& uiquo(m,n,'r');    #求m除以n的商数, 并将余数赋给r8 G0 Q% M/ A0 z1 i
其中, m, n是整数或整数函数, 也可以是代数值, 此时, irem保留为未求值. 0 |  O4 \9 x- ]  Y* t. G
> irem(2002,101,'q'); # 求2002除以101的余数, 将商赋给q; c* ~& P5 A+ N2 ^% R% s, b
" O; l4 e+ r; o3 S+ N/ j/ L  l8 R
> q; #显示q7 s3 q4 z  F4 c( w( }! C
) S) I' Y5 o3 t; f
> iquo(2002,101,'r'); # 求2002除以101的商, 将余数赋给r
, D6 K+ K" U0 H1 L
: e8 @% g0 g. f) a0 O: z' ~4 d> r; #显示r
/ w  X4 w0 }  p5 H
5 |5 q6 R) ~3 S0 y) D- g> irem(x,3);1 Y0 m! D2 b0 B

+ Q/ p. P6 s# W( K0 V" E+ y# C2)素数判别(isprime)
; i2 K5 c7 w3 ?; n素数判别一直是初等数论的一个难点, 也是整数分解问题的基础. Maple提供的isprime命令可以判定一个整数n是否为素数. 命令格式: isprime(n); ' o# P8 B/ ]' j' F6 C& T6 n9 P
    如果判定n可分解, 则返回false, 如果返回true, 则n“很可能”是素数. 0 ~0 E3 p$ r- O. Q0 a
> isprime(2^(2^4)+1);
1 T+ Z! s* V0 u( h' g  U/ g ! m0 D! E7 c2 W  g. o
> isprime(2^(2^5)+1);9 k$ E4 T  g4 u$ C% D' E
& [, m+ P& _% L. u1 h. h
上述两个例子是一个有趣的数论难题。形如 的数称为Fermat数, 其中的素数称为Fermat素数, 显然, F0=3、F1=5、F2=17、F3=257、F4=65537都是素数. Fermat曾经猜想所有的Fn都是素数, 但是Euler在1732年证明了F5=641•6700417不是素数. 目前, 这仍是一个未解决的问题, 人们不知道还有没有Fermat素数, 更不知道这样的素数是否有无穷多.
, U& V; }% Q' B4 f2 Y4 G3) 确定第i个素数(ithprime)
% W. S2 }' l" ?8 b) d9 s- E; @0 c9 z若记第1个素数为2,判断第i个素数的命令格式: ithprime(i);    : E# W$ O. x9 x7 [
> ithprime(2002);
9 b1 U6 q- }& w* t& F) F ) ]; T. u- W0 L# N& d
> ithprime(10000);
2 K4 `7 ]2 ]* C
+ L7 M* R+ E( P% a6 [4) 确定下一个较大(nextprime)/较小(prevprime)素数2 f( n$ M9 }9 g. W4 e% Y% F
当n为整数时,判断比n稍大或稍小的素数的命令格式为:   
: c* |# u7 x* i% z8 R2 ?+ O; gnextprime(n);  2 m# M( ^  E* B& @
prevprime(n); ( c3 n! m9 X' H8 D. e: P6 V- A
> nextprime(2002);
& v" @" u; d# q! q
' N# N. @  v1 S6 N* `) e3 H> prevprime(2002);1 p3 k: s$ P+ O4 o9 G% s

; Z1 [: {- w( s5) 一组数的最大值(max)/最小值(min)
5 t( n+ }2 b7 A" s命令格式: max(x1,x2,…,xn);   #求x1,x2,…,xn中的最大值, Y8 P0 e4 v+ d( S5 ~1 r
             min(x1,x2,…,xn);   #求x1,x2,…,xn中的最小值
; z4 {. ?1 U4 P2 C> max(1/5,ln(3),9/17,-infinity);/ `: a; F# V2 @' y# q! {1 G

9 G" p, ^" n" k0 D( C> min(x+1,x+2,y);
' ~" r! V6 I+ a, |4 f / h( s+ s6 {! |
6)模运算(mod/modp/mods)
& r, L7 @! `: G% ^) S  N4 ?+ o. v命令格式:  e mod m;    # 表达式e对m的整数的模运算
/ v! T: k+ E: l, y( L- Cmodp(e,m);  # e对正数m的模运算, A# f1 j' U4 k
mods(e,m);  # e对m负对称数(即 -m)的模运算
+ z8 F; k" b. q" J- ~+ t`mod`(e,m);  # 表达式e对m的整数的模运算, 与e mod m等价
% c2 x! g$ c3 c! Y9 q5 p. L. i值得注意的是, 要计算i^n mod m(其中i是一整数), 使用这种“明显的”语法是不必要的, 因为在计算模m之前, 指数要先在整数(可能导致一个非常大的整数)上计算. 更适合的是使用惰性运算符“&^”即: i &^n mod m, 此时, 指数运算将由mod运算符智能地处理. 另一方面, mod运算符的左面优先比其他运算符低, 而右面优先高于+和-, 但低于*和/.
; _5 z# c' w& ~> 2002 mod 101;9 G' T/ i4 B5 A0 g6 S: s  ?4 ]# J2 H

9 R, [6 `, ?. k- ?4 [> modp(2002,101);( X9 v, z8 x. I2 L! I+ E! B

, n& `. A: j" b, P, C( k> mods(49,100);
" k3 \& d  {/ e, ?/ o4 a 3 _* s6 }2 w5 V% S, G
> mods(51,100);# O- R8 q0 `" N, M1 A6 E( M3 f, ?

5 y) a. C# x1 X" ]> 2^101 mod 2002;  # 同 2 &^101 mod 2002;) @, P4 s8 ~! l% {" |
- X9 x! g. l, L/ p
7)随机数生成器(rand)' \& {- f- l) ?7 g
命令格式:   
- [' z/ ?7 [1 u  e+ s4 g6 H8 X' Nrand( );    #随机返回一个12位数字的非负整数$ y+ V* i; A- C+ J; z
rand(a..b);  #调用rand(a..b)返回一个程序, 它在调用时生成一个在范围[a, b]内的随机数9 u$ W7 L$ y+ R- i) P
> rand();
! G1 }8 f, `) J, N' _4 w% E : q9 U  Q( ~9 x8 ~0 z2 |/ i" I
> myproc:=rand(1..2002):
+ w( q$ x. }1 d/ {> myproc();  r: R# k+ e0 W' [$ _; s

2 w( s# _3 X' N0 ~( s5 m/ Z> myproc();* P; q5 a( J' e9 l/ q4 W  N
( e: |& I. k$ Y8 a0 N
    注意, rand(n)是rand(0..n-1)的简写形式.1 Y1 s. U! t6 {
2.1.2 复数运算0 c; V' @4 t% D; l/ U
复数是Maple中的基本数据类型. 虚数单位i在Maple中用I表示. 在运算中, 数值类型转化成复数类型是自动的, 所有的算术运算符对复数类型均适用. 另外还可以用Re( )、Im( )、conjugate( )和argument( )等函数分别计算实数的实部、虚部、共轭复数和幅角主值等运算. 试作如下实验:   
5 a0 Y$ h5 D+ G. c# E  Z" p> complex_number:=(1+2*I)*(3+4*I);
1 X" w/ m) h. d: t / j# |( Z* m/ c4 O% a+ m8 Y
> Re(%);Im(%%);conjugate(%%%);argument(complex_number);, O. [0 ^+ C9 {' o) R" C

6 t# S; ^" E, E7 [2 i 7 Y+ R  ^2 D$ T5 _$ T8 v/ b
8 m) g6 `; P' x2 w) [! b1 q+ O0 X8 ]0 z
, f4 R2 \- d! A0 @7 b. V" s! u
值得注意的是上行命令中均以“;”结束, 因此不能将命令中的2个%或3个%(最多只能用3个%)改为1个%, 因为%表示上一次输出结果, 若上行命令改为“,”结束, 则均可用1个%.
5 v: }$ E/ F: q为了在符号表达式中进行复数运算, 可以用函数evalc( ), 函数evalc把表达式中所有的符号变量都当成实数, 也就是认为所有的复变量都写成 的形式, 其中a、b都是实变量. 另外还有一些实用命令, 分述如下:   # y! R: g$ W  x9 u
1) 绝对值函数6 b' H; _. r2 H/ N2 Z+ R
命令格式: abs(expr);  
! D/ V2 d& a8 H: \, i& s" S, p3 J+ J当expr为实数时,返回其绝对值,当expr为复数时,返回复数的模.6 ?0 O0 e9 k" n9 i3 d& d& }' b
> abs(-2002);    #常数的绝对值
# E* w5 Z+ J+ h% i ) u+ T* i( u% y
> abs(1+2*I);   #复数的模% {4 s4 M, u3 h  P4 L

* {$ ?: P- X+ S1 d+ W> abs(sqrt(3)*I*u^2*v);  #复数表达式的绝对值
0 K" T' e, X2 ^ / L8 ~2 h5 X/ Y- ]$ `: u1 i& p! Y
> abs(2*x-5);   #函数表达式的绝对值$ M4 |" h% n6 j+ {$ D
9 _  Z4 ~% S5 S) Z
2)复数的幅角函数
7 Y" }. S- q7 i& [( M) j( u7 o8 ^命令格式:   argument(x);  #返回复数x的幅角的主值
3 Z/ U4 e8 r  H; |4 w" v> argument(6+11*I);  }9 R$ `: Y3 V: z

8 c8 w! ]; w- x" I> argument(exp(4*Pi/3*I));
0 U" t) k! Y- ~( {: W 3 k7 b+ {$ t3 r! K! ?! q
3)共轭复数
' |- M  C4 R5 y0 Q命令格式:   conjugate(x);  #返回x的共轭复数7 p; G& _' ?7 r/ H; N/ Q0 H3 x
> conjugate(6+8*I);+ n! k2 E" H  [
! q' r! b. Y- z) V% S
> conjugate(exp(4*Pi/3*I));
9 q. i; G) D/ C& g. q: r 7 P/ O# @, l8 Y9 I
2.1.3 数的进制转换$ T7 F3 U1 @( E
数的进制是数值运算中的一个重要问题. 而在Maple中数的进制转换非常容易, 使用convert命令即可.
, q5 u. {4 |. I命令格式:   convert(expr, form, arg3, ...);   
: `! g4 R) A( w其中, expr为任意表达式, form为一名称, arg3, ... 可选项. ; x3 k4 n3 Q  X6 z4 V& Y/ G
下面对其中常用数的转换予以概述. 而convert的其它功能将在后叙章节详述. 1 M/ }$ F5 e4 N  I' C! J' V
    1)基数之间的转换4 ?5 ^( A& O$ Y
命令格式:   
( X6 z2 _/ Q9 D3 d( T! |2 ?" Mconvert(n, base, beta);      #将基数为10的数n转换为基数为beta的数. B& o( I8 |( }
    convert(n, base, alpha, beta);#将基数为alpha的数字n转换为基数为beta的数
3 E( D, p7 u% w> convert(2003,base,7); #将10进制数2002转换为7进制数, 结果为: (5561)71 j" [/ b9 s+ N' f# B1 u

' s4 P. K/ D9 Z  A( V3 n> convert([1,6,5,5],base,7,10); #将7进制数5561转换为10进制数. Q% u/ Y+ N5 k7 f* T3 R

/ b" \% t& v; `0 B7 m  L& v' R> convert(2002,base,60);       #将十进制数2002转换为60进制数, 得33(分钟)22(秒)$ p7 K" k# i; N( ]4 f
; o1 A' m# m4 f  D  r  C- W
    2)转换为二进制形式  Q$ z2 V1 a- b4 t, l- \
命令格式: convert(n, binary);
: l: w$ p+ ]  Q其功能是将十进制数n转换为2进制数. 值得注意的是, 数可以是正的, 也可以是负的, 或者是整数, 或者是浮点数, 是浮点数时情况较为复杂. 5 n0 H( {% y( _! t) B7 E
> convert(2002,binary);   
+ d2 i1 h* F, a3 A/ o+ E. C- o 5 j; o4 l; f2 H4 F
> convert(-1999,binary); ( f- e( k6 S$ Y  A# z
  Q1 _! T, z2 {. j' N& O* C
> convert(1999.7,binary);
! n: O: S1 H# b7 }" V$ F
2 a$ B* u  ]3 I% z3)转换为十进制形式/ E" l2 Y3 D- Q' C8 [
其它数值转换为十进制的命令格式为:   $ k( i! H- d8 l, q: Z
convert(n, decimal, binary);   #将一个2进制数n转换为10进制数3 ?. b; j+ v5 V% `
    convert(n, decimal, octal);    #将一个8进制数n转换为10进制数
! w5 ]+ \3 `$ G# ]2 v    convert(string, decimal, hex);  #将一个16进制字符串string转换为10进制数7 X7 H. K: [9 A+ u# ?
> convert(11111010010, decimal, binary);   
: `( F5 o2 x: ?& h, F
: q) g3 b; [9 t2 `0 i% s9 C> convert(-1234, decimal, octal);           . Q3 v3 }/ F% c! U% `3 C
% `9 w5 m* k- `* k* E$ Q
> convert("2A.C", decimal, hex);         
. D3 T" E) l! g
) m) m. V; G/ ]! B2 e4) 转换为16进制数/ C% a4 \: X1 ^$ ~, b
将自然数n转换为16进制数的命令格式为: convert(n, hex);   4 o& {" @! J1 @0 c* [: `- Z- ^) m
> convert(2002,hex);  convert(1999,hex);3 C6 o/ V5 }9 c' X4 f" L) a, F

( s. s' ~& G1 P * @+ _8 @* t% X3 N) e
5)转换为浮点数
# k6 P7 P" p! {2 B: z; t" j命令格式: convert(expr, float);
% c$ D. n' G( `+ r( R0 `注意, convert/float命令将任意表达式转换为精度为全局变量Digits的浮点数, 且仅是对evalf的调用. 7 Y3 Q' C  i  D
> convert(1999/2002,float);
9 H% d# a) G! C6 A' o: R * k( Z, E4 ?8 }% v5 k
> convert(Pi,float);1 v2 l6 S3 ?0 j/ F" O4 t# X! M

% D4 ]7 l7 N# ?& J4 M* {+ g2.2 初等数学3 B. u- V* Q% R% X5 J
    初等数学是数学的基础之一, 也是数学中最有魅力的一部分内容. 通过下面的内容我们可以领略Maple对初等数学的驾驭能力, 也可以通过这些实验对Maple产生一些感性认识.
" c0 Z( M0 s" P$ ~2.2.1 常用函数+ j/ r) E" `0 i
作为一个数学工具, 基本的数学函数是必不可少的, Maple中的数学函数很多, 现例举一二如下:   
0 d% P7 m2 b0 W# S/ D指数函数: exp" m/ T2 q3 u9 N0 k
一般对数: log[a]
1 \! Q. Y) }1 D+ X自然函数: ln4 F5 [# s) ~0 [3 y, l
常用对数: log10
' [9 g9 F1 P9 K; f6 z* C# f平方根: sqrt& g" q8 w2 D- ]& z$ }1 G$ L' |% {
绝对值: abs$ |* ~/ Q) C$ z2 Q, \! |
三角函数: sin、cos、tan、sec、csc、cot
# b/ _3 @# c1 o  b7 R2 S反三角函数: arcsin、arccos、arctan、arcsec、arccsc、arccot! x$ i& Y6 c$ y. Q, T% D: P
双曲函数: sinh、cosh、tanh、sech、csch、coth
( h- Q' z# j. u/ F% Y反双曲函数: arcsinh、arccosh、arctanh、arcsech、arccsch、arccoth
" S, v$ o' y5 l' F0 [贝赛尔函数: BesselI、BesselJ、BesselK、BesselY
1 Q# s  U9 Q+ \# y4 P- {Gamma函数: GAMMA+ i& J' A5 }, {# |; \$ u) s
误差函数: erf* ~% `, k/ h& C/ w
函数是数学研究与应用的基础之一, 现通过一些实验说明Maple中的函数的用法及功能. 7 g  x4 x/ b$ r# z' p' f
1) 确定乘积和不确定乘积# w/ [" L9 ]1 \9 H6 c
命令格式: product(f,k);  6 C3 C3 d/ {& B. R
product(f,k=m..n);  
, \) K7 @' y& c  tproduct(f,k=alpha); 3 x% D3 s, z2 b3 G' A$ T) J
product(f,k=expr);1 D' |# ~# d4 d
其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—包含k的任意表达式. ( g: w5 a) @4 i0 r  o
> product(k^2,k=1..10);   #计算 关于1..10的连乘
! U" V7 _: M2 y5 e5 n# s5 ?
: X; E* O# N8 S" B5 e5 i, o, C> product(k^2,k);         #计算 的不确定乘积
. C/ u' N! ~/ |+ W% {4 n
) ]: i% m( h6 q" C8 Z# c: B> product(a[k],k=0..5);    #计算ai(i=0..5)的连乘
3 a1 L$ G3 Q3 F
& Y+ f" }, ^! J% V; \5 z> product(a[k],k=0..n);    #计算ai(i=0..n)的连乘9 Y+ V7 w( {) _1 |9 d+ v$ p. P

& U3 h$ ^  J) q4 u4 E8 h> Product(n+k,k=0..m)=product(n+k,k=0..m);   #计算(n+k)的连乘, 并写出其惰性表达式
9 G3 R% T4 B! v0 h
8 E0 W& {$ t+ \, [> product(k,k=RootOf(x^3-2));     #计算 的三个根的乘积  t, k5 f0 E! Z* k$ M) G

+ V6 Y' t& h4 g    product命令计算符号乘积, 常常用来计算一个公式的确实或不确实的乘积. 如果这个公式不能求值计算, Maple返回 函数. 典型的例子是:   
% ^) s* {: a9 T4 c5 Q3 K7 Z> product(x+k,k=0..n-1);# ?- y9 p& k  a8 ~
4 ?1 _  i) B' {: V% h
如果求一个有限序列值的乘积而不是计算一个公式, 则用mul命令. 如:   
) a4 F1 T' Q& ^9 e' F; n% W> mul(x+k,k=0..3);
& m  L$ x2 N  c- n9 D; |
1 z* N. m% g# B9 L7 M2)指数函数
) q3 i; T/ ?9 n9 G9 o计算指数函数exp关于x的表达式的命令格式为: exp(x); + Z0 s. s+ A, i( x6 `
> exp(1);8 i2 F2 Y' K, `( \6 I. H$ ?5 u2 m( J7 u
9 Z" n) _8 R( q( ^( `* y
> evalf(%);5 X, I0 q' P& r! Q/ f9 L: r: p: w

% I; A6 w0 p) v( Y. Y> exp(1.29+2*I);, T5 l8 X/ M5 ~6 Y2 v# G
& [; h) {! O. \- a6 }
> evalc(exp(x+I*y));- a# j* d5 }& j

  ^( N1 \3 w1 G! M+ }3)确定求和与不确定求和sum
; M( m, B& p: i2 N. a5 U) @命令格式: sum(f,k);  . ]  Z8 \! t8 s5 O: C1 F1 d
sum(f,k=m..n);  
8 \8 B& o- o( l6 rsum(f,k=alpha);
: ^4 R; I. R! x7 {. Isum(f,k=expr);, v/ z- c, H* Q* K7 z; a/ W; T0 k2 t
其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—不含k的表达式.
) Q8 z4 A: E9 g1 [" |5 u2 \> Sum(k^2,k=1..n)=sum(k^2,k=1..n);9 O4 o+ B; l+ P" V1 s) Z1 L# {: x
: b7 s9 t2 H0 u4 q. ~
> Sum(k^3,k=1..n)=sum(k^3,k=1..n);
( X. }& o- Q, i- ?' Q1 q+ D 9 Z* T- S! |& Y2 X; ]9 b: r6 e/ S
> Sum(k^4,k=1..n)=sum(k^4,k=1..n);+ j" x( s4 y. K: U7 R! m
$ u, R& h- l# K& g7 P7 `# T
> Sum(1/k!,k=0..infinity)=sum(1/k!,k=0..infinity);
$ S: H0 Y5 r5 d4 T
. ^& f; k& I. @& I# O' T+ w; y0 [> sum(a[k]*x[k],k=0..n);
* F, s( w" v$ B( C# r' F+ l 8 a  U8 }; b7 ~) z2 O% G! R
> Sum(k/(k+1),k)=sum(k/(k+1),k);
" \/ X9 c' k: N# d 7 N6 z$ H- V/ B0 |7 y
> sum(k/(k+1),k=RootOf(x^2-3));
, Y6 P( u7 q7 i. F. C $ Z" O$ `; ~% K# H9 U2 D
sum函数可计算一个公式的确定和与不确定和, 如果Maple无法计算封闭形式, 则返回未求值的结果. 值得注意的是, 在sum命令中将f和k用单引号括起来, 可避免过早求值. 这一点在某些情况下是必需的. 8 y# Q3 _" G5 S  e1 H5 k
> Sum('k','k'=0..n)=sum('k','k'=0..n);
+ t0 E  K/ p8 L ) W! [8 i! Q7 P  G4 v! c
如果计算一个有限序列的值, 而不是计算一个公式, 可用add命令. 如:   . g- u$ n# P; y2 V9 g8 @6 k* h
> add(k,k=1..100);6 P) e' h1 t5 M6 r0 l

3 H/ E( S' C9 h尽管sum命令常常用于计算显式求和, 但在程序设计中计算一个显式和应该使用add命令. # x0 y8 G, q; o' T
另外, sum知道各种求和方法, 并会对各类发散的求和给出正确的结果, 如果要将求和限制为收敛求和, 就必须检查显式的收敛性.
6 f  T+ ?: O, |$ p3)三角函数/双曲函数! F$ |& b) g" x4 A) O
命令格式:   sin(x);   cos(x);   tan(x);   cot(x);   sec(x);   csc(x);
6 u* I: J) L8 V' H+ i& V8 U          sinh(x);  cosh(x);  tanh(x);  coth(x);  sech(x);  csch(x);
# v/ Z2 e8 _) }/ {" s其中, x为任意表达式.
7 d0 n2 F& w+ s( S; o5 `值得注意的是三角函数/双曲函数的参数以弧度为单位. Maple提供了利用常见三角函数/双曲函数恒等式进行化简和展开的程序, 也有将其转化为其它函数的命令convert.; C! p4 u1 v) O
> Sin(Pi)=sin(Pi);3 F7 q7 _' P* m9 I; r7 q

3 z9 b$ Z0 s% B0 z7 q4 G5 ^. k> coth(1.9+2.1*I);7 R0 S6 r& j2 |9 K$ ^

, R) V/ w) ^; N: A  K$ J> expand(sin(x+y));     #展开表达式; E# ~1 O, J; E) R. t

, u  }4 }& O9 g+ p> combine(%);        #合并表达式5 o& ]* D8 H2 E

% g6 D8 e  Q* p. L9 S: v, n8 Q# H7 D> convert(sin(7*Pi/60),'radical');
2 h, r5 i3 K! S: u4 G/ P% s+ ?' k8 P
) a) M  ~; |* }8 x: j+ W> evalf(%);
7 Y$ L5 y" }5 } 9 H" T. r& B0 B! a
但有趣的是, combine只对sin, cos有效, 对tan, cot竟无能为力.6 M4 j' C9 w/ _7 r7 ~
4)反三角函数/反双曲函数9 @9 [) H1 q# u9 I: N; K9 n9 h
命令格式: arcsin(x);   arccos(x);   arctan(x);   arccot(x);   arcsec(x);   arccsc(x);
' F4 p, {6 L2 H5 S( p' y     arcsinh(x);  arccosh(x);  arctanh(x);  arccoth(x);  arcsech(x);  arccsch(x);   ; G. T# k5 T" L( @( P
arctan(y,x);
% n) Q& C; X& \3 E其中, x, y为表达式. 反三角函数/反双曲函数的参数必须按弧度计算. * i2 n4 C" R" x( w1 w
算子记法可用于对于反三角函数和反双曲函数. 例如, sin@@(-1)求值为arcsin.
1 U* _' b0 B. `( M> arcsinh(1);, r9 O9 X% I/ K! _) A

6 Y6 l1 G& t  Z6 @1 y" C0 |> cos(arcsin(x));- U0 v8 }$ x; h) P

  m/ Y1 _9 b+ N6 e> arcsin(1.9+2.1*I);' J. U* @  V; L& Q

3 d+ }/ G" m4 b1 v4 u5)对数函数* S! h/ }" s, n: h
命令格式: ln(x);           #自然对数+ @9 y2 Z7 n$ r7 j" j+ U$ R4 L
log[a](x);        #一般对数
( P) x: o6 l+ a0 p/ \1 N' T8 llog10(x);        #常用对数
4 H; j& }: T; J) X# s8 Y一般地, 在ln(x)中要求x>0. 但对于复数型表达式x, 有:   
: }- G# {3 d6 g/ @) ?9 O" l  (其中,  ), a* A0 I  |! ?3 F% N& L5 k
> ln(2002.0);" y: }: s! ?% \) R: n0 n" z

6 l+ P, \0 A; Y2 b> ln(3+4*I);
' B9 g9 p9 a" c1 h, [% l
6 k5 ?1 I3 K  o3 l7 M" W+ q; ?> evalc(%);    # 求出上式的实部、虚部4 W- b( o; h* R* [
7 |7 U; W' g( }2 X5 M3 d
> log10(1000000);8 y3 x) i  {+ k7 o) Z/ S1 j1 T

( g; x3 J% t. w6 A( z  }# b) R> simplify(%);   #化简上式
/ Y) F' w5 I9 y- v4 C0 y/ D9 x 4 {9 m% n# V$ N
2.2.2 函数的定义2 P  \/ \0 ~0 p* X
Maple是一个计算机代数系统, 带未知或者已知字母变量的表达式是它的基本数据形式. 一个简单的问题是, 既然表达式中可以包含未知变量, 那么它是不是函数呢?试看下面一个例子:   4 j  K! n& r; c1 V
> f(x):=a*x^2+b*x+c;4 p1 G4 b* y2 e9 g
+ E" N, C; C( A: |# u
可以看出, Maple接受了这样的赋值语句, 但f(x)是不是一个函数呢?要回答这个问题,一个简单的方法是求函数值:   3 ]. p6 p3 v" f
> f(x),f(0),f(1/a);: d! B5 H+ d" v, U8 J
+ G. a0 ~8 D1 f# v
由上述结果可以看出, 用赋值方法定义的f(x)是一个表达式而不是一个函数, 因为f(x)不能把所定义的“自变量”或者“参数”转换成别的变量或表达式. 但从赋值“过程”可以看出, f(x)虽然也算是一个“函数”, 但却是一个没有具体定义的函数:   
$ y0 x4 J8 j$ s2 I* q" t3 D> print(f);6 K# c) b0 S. _. Q
$ z( |0 h# s! F* A. y1 w4 A; a8 T
事实上, 我们所做的赋值运算, 只不过是在函数f的记忆表(remember table)中加入了f(x)在x上的值, 当我们把自变量换作0或1/a时, f(x)的记忆表中没有对应的表项, 所以输出结果就是抽象的表达式. 7 S6 C) b0 v! n" ?0 |$ g
在Maple中, 要真正完成一个函数的定义, 需要用算子(也称箭头操作符):   
( |" @+ b, U; e% @7 h* W5 ^> f:=x->a*x^2+b*x+c;- O! z) Z3 V, w* i" C
$ I0 [: R7 o3 s( x+ y
> f(x),f(0),f(1/a);
  m7 H" \3 T" ~- c5 P" U9 p & T/ S  }* P- X  P5 J
多变量的函数也可以用同样的方法予以定义, 只不过要把所有的自变量定成一个序列, 并用一个括号“()”将它们括起来(这个括号是必须的, 因为括号运算优先于分隔符“,”).
! \' b; }# F$ b9 X3 _0 I> f:=(x,y)->x^2+y^2;
$ ^7 n4 c9 `: z* ~# h, `" }; L! { + v; W+ J8 E# b" d) w
> f(1,2);8 B/ G: L) h) i# ]( L

+ m3 H, ?. x" N1 m' X: J3 `5 n  X> f:=(x,y)->a*x*y*exp(x^2+y^2);
: `; q- [# w+ o- V6 u 2 I. J6 [! O, ^! J
综上所述, 箭头操作符定义函数的方式一般为:   
0 M! d2 B7 V3 Q0 \: @一元函数: 参数->函数表达式% k; a+ {( K6 v$ u( V: S5 m6 M4 t' a
多多函数: (参数序列)->函数表达式! ^$ ^7 T8 s; o; |2 H0 ~6 ^3 p
无参数函数也许不好理解, 但可以用来定义常函数:   " C2 d% g' d3 r9 ]
> E:=()->exp(1);
- Y0 R$ v' e! C, A& T( l % I2 m$ [7 ]+ a5 i9 |1 ]
> E();) C/ L! t4 C5 t4 f

) X+ f' Z: q! U' c* Q1 N4 I> E(x);
# J- r4 r* l) m$ p+ Q/ y- D $ R# w- m8 h/ E3 U& w7 n1 x* Q
另一个定义函数的命令是unapply,其作用是从一个表达式建立一个算子或函数.
4 W. b& \; O% d+ s& a( m& _定义一个表达式为expr的关于x的函数f的命令格式为:  f:=unapply(expr, x);          7 T1 |1 x/ \/ B4 }' @$ M6 R- Z+ E- H
定义一个表达式为expr的关于x,y,…的多元函数f的命令格式为:  f:=unapply(expr, x, y, …);     
/ W) e/ ^8 N* T> f:=unapply(x^4+x^3+x^2+x+1,x);. q$ `7 \/ q; o1 M8 w5 t
1 t* T" T8 |* w, \9 C7 Y
> f(4);
/ {5 I5 B  q' r, u2 B( Y+ H
( i2 `0 `0 V+ d! s) P> f:=unapply(x*y/(x^2+y^2),x,y);- @2 M) G" y% o0 J! h! @1 T5 P# R
5 j* |$ r) v; v' i
> f(1,1);5 p  M) A) f8 ^0 Z
- N( Q. d% K2 l8 [$ r' _
借助函数piecewise可以生成简单分段函数:
4 y$ f  t4 A& E; B) {+ F2 i& `- s> abs(x)=piecewise(x>0,x,x=0,0,x<0,-x);
& }% b- O. S/ }  u  b; y
: o  F3 z1 U3 ^5 i清除函数的定义用命令unassign.
& E2 m' |, N# r5 z; ?8 H+ ^# x, ?> unassign(f);
1 X# H- ~# q) T4 {8 Q> f(1,1);2 ?8 `: W2 C" C
: x9 p* a# L- i; x1 h5 _
除此之外, 还可以通过程序设计方式定义函数(参见第6章). * i  H5 E5 E+ z* ], S5 X9 j
定义了一个函数后, 就可以使用op或nops指令查看有关函数中操作数的信息. nops(expr)返回操作数的个数, 函数op的主要功能是获取表达式的操作数,其命令格式为:
5 R& A+ @5 \% yop(expr);          + o& O: V+ Q% G5 Y1 O2 f  S
op(i, expr);         
6 {1 z" V3 `) ?op(i .. j, expr);      
4 ~" O6 j6 I- hnops(expr);* r: d' M8 l4 ?& h4 A  O
如果函数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的类型.
- w  V" X0 @6 J, \  k2 e命令op(i .. j, expr); 执行的结果是expr的第i到第j个操作数, i..j中含负整数时的情形同上.& w- K* L8 @; {, h9 f
命令op(expr); 等价于op(1..nops(expr), expr); ; z! l0 v4 V" ?) r
特别地, 当op函数中i为列表[a1, a2, ..., an], 则op([a1, a2, ..., an], expr); 等价于op(an, op(..., op(a2, op(a1, e))...));
% a; U* s4 j5 ~4 q% ~而当expr为一般表达式时,nops(expr)命令返回的是表达式的项数, 当expr是级数时返回级数每一项的系数和指数的总和.
# E( W; j& a; x> expr:=6+cos(x)+sin(x)*cos(x)^2;( k8 Y+ |# T. C# G( A

' K: {% j- I7 N. q> op(expr);4 f% H9 M: q  y9 j8 t6 S* _
( d4 ^, ?$ d. ]  n
> nops(expr);
5 W5 F& f) a" G. e3 s' ~, A
  F$ Q9 u0 V, r0 V> p:=x^2*y+3*x^3*z+2;
7 ]/ m4 x( j: n# k
- Q3 s8 Z0 j( ]; I6 J5 p0 x. R> op(1,p);- q  z' G5 |" z" R

- f/ j: p2 k* Y. }! c3 h> op(1..nops(p),p);' l) B" ~8 r. ~) H$ F
0 Z% a0 q) S# Y7 h* Q9 b/ }
> op(op(2,p));
% P1 K% y; L+ p6 b
1 v" x; f0 d) y% [# V> u:=[1,4,9];
$ F- o; R0 E$ W3 G1 p; p . E& p, [. g/ p+ X# Y) @' e
> op(0,u);. N: c; j- D, w+ J

- \$ f; n2 {0 Y" k; K0 R> s:=series(sin(x),x=1,3);& q- o- G6 ^$ K" s& l  R/ t) Y
/ ^0 r5 D: ]; K  @( B, f
> op(0,s);, P, A9 o  N7 M
        . ]$ B2 T; T2 ]9 R: E) D
> nops(s);
, U0 Q$ _# D/ N( `) H7 ? . E( o( s6 ?# H6 c. y1 X" @
下面一个有趣的例子说明了Maple在处理算术运算时的“个性”:
4 O) o4 g. C0 j* p! l7 ?> op(x*y*z);
. |9 G. z* w. G # \& c5 G& A  k2 Q
> op(x*y*z+1);4 X5 b' S, b. s. |6 L

3 w  g: x- \( x! g% u+ i5 k2.2.3 Maple中的常量与变量名- |6 q7 D% W3 H# S" V6 {2 V1 _
为了解决数学问题, 一些常用的数学常数是必要的. Maple系统中已经存储了一些数学常数在表达式序列constants中:   
* D: G' ~' J$ M" K> constants;7 ^- O- N8 W0 V- m% t" e( T

% D& ^0 L0 z7 g6 {  K: \为了方便使用, 现将上述常数的具体含义列示如下:   : x6 r, S, S* v! @8 v$ T* ^
常    数        名 称        近似值, R9 P- R! Q( Y" S* [" E
圆周率
& n. [3 H5 z' g  T: N5 `4 w0 i; ~Pi        3.1415926535* ]5 F2 U& [# h" C5 H7 y
Catalan常数
, k" O3 k3 _, J; GCatalan        0.9159655942% c+ \$ q& q3 F/ M
Euler-Mascheroni常数
: l  x( S, U% l  B. I. S8 v! {% Mgamma        0.5772156649
, X/ z) O  S1 b) B0 w5 s
& z9 ]) t8 ^/ {3 F2 x6 w2 y) sinfinity       
4 o+ L, D  H2 }# u# p% P
+ N- n5 h- I  W9 f7 Z需要注意的是, 自然对数的底数e未作为一个常数出现, 但这个常数是存在的, 可以通过exp(1)来获取. 4 v4 U# R4 y* c0 ^& f: V
在Maple中, 最简单的变量名是字符串, 变量名是由字母、数码或下划线组成的序列, 其中第一个字符必须是字母或是下划线. 名字的长度限制是499个字符. 在定义变量名时常用连接符“.”将两个字符串连接成一个名. 主要有三种形式: “名.自然数”、“名.字符串”、“名.表达式”.
# [# S/ I/ k5 A  M& {8 v值得注意的是, 在Maple中是区分字母大小写的. 在使用变量、常量和函数时应记住这一点. 数学常量 用Pi表示, 而pi则仅为符号 无任何意义. 如g, G, new_term, New_Team, x13a, x13A都是不同的变量名. . L" U- l8 T. p" U7 X
在Maple中有一些保留字不可以被用作变量名:   ) s) X; X- q% w5 N1 H, N8 p- k
by      do      done     elif     else     end        fi        for      
: Y( Z+ B+ d6 H' n* Wfrom    if       in       local     od     option    options     proc         , L' k8 f7 a) j5 P- z$ g* o$ y* b6 q
quit    read     save     stop     then     to        while      D
* o+ i7 l* I5 H2 i. c. ?- \Maple中的内部函数如sin, cos, exp, sqrt, ……等也不可以作变量名.
% d' Z& a  P, v2 C另外一个值得注意的是在Maple中三种类型引号的不同作用:   
5 ~0 U  \& V7 P6 ?* A`  `:   界定一个包含特殊字符的符号, 是为了输入特殊字符串用的;   
/ E( K9 ^! l4 X# }'  ':   界定一个暂时不求值的表达式;    , L1 B2 v+ x1 K. q' q6 F- A
"  ":   界定一个字符串, 它不能被赋值.
. Q" T- n) r1 I% y* t8 S2.2.4 函数类型转换           0 v$ C. r: b7 y6 e1 b0 c/ r3 o
函数类型转换是数学应用中一个重要问题, 譬如, 将三角函数转换成指数函数, 双曲函数转换成指数函数, 等等. 在Maple中, 实现函数类型转换的命令是convert. 命令格式:  
% c1 ~/ k/ a3 G( j& p) g    convert(expr, form);        #把数学式expr转换成form的形式9 c) k7 |2 o& _. y8 U
convert(expr, form, x);      #指定变量x, 此时form只适于exp、sin、cos
9 P9 P1 a2 t3 |$ i4 C( D5 Vconvert指令所提供的三角函数、指数与函数的转换共有exp等7种:   * A* H6 s) T0 a* m7 H1 N3 D/ v
(1) exp: 将三角函数转换成指数; @. V# d, Y7 x+ ~: a) @
(2) expln: 把数学式转换成指数与对数. j( u3 d+ N3 ^3 ?' r1 O
(3) expsincos: 分别把三角函数与双曲函数转换成sin、cos与指数的形式6 d# |( ?: N% p( Q6 X' H- V. x
(4) ln: 将反三角函数转换成对数! w  ?& P& m) S9 ]* H! G2 P
(5) sincos: 将三角函数转换成sin与cos的形式, 而把双曲函数转换成sinh与cosh的形式
# P8 q8 D* g3 V# _# ~* ]) R(6) tan: 将三角函数转换成tan的形式5 a0 j! Z. s# i) _3 {& D
(7) trig: 将指数函数转换成三角函数与对数函数
& ~+ K! i$ }3 f' s3 U* L, _> convert(sinh(x),exp);   #将sinh(x)转换成exp类型
" P) T7 r9 b" @7 m/ t6 G ) F- N" B% @# s: H- q7 I
> convert(cos(x)*sinh(y),exp);
" k0 |# J7 M' V1 C) n  R, F1 k
( N: J( o0 C$ I- i. {" p> convert(cos(x)*sinh(y),exp,y);
; a3 j8 V7 E* h
8 ^6 E7 c% K  }' s+ ?* j5 ]6 @> convert(exp(x)*exp(x^(-2)),trig);7 r# Y( ]% C: S5 l$ ?5 z' W

. S/ N' @4 B3 K" A5 A4 Q% A> convert(arcsinh(x)*cos(x),expln);* {9 O) e* s# b& P" u
" _: D) a% _; l7 ~
> convert(cot(x)+sinh(x),expsincos);
6 h3 |2 s0 `6 L
6 X0 [" F6 B6 c$ w0 r/ P1 W3 U> convert(arctanh(x),ln);, ?" f+ g+ ]3 r  L
0 U3 C- a: @9 p8 f
convert在有理式的转换中也起着重要的作用. 在有关多项式运算的过程中, 利用秦九韶算法可以减少多项式求值的计算量. 在Maple中, 可以用函数convert将多项式转换为这种形式, 而cost则可以获取求值所需的计算量. 注意: cost命令是一个库函数, 第一次调用时需要使用with(codegen)加载. 例举如下:   
$ I% Q& X. s) A1 ^- @2 ~) o> with(codegen):0 p  m% @- T( l4 ?4 z- L" ~
> p:=4*x^4+3*x^3+2*x^2-x;+ ~  m8 b6 L3 A2 Y) Y. U% R+ o* o
8 f+ g) ^$ b, g
> cost(p);
3 I/ R: `4 T2 h
8 d2 p' C- S: x# j% p6 G4 [! {> convert(p,'horner');  #将展开的表达式转换成嵌套形式
5 s( @6 H1 A2 D% T; x9 q: F* m 9 @* C2 N3 `% g- B; }
> cost(%);& F% v" @1 y! m, Z' [' ~

* d/ n9 g% m5 o1 L, {4 r2 T3 G6 [同样, 把分式化成连分式(continued fraction)形式也可以降低求值所需的计算量. 4 o* [! d% q- i0 {6 }$ `5 V" x4 M
> (1+x+x^2+x^3)/p;
3 F2 M6 M, a: c  e; W3 i! c ! p0 |: Q' O4 C8 q9 i
> cost(%);
% x/ z8 l; v5 d6 p7 Y  A 1 T$ M1 B* C& [+ C. }
> convert(%%,'confrac',x);4 g% P; V2 P' v, N3 q6 `% }8 Q

+ v6 [: t1 }- {( D> cost(%);
" K8 F/ t  r  @* q8 E7 F
3 ?! W, s" R2 S在某些场合下(比如求微分、积分时), 把分式化成部分分式(partial fraction)也就是几个最简分式的和式的形式也可以简化运算, 但简化程度不及连分数形式.
6 C7 S3 n" w5 _2 B> convert(%%, 'parfrac',x);7 V" h% r+ ]) R* K$ G

3 H2 n3 m5 w) G9 D/ ~> cost(%);
/ I8 H" n* c. s" p+ t& }
% w0 t$ S$ Q- ]2 i而把分数转换成连分数的方法为:
/ Y: H, ~) c1 x3 Y( J4 p9 ?> with(numtheory):
  r! r/ o, D6 i; S> cfrac(339/284);
* u+ ^# f& p! }9 \   z* q3 S7 `3 s( s1 t  v4 ]
2.2.5 函数的映射—map指令1 x5 w/ V- ?7 r4 n' u
在符号运算的世界里, 映射指令map可以说是相当重要的一个指令, 它可以把函数或指令映射到这些结构里的元素, 而不破坏整个结构的完整性. 命令格式为:
5 T+ I9 Z5 G' _' P2 r8 z' H4 [4 Rmap(f, expr);      #将函数f映射到expr的每个操作数
/ H' t1 ?: c# a8 e; gmap(f, expr, a);    #将函数f映射到expr的每个操作数, 并取出a为f的第2个自变量' L6 o- |, ?9 {+ }; I
map(f, expr, a1, a2,…, an); #将函数f映射到expr的每个操作数, 并取a1~an为f的第2~n+1个自变量
/ e. ~) ~' u8 d3 b9 Y8 I. lmap2(f, a1, expr, a2, …, an);    #以a1为第1个自变量, expr的操作数为第2个自变量, a2为
6 @" m4 R% z3 K% J- }! i第3个自变量…, an为第n+1个自变量来映射函数f
" b0 e! ^# O8 K* o> map(f,x1+x2+x3+x4,a1,a2,a3,a4);9 ~( C- g# v% X, s

! s9 T, h$ x/ U$ o/ _6 c5 P, R> f:=x->sqrt(x)+x^2;
! i' [* S4 F& N3 E
% ?' W( B" Y6 j. H: C) Q8 v> map(f,[a,b,c]);
  p# j  b/ c3 \7 Z; U
& R. \9 N: j) N$ c> map(h, [a,b,c],x,y);
- y$ I/ X. E$ | % K' b% l' @3 w8 Y0 {
> map(convert,[arcsinh(x/2),arccosh(x/2)],ln);4 X. L0 E+ L  U- ]

4 ]6 l3 x5 {0 K" L& A! I0 \! l. h> map(x->convert(x,exp),[sin(x),cos(x)]);
- m/ r# F7 P! Q: h0 m ) [5 B. b( W3 D! A6 U  ?1 D1 b
上式的映射关系可通过下式理解:
, ^$ ~1 S- |3 f5 P> [convert(sin(x),exp),convert(cos(x),exp)];; u0 E( _( w1 X0 [0 N; Z: e3 Y  H

" Q+ W/ c8 |  v  G> restart:
6 s( Q2 l  {4 T6 Qmap2(f,a1,x1+x2+x3+x4,a2,a3,a4);
9 c2 J1 e* N% d" v, t2 x 9 Z3 k' D# `- p( R1 O6 [% R
> map2(max,k,[a,b,c,d]); 0 B3 k, ~8 F  v0 D% a

2 c7 b6 i# u8 c/ u* h/ r8 Z* i4 U再看下面示例:   
7 m1 i1 F8 d9 {1 r& H1 o: F5 h. _> L:=[seq(i,i=1..10)];
1 ]) s8 Q2 D, {: j2 g " Z7 S9 d. }" V4 {) y4 \: n
> nops(L);4 o( d1 B2 v" q3 P

7 U# p% g. q6 t# c> sqr:=(x)->x^2;
1 H. h  f$ ]8 q0 @. g- b8 a7 n 0 n4 ]. d3 b6 c! u# ]& ]
> map(sqr,L);" V2 l3 `5 E/ W" I: J: ^8 H
/ w; B+ ?- N. A
> map((x)->x+1,L);
6 E5 \0 ?4 Y, \; z$ ?' Q* n 1 b7 h; l# ]- O" f4 p4 H
> map(f,L);
+ u" v' L. ]) K6 J- ~9 H( h 5 B* R7 i# X# i6 v* ^
> map(f,{a,b,c});
- W& m. |( S- T6 C% p, H0 I% Q7 n! Z 4 v9 {  E  E3 v9 ^+ A9 x# A& z: Z) ~
> map(sqr,x+y*z);1 u/ ]2 l- m: O$ Q3 I

6 n# z8 S+ V4 v: D% m/ c> M:=linalg[matrix](3,3,(i,j)->i+j);
5 V7 d% i. F, z4 L( Z! x4 k1 Y 2 x' i. d% n5 P- i
> map((x)->1/x,M);) E. {* b4 `1 S6 S! W
6 \  ]3 s& R4 ^, W; |
3 求 值% `+ v9 u6 C6 p2 d/ [6 O
3.1 赋值" u7 |. R( H9 B  c% L
在Maple中, 不需要申明变量的类型, 甚至在使用变量前不需要将它赋值, 这是Maple与其它高级程序设计语言不同的一点, 也正是Maple符号演算的魅力所在, 这个特性是由Maple与众不同的赋值方法决定的. 为了理解其赋值机制, 先看下面的例子. * K. O8 P8 A& u6 l' D3 t
> p:=9*x^3-37*x^2+47*x-19;. |" W: ?7 D- c' |1 u
! A) }. [: g/ M
> roots(p);
! {3 Y, I9 i9 I9 v5 `3 P/ U% P: O
6 |, w* I+ h: S> subs(x=19/9,p);
; E! L3 b3 m9 T. R6 c7 u
3 y- Y5 t# c4 d& R在这个例子中, 第一条语句是一个赋值语句, 它的作用是把变量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;”这样的简单语句即可验证.
& u: F' Y2 i* ?2 m- L3.2 变量代换" E- O; s$ U# f) S3 T
在表达式化简中, 变量代换是一个得力工具. 我们可以利用函数subs根据自己的意愿进行变量代换, 最简单的调用这个函数的形式是这样的:   
) D4 S& q7 ^8 n2 a( z; q/ H$ |% I5 v- ^8 j: osubs ( var = repacedment, expression);9 o4 e1 q  S$ w
调用的结果是将表达式expression中所有变量var出现的地方替换成 replacement. ( L0 l# V* u# o2 V2 L
> f:=x^2+exp(x^3)-8;
$ e, c- N0 d- S5 |
3 E. C' A( P1 Q  d# _6 M$ D> subs(x=1,f);7 `4 a, V& i$ j7 ^9 _
3 |  r) v; {* v9 ]( k* U
> subs(x=0,cos(x)*(sin(x)+x^2+5));
9 n$ a: C% }: z. z, V" Q/ C 4 A8 ?8 i" n3 H
    由此可见, 变量替换只得到替换后的结果, 而不改变表达式的内容, 而且Maple只对替换的结果进行化简而不求值计算, 如果需要计算, 必须调用求值函数evalf. 如:   
! D  [, |/ H1 @" E> evalf(%);! C# T5 \* p6 a9 |3 O
& U/ p; q- Z0 x5 Q
变量替换函数subs也可以进行多重的变量替换, 以两重代换为例:   5 {5 C/ h+ O+ Z, e3 R
subs (var1 = repacedment1, var2 = repacedment2, expression)
7 O" k% I; j- |! M1 _% m2 h调用的结果和按从左到右的顺序连续两次调用是一样的, 也就是先将expression中的var1替换成replacement1, 再将其结果中的var2替换成replacement2, 把这种替换称作顺序替换;    与此相对, 还可以进行同步替换, 即同时将expression中的var1替换成replacement1, 而var2替换成replacement2. 同步替换的调用形式为:   
& D% C4 G6 W+ F+ E; }/ A( u, Wsubs ( {var1 = repacedment1, var2 = repacedment2 }, expression)# n( h0 b/ T3 M9 z0 c
下面通过例子说明这几种形式的替换. " I1 |: j" U3 G8 E4 }. k/ E' @2 S& ?
> subs(x=y,y=z,x^2*y);              (顺序替换)
, ?3 A! ^- S9 Q: H: d, Q2 F$ o 8 r* P7 p9 @1 ]- \* a* }) t
> subs({x=y,y=z},x^2*y);            (同步替换)+ \* V  M9 C2 E& x3 X! H
+ K3 \. o$ U) K" v! J; M4 D- s
> subs((a=b,b=c,c=a),a+2*b+3*c);   (顺序替换)' b8 {( o# I. |, C5 O; q& F& l

! s0 d. l- P& I- R. y> subs({a=b,b=c,c=a},a+2*b+3*c);    (轮  换)
* z* O. X5 t' Q6 g& j # y" t. V# X9 O4 c
> subs({p=q,q=p},f(p,q));             (互  换)' [) `( H  V7 c3 ?3 s

4 a+ _3 I8 B4 g1 _: Q; n3.3 假设机制
$ s2 K" }# j4 e5 LMaple是一种计算机代数语言, 显然, 很多人会尝试用Maple(或其他计算机代数语言)解决分析问题. 但由于分析问题与处理问题的考虑方法不同, 使得问题的解决存在某些困难. 例如考虑方程 的解. 如果k是实数, 结果显然是x=1, 但如果k是 的复根, 为了保证解x=1的正确性, 必需添加附带条件: 也就是当 时x=1. 这是一个对结果进行正确分析的例子. 然而从代数的角度考虑这个问题时就会把k当作不定元, 此时k没有值, 从方程两端去除k的多项式是合法的, 只要这个多项式不是零多项式即可(这一点是可以保证的, 因为其所有系数不全为0). 在此情况下x=1就不需要任何附加条件. 计算机代数系统经常采用这种分析的观点. 7 h, E/ [' y7 K+ G0 P4 y% p! `5 v
在Maple中, 采用分析观点解决这类带有一定附加条件的实用工具是函数assume, 其命令格式为: assume(x, prop);
# P8 a) U5 T1 d3 J+ z9 c+ P& \' P& a函数assume界定了变量与变量之间的关系式属性. assume最普遍的用法是assume(a>0), 该语句假设符号a为一个正实常数; 若假定某一符号c为常数,使用命令assume(c,constant); 另一方面, assume可以带多对参数或多个关系式. 当给定多个参数时, 所有假定均同时生效. 例如, 要定义a<b<c, 可以用assume(a<b, b<c); 同样地, 要定义0<x<1, 可以用assume(0<x,x<1). 当assume对x作出假定时, 以前所有对x的假定都将被删除. 这就允许在Maple中先写“assume(x>0);”后再写“assume(x<0);”也不会产生矛盾. 8 v' o/ F, s" M) p( U/ R
> Int(exp(-s*t),t=0..infinity);
- F$ O! \$ x- K
6 i& p* z- T0 `/ c! z1 ~- u' L> value(%);
( o3 {% {, ~" W# ~! `Definite integration: Can't determine if the integral is convergent.. B5 a% ^- \0 J4 L
Need to know the sign of --> s/ O3 e+ X- S% K5 v. q
Will now try indefinite integration and then take limits.4 W. s3 h5 {; H/ J- r/ F; e

# x. `: b8 X7 Y6 ]* a4 A  R+ }> assume(s>0);) n) ]$ [) P2 A- z2 k$ y
> Int(exp(-s*t),t=0..infinity);
# Z) |4 [5 W2 }& z6 y% I ! x/ M5 l! h: V0 X% d
> value(%);' x1 b% I! l) s" S8 ~$ j

! ~% l+ T' s4 k& [; d3.4 求值规则
. C4 x$ N% s1 r3 M* e在多数情况下, Maple的求值规则设计为做用户期望的事情, 但要做到这一点很困难,因为不同的人在相同的情形下会有不同的期望. 在大多数情况下, 全局变量被完全求值, 局部变量被一层求值. 而由符号' '界定一个暂时不求值的表达式, 单步求值仅去掉引号, 不作计算, 这也是允许取消指定名字或清除变量的原因. 如下例:   # C* |+ C( N/ i) ]+ B
> x:=y;
5 j9 a% t8 t: d7 V . S: t/ D7 F9 R; z, z) u/ p& P
> y:=z;
( U7 D6 p8 \# @& |, r2 f2 \ ) ]4 m! q) l$ }* E! Z7 H
> z:=3;
  u. h. e& Q' f0 W* X' F ' E) q$ I+ _1 O: T) a
> x;+ n: N: Q& n5 B' [4 o8 G
1 k4 U8 |; b5 P
> y;* K/ S% n0 O+ Q0 n  s% n

8 q! w/ d3 {1 n$ b> x:='x';" _$ ^4 b- ]& c; \( m

3 Z# X/ w& a5 C- S, d> x;9 ~) d3 U" @6 v" s
. i  t2 P- p$ l. a
> y;
2 d  d5 g8 l+ c7 _/ P0 _* y3 m! m+ x$ M
& X/ D& T4 }* ^  r对于不同的问题, Maple设计了不同的求值命令. 现分述如下:   ! T0 u1 t( }- z& c5 q! m" i
1) 对表达式求值
5 D( e0 `  ~4 V, y0 @: p* y命令格式: eval(e, x=a);  #求表达式e在x=a处的值
% ?) I3 V5 V8 x- _( E1 l& w! ?5 w             eval(e, eqns); #对方程或方程组eqns求值
0 u$ ]  J2 K' t+ }5 S8 f1 i- N% a             eval(e);      #表达式e求值到上面两层3 e/ f9 c! t5 Z4 b
             eval(x,n);    #给出求值名称的第n层求值: f. z9 e% F/ \5 N: T5 T
> p:=x^5+x^4+x^3+x^2+x+73;
$ L( `+ G1 H3 D7 ^2 A 6 q. X. A0 p# r2 c
> eval(p,x=7);% b9 k  L) G* g

. X! Y3 l5 W# Z3 |8 ~  x& H> P:=exp(y)+x*y+exp(x);
! B9 i7 i- o3 [* k9 f; W
7 Z- z" e# m% O' m3 E0 c> eval(P,[x=2,y=3]);! n2 m" b! q8 v% v
+ L* H/ C4 F2 @+ H! e# v$ ]
    当表达式在异常点处求值时, eval会给一个错误消息. 如下:   
" ?! l4 }1 _# Q' f( x, o> eval(sin(x)/x,x=0);
3 L9 B  E$ M3 x& F5 a" VError, numeric exception: division by zero
& G2 P- ?. T, Z* A, L( S- y" T    下面再看使用eval进行全层求值或者对名称几层求值的示例:   0 C8 P) D! N& ~; j% R0 d& R
> a:=b: b:=c: c:=x+1:
4 \2 q$ t4 p( g> a;              #默认的全层递归求值, P2 r- N/ ]7 E1 j+ G* n% ^- \. q
" P6 Y7 _) n  |2 T' l/ j/ o
> eval(a);        #强制全层递归求值# \* k' y( a/ E5 ]

8 b6 v/ ^9 Z) Y; T- [> eval(a,1);       #对a一层求值
2 B: `, R* h8 |3 w9 L  e! r$ x
2 S! G% k4 \) J1 \6 w. F3 F> eval(a,2);       #对a二层求值
7 E3 H7 F/ d' R4 X' G/ m, H' j( a
9 x4 G0 h6 G% Q8 T> eval(a,3);       #对a三层求值, }' k, Q5 |1 d

9 F) D% O6 L% g. U0 Y> eval(a,4);       #对a四层求值+ Y# R0 O! K# w1 ]3 \8 r
, |  i$ H; T! e$ F* r9 g$ M  e
    2) 在代数数(或者函数)域求值
! U" k9 I9 {+ a: t- S9 x8 f, g命令格式: evala(expr);       # 对表达式或者未求值函数求值& D4 ~4 v/ ^/ a" z
             evala(expr,opts);   #求值时可加选项(opts)
7 l: c6 i. W  \  ^. m所谓代数数(Algebraic number)就是整系数单变量多项式的根, 其范围比有理数大, 真包含于实数域, 也就是说任意实数都是整系数多项式的根(如 就不是任何整系数多项式的根). 另一方面, 代数数也不是都可以表示成为根式的, 如多项式 的根就不能表示成为根式的形式. ( i! e. G) [2 p, |  B, T' g
代数数的计算, 算法复杂, 而且相当费时. 在Maple中, 代数数用函数RootOf()来表示. 如 作为一个代数数, 可以表示为:   
3 E% ?8 u9 e# x! r> alpha:=RootOf(x^2-3,x);( E; R6 v6 n# I* n# y3 X1 C* U: d3 [

" k. C: k0 |  p/ {3 E/ f/ {+ S> simplify(alpha^2);
# _5 m8 h% J7 k$ g3 a/ I* s 0 G3 \$ g: z1 Q3 i. S; V/ W8 F
在Maple内部, 代数数 不再表示为根式, 而在化简时, 仅仅利用到 这样的事实. 这里, Maple用到一个内部变量_Z. 再看下面一个例子,其中alias是缩写的定义函数,而参数lenstra指lenstra椭圆曲线方法:
1 r# L6 s% H5 U# f  B1 k> alias(alpha=RootOf(x^2-2)):4 a3 h) P" q% u! p. V
> evala(factor(x^2-2,alpha),lenstra);2 X5 Y1 `3 m8 J

5 J4 P% T0 D8 q/ c* R> evala(quo(x^2-x+3,x-alpha,x,'r'));
" ~. b9 Y5 ^" E, b, J8 P * Z5 _! |, \/ y, |
> r;4 [/ G8 t3 K, f$ r" p  d
, M4 }8 A! }: p. `6 d# [
> simplify(%);
$ d0 X$ R* ^3 P2 d" O 9 e% n: i% `4 P$ D% F( d. w
3) 在复数域上符号求值
. D9 }6 \# C/ N& E- u操纵复数型表达式并将其分离给出expr的实部和虚部的函数为evalc, 命令格式为:  N- I* c( m3 m% N1 k' I
evalc(expr);   
3 [, C# H" D* D  Y" p( ievalc假定所有变量表示数值, 且实数变量的函数是实数类型. 其输出规范形式为: expr1+I*expr2. 7 O( ~4 H$ v" h8 ^& j- H2 F; c2 U
> evalc(sin(6+8*I));: k! i0 U7 S+ ~1 i/ @1 X- X3 \& c% R
3 Y$ d1 i' C3 W3 u4 _
> evalc(f(exp(alpha+x*I)));
- C# [; z% `6 \' F4 {& H ! u! \/ q+ _( M6 a' o
> evalc(abs(x+y*I)=cos(u(x)+I*v(y)));
: a; w; C$ ?/ ?4 @# Z3 Y ' i  X/ A  h' i! a
4) 使用浮点算法求值
  I( H; |2 \# k. t6 d5 x浮点算法是数值计算的一种基本方法,在任何情况下均可以对表达式expr使用evalf命令计算精度为n的浮点数(n=Digits), 如果n缺省, 则取系统默认值, 命令格式为: evalf(expr, n);     $ N1 Y0 h2 f: K
> evalf(Pi,50);   
. V" t2 w  @2 Y: l& _3 l2 p- l3 F 1 w6 j: n4 e9 J7 P
> evalf(sin(3+4*I));   
6 Z! G. O1 V0 _- _ 8 v, d$ F+ |1 m$ `8 n
> evalf(int(sin(x)/x,x=0..1),20);8 o: z& J5 S+ |

+ m: {/ H3 n! s' U/ L) ]5) 对惰性函数求值8 L6 @% b7 Z0 @/ ]# j4 b2 W5 Q
把只用表达式表示而暂不求值的函数称为惰性函数, 除了第一个字母大写外, Maple中的惰性函数和活性函数的名字是相同的. 惰性函数调用的典型用法是预防对问题的符号求值, 这样可以节省对输入进行符号处理的时间, 而value函数强制对其求值. 对任意代数表达式f求值的命令格式为: value(f);   
# i  v7 [/ f  m" `% N* s+ _- s> F:=Int(exp(x),x);( v6 A' C3 n+ a: }4 }$ _8 L5 e9 c( Y
% z1 \) n0 f; V; E8 h7 a7 A/ J/ k
> value(%);
. z  |, j/ i% M: t! T; I/ r8 _: j# C   g* @! M+ i% P( G) F0 a: w
> f:=Limit(sin(x)/x,x=0);
5 ?4 g) |: |( A% e" o, G( K2 p
# f6 P% b" ~% x( W> value(%);1 K( h1 L; i1 a/ y
! t+ h' G+ n8 p" w( i
另外, 将惰性函数的大写字母改为小写字母亦即可求值. 如下例:   
, z$ q# q  Z2 x0 A7 D4 N$ p; ^9 J1 ]> Limit(sin(x)/x,x=0)=limit(sin(x)/x,x=0);
$ _4 L$ Y8 T1 e/ O- _3 M. n
0 J2 z6 r, v; l: Y; L' S& M& c# ~4 数据结构2 I' H0 ]6 x1 @  W# Y) P6 b2 ?* j
Maple中有许多内建的与FORTRAN、C或Pascal不同的数据结构. 主要的数据结构有序列(sequence)、列表(list)、集合(set)、代数数( algebraic number)、未求值或惰性函数调用、表(table)、级数(series)、串(string)、索引名(index)、关系(relation)、过程体(process)以及整数(integer)、分数(fraction)、浮点数(float)、复数(complex number)等数据结构, 而矩阵(matrix)在Maple中表示为阵列, 是一种特殊的表. . ?, a& A# ~) W; W# h* p
4.1 数据类型查询
; y8 z! h# z3 k在Maple中, 用whattype指令来查询某个变量的数据类型或特定类型, 命令格式为: 3 o5 n& T9 B" E
whattype(expr)        # 查询expr的数据类型
: }* P" D" \9 z4 `8 ytype(expr, t)           # 查询expr是否为t类型, 若是则返回true, 否则返回false& y8 H- n: d7 ^6 H" Q" S
> whattype(12);9 k& Y% D1 |' ~6 }6 @% u  ]6 o

9 c8 k  n3 R# u$ _> whattype(Pi);5 {! v, }1 [& F$ k6 G0 |( q

: d. V% f4 Y( W  a& G: J9 X8 ]> type(1.1,fraction);
3 l1 `+ O5 j# u$ e : j9 T2 u8 m) [# g) u
> whattype(1.1);
3 t3 w3 s  P) b; O( p. Z
+ ?3 b% [* w8 y' N6 t: a4.2 序列, 列表和集合
3 |( x) ]: }2 B' M* o4.2.1 序列
/ u, }9 N8 {) F+ }' c& K% F所谓序列(Sequence), 就是一组用逗号隔开的表达式列. 如:   
' ^9 `9 j7 A0 z4 ^# n/ {> s:=1,4,9,16,25;
% q' e" P; H& a- }: w( c- N& q
9 z8 {6 J8 Q+ f- J+ t% w> t:=sin,com,tan,cot;
$ Y9 }4 g) L" d) b. b6 j
1 @+ I0 }1 A( P一个序列也可以由若干个序列复合而成, 如:   
5 k/ D% l6 ~  G: u* r) h, \> s:=1,(4,9,16),25;
2 x; D, n% G2 W: I2 ?( I
# a* g( a. d; y, ^1 z> s,s;
3 i/ D1 j6 Z5 E  n/ @  l
! o! z8 E/ g6 Y4 {而符号NULL表示一个空序列. 序列有很多用途, 如构成列表、集合等. 事实上, 有些函数命令也是由序列构成. 例如:   # }$ y' h" A) ]7 n7 l' X! Q! E& e
> max(s);
# Y6 F, ~2 D' |4 K) o) k8 B/ @
. Q* E$ `! X  M  Z. N> min(s,0,s);5 O$ Z5 ]& o/ x# Y
# B+ y$ H# ~! u! C
值得注意的是, op和nops函数命令不适用于序列, 如op(s)或nops(s)都是错误的, 如果要使用op(s)或nops(s)前应先把序列s置于列表中.
0 q: a, W+ S5 K1 ^/ ]: I, d9 [7 H> s:=1, 2, abc, x^2+1, `hi world`, Pi, x -> x^2, 1/2, 1;
" `  o- \; Z# i* U+ r0 H
& ]) {. z5 q+ O  c9 G: P! m> op(s);
1 v0 J% u5 X: A7 L( qError, wrong number (or type) of parameters in function op' z# c. ~9 d4 V( ~: J9 r1 h
> nops(s);  ]/ ]& {% ]: X, G2 B
Error, wrong number (or type) of parameters in function nops# P& ^: X# K5 I
> op([s]);9 ^  i1 i3 |" J2 E; G

. S5 {8 j4 R2 m6 m, M% p3 F> nops([stuff]);, M7 s$ G! B- H+ x: a. S! Z

: _& w0 ], U) s1 ?函数seq是最有用的生成序列的命令, 通常用于写出具有一定规律的序列的通项, 命令格式为:   " e% s: i0 V7 q% I% d. N
seq(f(i), i=m..n);  # 生成序列f(m), f(m+1), …, f(n) (m,n为任意有理数)5 b9 r- j! L( x
seq(f(i), i=expr);  # 生成一个f映射expr操作数的序列
% X+ e% S  l/ aseq(f(op(i,expr)), i=1..nops(expr));  # 生成nops(expr)个元素组成的序列, J3 e! ?! J" \! M, |
> seq(i^2,i=1..10);
8 E4 g  L* E* v1 O- B0 F
2 s" ]/ c  Q0 }2 Z4 U" [1 |  M> seq(ithprime(i),i=1..20);8 X! `/ M& u3 k5 y

- M4 o0 U8 k  @; m) \6 {" ~> seq(i^3,i=x+y+z);0 v) N. U3 W; I- _- B7 Y4 i; M
6 l7 `/ [- D" F& K7 N8 m
> seq(D(f),f=[sin,cos,tan,cot]);# t0 M; k& ]8 j4 z* B2 T
- }4 ~7 D3 H+ s7 z
> seq(f(op(i,x1+x2+x3+x4)),i=1..nops(x1+x2+x3+x4));3 J7 Q* [. ~4 N: N. Y% y5 B! V( }

2 ?( n: h! E$ r获得一个序列中的特定元素选用操作符[  ], 如:   
1 d6 @6 P7 R+ k) Q2 m* ~  l> seq(ithprime(i),i=1..20);! F+ M; I- Z. z; J; ~# |

- A* h6 ^* G2 C+ [0 Z> %[6],%[17];
% O8 R9 W" K% V6 L$ i
  F4 }6 _& H+ `4.2.2 列表/ W+ X! R7 ^4 t+ I# p# i" B3 n7 ?
列表(list), 就是把对象(元素)放在一起的一种数据结构, 一般地, 用方括号[  ]表示列表. 如下例:   
/ T% H0 ^9 `! E. {# w> l:=[x,1,1-z,x];9 c  W5 S1 z* V0 o3 \6 O/ J6 f5 z
) V* w% k+ ]5 A7 s: I1 t
> whattype(%);) F0 ]3 h9 p1 O4 K# A9 j
& J8 ^4 U- J  m# d/ b- U
空列表定义为[ ].
/ T% i, L3 i2 @. _但下述两个列表是不一样的, 因为对于列表而言, 次序是重要的:   * `% I  y2 f: u* \) a0 F! _
> L:=[1,2,3,4];
3 W3 ?6 T6 j1 b. u, l 0 U) c$ q+ r: B8 M3 R
> M:=[2,3,4,1];4 l, @. o6 _1 A  W8 `. n2 p' J
! E( b- o" }9 [9 d* V
4.2.3 集合
, j: c+ X6 L2 _% E( q( z  J: o集合(set)也是把对象(元素)放在一起的数据结构, 与列表不同的是集合中不可以有相同的元素(如果有, Maple也会自动将其当作同一个元素), 另外, 集合中的元素不管次序. 一般地, 用花括号表示集合. 8 c7 k  G5 z, Q9 Y2 d
> s:={x,1,1-z,x};6 Z5 y; W0 S# T7 v: k9 u
( ?+ K, D1 ]* |& h% g% O% _2 q) y
> whattype(%);
% v* X0 Y: g, I* L5 f. z$ H- S: l
. N! ]' C" x6 f* S1 }空集定义为{ }. ; S0 b, v/ b2 u! Y+ g" V- Q% K
函数nop返回列表或集合的元素数, 而op则可返回其第I个元素. # O; \) }1 Y1 X" z! J
> op(1,s);* f" [5 ^# K2 t0 z

! E$ X/ s; z; I! B# ]" ?> s[1];
8 P+ E" B# k8 {, M1 g1 @0 Y
$ l9 F. G- ~) r: P  k> op(1..3,s);
. ~, D3 {. A. i" A5 [* `: ^ / W$ _& R" A! q4 `6 y0 I8 K
> s[1..3];
4 F# Q7 ?4 V6 N$ o# o+ k 9 c2 ^0 Z1 H, Z" w
函数member可以判定元素是否属于一个列表或集合, 如果属于, 返回true, 否则返回false. , p" B7 z: O( i% q" K& j" K
> member(1+x,s);1 ]. Z0 f) H3 C& S7 V
/ F4 M: G, D" y- g* Y% Y5 u
可以通过下述方法在列表中增减元素:   
* ]1 M: j& U& v6 j) M* u> t:=[op(s),x];' Q* m+ ~7 J( d# b6 |$ K( M
  ?  g  {1 \' ]2 ~9 M
> u:=[s[1..5],s[7..nops(s)]];
/ l& @7 {- w) X" }. F1 w ( U' V7 }7 d) k1 A
Maple中集合的基本运算有交(intersect)、并(union)、差(minus):   1 m% ~" R: G) z& a3 a& j# ~2 X
> A:={seq(i^3,i=1..10)};B:={seq(i^2,i=1..10)};; @+ T: `+ f, b' g& ]

! J( e8 ?5 r* A5 Z) j: k9 {9 ] 5 L: u: g, o4 H" k6 {* P9 }: J
> A intersect B; 5 c; ?6 x9 |# A: Y! X. C- F

3 e! ^' g3 @/ E> A union B; 0 a  M& f& j* a$ o8 Q
0 g9 B& p/ t$ n  T0 M
> A minus B;
! B) l. b- R, x$ |8 `+ ~3 c2 O + Y, k1 ?% ~8 L5 t: }9 R
4.3 数组和表/ q, ]* J* }* Q+ X0 ~
在Maple中, 数组(array)由命令array产生, 其下标变量(index)可以自由指定. 下标由1开始的一维数组称为向量(vector), 二维以上的数组称为矩阵(matrix). 数组的元素按顺序排列, 任意存取一数组的元素要比列表或序列快的多. 区分一个数据结构是数组还是列表要用“type”命令.
( B5 ^# q+ A3 a    表(table)在建立时使用圆括号, 变量能对一个表赋值, 但一个在存取在算子中的未赋值变量会被自动地假定是表, 表的索引可以成为任意Maple表达式. 表中元素的次序不是固定的. 0 i$ S1 B9 @3 T) K; \( Z
> A:=array(1..4);
# V) f; [8 Y( J: o- z2 v: O% J ! T7 z, m( H$ ^% {! O' V
> for i from 1 to 4 do A[i]:=i: od:
5 k1 P( _6 ^7 H0 z# c0 h6 ^> eval(A);
- [7 Q- F$ h0 R
3 p/ G9 }; P* p# z9 E> type(A,array);
1 f. r1 t; m# }7 `
+ i7 a! x+ o+ p$ a: S% _" e) W> type(A,list);5 q0 r- ^# R0 P0 K7 n5 o
% S) i- ^3 ], D9 F. y* l
> T:=table();
) t6 f% x. G. j5 p8 a! `3 C 8 Y+ k" f9 l6 |1 T! C* G
> T[1]:= 1;: v- f# s7 y0 Q" j5 K

4 D( `8 ^9 T7 b6 R4 `' N. L> T[5]:= 5;
5 \  \" s+ j+ k+ O# d
- f& x; y  z5 d; f> T[3]:= 3;
: G4 p* ?% j7 b+ e1 ~1 W& g
! W+ ]- ?) D% l> T[sam]:=sally;9 i! M7 P  E$ r' {% |

8 p2 G2 Q: c: h5 `( T2 P% ^> T[Pi]:=exp(1);0 N! E1 P/ s4 T

$ g* V0 \, z: y3 w1 d! {> x:='x';
) t7 h3 K* c- R6 k% c
! ~9 I) |3 J+ W* g; `> T[(1+x+x^3)*sin(x)] := 0;/ N& z3 A6 ^" I7 P: {4 U' Q2 n

9 Y% a7 p5 C) t; L* o' w> eval(T);! ]. r6 l$ |: _; J
. ]* j0 ?0 `) o# F( `
> T[3]:='T[3]';
+ }3 t" V& O. t0 E ; O1 _& q$ J( X; a
> eval(T);
% x* y! T/ s5 J$ d
! l  e; s( T6 {) Q! j$ V- C4.4 其他数据结构
) F& Q- a: E. o串在Maple中是很重要的, 他们主要用于取名字和显示信息. 一个Maple的串可以作为变量名, 它们中的大多数是简单的、不需要加引号的串, 但是如果变量名中包含/. 例如“diff/T”则必须把变量名用引号括起来. $ v/ c# Z9 T! F! r
索引名是像Database[1,2,drawer]或A[3]这样的对象, 在使用索引前不需要直接建立表, 如果不得不做, Maple会自动建立表. 索引名通常被用于矩阵和向量. 为了保证Maple建立表的正确次序, 建议在赋值前直接建立.
: P* F* Q4 q# ~: j> x:=T[3];
- U1 x" }& P. r) v" y! n2 p, S$ w2 P * k8 _& y9 j) u9 a, w* o4 C6 ?
> eval(T);3 i/ z/ D9 Z- a1 M8 r, R0 B
8 w+ @, D6 o% T7 S& i; m
> T[5]:=y;/ V4 K2 B6 w6 m: a% r( [
  u3 U4 ?' a- D% I/ g8 i
> eval(T);
0 E; M7 l+ G6 O & }9 N; S, r6 c* r) G# V9 t! I2 K
由此可见, Maple并不直接建立T的表, 直到给T[5]赋了值.     
# r( L% H" b, k% k数值数据结构(整数、分数、有理数、浮点数、硬件浮点数和复数等)在它们的使用中是大量透明的. 浮点数是有传染性的, 这意味着如果数值结构中有一个是浮点数, 则整个结构自动转换为浮点数. ! t" j0 \, C" H* C
4.5 数据类型转换和合并
2 W( u3 U: z4 q* ^, F6 P/ Yconvert是一个功能强大的类型转换函数, 它可以实现列表和数组的类型转换:   ' A( I1 m' H2 D* W6 A
> L:=[1,2,3,4];. r' ?9 H; b3 |7 G3 h9 t; P1 }
. {# ]2 Z5 b) t& }
> type(L,list);! x" @4 q' T% C

* S: l6 V# Z" _4 N, P3 Q+ c( n1 Z: _) ]> A:=convert(L,array);
. |+ a6 V/ f% a! g( t ) Y# _  R1 Z% t% [/ Z; b
> type(A,list);
  m  s' _# q* o( i, s! o ) V7 v# O2 }" r+ ]; l% _2 F
> type(A,array);+ ^7 c. U: f0 l0 Q

' s" @) a* }1 z( J1 {另一个有用的函数zip则可把两个列表或向量合并:   
6 R/ f3 Q& W% H" w: N>L:=[seq(i,i=1..10)];
. s4 @6 g+ j* S9 r- u   _; {7 c+ U" h7 N9 G1 F1 e4 W
> Sqr:=(x)->x^2;
$ _5 S( E" z7 ~7 H0 j8 q  t
( a2 X8 z1 W+ C> M:=map(sqr,L);
; v  B* ~$ y4 q1 F$ }& [
" `' \4 z# j  e0 N3 F. X> LM:=zip((x,y)->[x,y],L,M);
8 ?* j9 O1 @5 G. G; t2 _" V% }
; m$ w$ ^% l5 Y* g% G9 i> map(op,LM);
* Q" E; U# v/ L: d7 y
0 b2 T" l2 o- M! p$ X1 q* }5 Maple高级输入与输出操作
" K: ~/ Q$ y: y& Z' T4 P3 S- wMaple提供了良好的接口来编辑与计算数学式. 许多时候, 我们可能需要把Maple的运算结果输出到一个文件中, 或者在一个文本编辑器里先编好一个较大的Maple程序, 再将它加载到Maple的环境里.   N7 K. D: Z/ B/ P7 w
5.1 写入文件& X: }) j5 d( f/ ]( A
5.1.1 将数值数据写入到一个文件8 b. T1 @, c. y. `
如果Maple的计算结果是一长串的数值串行或数组, 而想把它写到一个文件时, 用writedata命令. / x! S$ @$ x6 z2 L. G
若Maple的计算结果data为集合、矩阵、列表、向量等形式时, 将其写入名为filename的文件时命令格式为: writedata("filename", data);
' _- ?" ~' y. n> with(linalg):
- A2 V" J, y: R> M:=matrix(3,3,[1,2,3,4,5,6,7,8,9]);
' u4 y/ g, Q) S+ p3 v , _- _3 j( _4 {
> writedata("e:\\filename.txt",M);7 [; M- Q0 j) O, U" D5 {8 ]' {
而将结果附加在一个已存在的文件后时,使用命令: writedata[APPEND]("filename", data);+ d5 b+ M! r2 ]) P$ \/ g
> W:=matrix(2,2,[1,2,3,4]);" B4 D6 z& e1 m& o8 [7 F
7 v, k  t. z2 w( t7 s/ @0 ~# N4 }% i* l
> writedata[APPEND]("e:\\filename.txt",W);
, |' U; x. Q( {2 M2 q( P- U需要注意的是, 这里的APPEND是必需的, 否则W结果将会覆盖M结果.
$ U) Q: ^( g( }. q4 y5 q( n. F5 R另外, 若想将结果显示在屏幕上时, 用命令: writedata('terminal', data);- k+ K$ @0 b5 l
> writedata[APPEND]("e:\\filename.txt",W);
% p; i' g2 D% x7 ]0 B> writedata('terminal',M);9 `5 g: j2 b# Y( p# N
1                   2                   3           # r3 t  [' \+ g
4                   5                   6           
9 v9 B# W9 N9 {" j  p$ e7                   8                   9   
& W+ c6 b! {& ~7 z. R. U6 B5.1.2 将Maple语句写入一个文件
+ E# M8 ~2 J  Z9 ^( J5 j0 ^如果所要写入文件的是表达式、函数的定义或者是一个完整的程序, 则使用命令save, 写入一个或多个语句的命令格式分别如下:
2 K; J+ z1 ^$ @9 o5 X% osave name, "filename";" x, m/ n% H6 `
save name1, name2, …, "filename";
  z' l! c3 z, _6 O& D8 q& V若filename的扩展名为.m, 则Maple会以内定的格式储存, 若扩展名为.txt, 则以纯文本文件储存. 以内定的格式储存的文件作纯文本编辑器无法读取, 但在大多数情况下, 它会比纯文本文件的加载速度更快, 且文件容量小.
7 H, q) |. m/ u6 R& U> myfunc:=(k,n)->sum(x^k/k!,x=1..n);
% `- u7 Q2 \# _( }: q. X$ i) p
0 h2 h7 Z5 h- R% @& |1 O+ R> myresult:=myfunc(6,8);6 v5 e: F  c2 @) H% |

5 U! W9 V+ [( I/ j> save myfunc,myresult,"e:\\test.m";
' O  R5 f) B5 g' a" f( P5 X调用已存m文件用命令read. 试看下述实验:* U" r; J( N; s3 A$ D
> restart:
+ L+ f) J+ O# y, w> myfunc(6,8);* x! e- E8 U2 O% y
& B4 u) m) N7 Z6 }/ ?! K3 N
> read "e:\\test.m";1 k: U: t( s( X% P7 e# s5 j  q) c
> myfunc(6,8);. W1 c  D. K/ a. O# ^  m; l

: e% Z; S/ Z, h- Y& g6 x+ X( P> myresult;/ N& g% I' P/ N9 F# D8 H  C

0 Z/ ^7 u' L9 W' }9 ]    而存为txt文件时则将整个语句存为一个文件:
, o# |. e& e8 ^( r/ ~6 Y, u6 S> save myfunc,myresult,"e:\\test.txt";+ A$ C. j  Y) s
> restart: read"e:\\test.txt";
9 U8 n  ~  i( J5 |$ F
% Q! c: I/ I) p" V5 \9 s3 b, ~ 2 O4 ]; J$ n' b9 x
5.2 读取文件$ a  o- k: W9 f4 g' O9 V  a# m
在Maple里最常用的两个读取文件的命令, 一个是读取数值数据, 另一个是是读取Maple的指令.. n) A. r1 o" h/ l
5.2.1 读取数值数据
* c/ c; W' [- N# c9 ~+ {3 Q& S如果想把大量的数据导入Maple里进行进一步的运算或者要运用大量的实验数据在Maple环境绘图时, 可以用readdata( )命令完成.
: }! p  R( R" r, ?从filename文件里读取n行数据时使用命令: readdata("filename",n);8 @9 O3 _; b) Q: M) |2 u
以指定的格式读取数据时使用命令: readdata("filename",[tyep1,type2,…]);! B; H' C$ @* d4 p. ]  `! D
> readdata("e:\\filename.txt",3);
2 w+ ~! F2 y% j5 x0 e. n
* h, Q. V" Z, P8 D4 I0 ]) c    读取filename的前三列, 第一列为整数形式, 第二、三列为浮点数形式:
: \6 N$ |& r2 o0 X9 R; E> readdata("e:\\filename.txt",[integer,float,float]);( F, o. j5 A% p: ?$ h8 Y+ h( K$ `  q

( S9 k2 p3 `0 q. c下面再看一个运用大量的实验数据在Maple环境绘图的实验:
' B' t8 z. }4 i0 r8 K( ]> mypts:=[seq([x/1000,cos(x^2/100000)],x=1..1000)]:
6 Q  c8 ~# C/ X> writedata("e:\\data.txt",evalf(mypts));
2 I4 X# @# G2 b, y& G> dots:=readdata("e:\\data.txt",100):- c, ]5 V+ E6 b4 Z" n) `
> nops(dots);- t7 \3 o  \. o
: J: O$ R4 O) t/ t6 F, c
> dots[1..4];- d/ I7 z4 i) n$ b+ g" }3 Y! V
( I, E. o+ G- R$ O
> plot(dots,style=line);
# I, k( l( m% d8 r
" d' I  l1 M6 S0 C0 q0 E# V) g6 w5.2.2 读取Maple的指令
3 e; v  |9 V* `9 Y+ o: J% o在编写程序时, 在普通软件中先编好程序再将其读入Maple环境中常常比直接在Maple中编写更为方便. 如果要将程序代码或Maple指令加载用read命令:
( f6 W4 M5 O# h+ ]read "filename";
0 Z& x' n1 [: m; g- A如下例:3 ^- l8 K: k" @, M( O' O9 k0 M# ^
> reatart:
; h7 c) i3 r% q( }. s> myfunc:=(a::list)->add(i,i=a);
+ H0 i+ |5 R: T2 |: _6 m 4 h  l4 C+ P1 I& ?$ I4 J# e( A! K
> avg:=(a::list)->myfunc(a)/nops(a);$ t9 l/ r9 K# ^3 J! n2 N( y

5 T0 Y! L0 ~) F) i. D. ]> save myfunc,avg,"e:\\function.m";/ m* o! D9 A3 q  y5 ]; k
> restart:! r% q8 O4 g* k, v3 |) f
> read "e:\\function.m";  y" M+ _9 w- H3 _. ~
> myfunc([1,2,3,4,5,6,7,8,9]);
( D; r5 a$ q" `9 `' f 4 K  o$ e) o, K5 t  K5 I
> avg([1,2,3,4,5,6,7,8,9]);3 n, N( t8 `; t' g, L- |7 F& t
/ L) F9 Q: H, B" j
5.3 与其它程序语言的连接9 A( E/ F. ^" O1 H) w6 k- y
5.3.1 转换成FORTRAN或C语言7 u" N2 U) n2 l1 }- a6 s' _
调用codegen程序包中的fortran命令可以把Maple的结果转换成FORTRAN语言:: |2 ^6 A+ E3 w) c
> with(codegen,fortran):
- Y) r8 C- y2 Cf:= 1-2*x+3*x^2-2*x^3+x^4;  [2 g+ J) T7 Z% y
+ Q. j4 e: f" |- d
> fortran(%);( G1 ]- C9 r0 C9 Y4 E
      t0 = 1-2*x+3*x**2-2*x**3+x**4
, e% a. e8 o: c) k: Y( `5 L( Y# U > fortran(f,optimized);( y* F4 h. w  O( L+ b3 E- r
      t2 = x**2& a5 o) m6 ]0 N0 w# z1 X, z6 D
      t6 = t2**2
" \+ r5 L0 @9 Q! s$ U( v) x      t7 = 1-2*x+3*t2-2*t2*x+t6- z4 Q, Q1 K! c8 J$ N9 k
> fortran(convert(f,horner,x));
7 R0 I9 @% E9 e" e/ a: T! [1 p8 W, Z# w      t0 = 1+(-2+(3+(-2+x)*x)*x)*x4 C3 q  o* G1 q3 k( x$ R9 o( I% M' @
而codegen程序包中的C命令可以把Maple结果转换成C语言格式:
/ H3 y& l$ L3 R# \. H$ l> with(codegen,C):
; \# S3 F+ v3 U" N# Rf:=1-x/2+3*x^2-x^3+x^4;8 K) H% Q7 G) l; [' C8 Q- L

; y) C% q$ b/ I( |7 c0 c> C(f);( y3 E2 o# @! d1 v4 [
      t0 = 1.0-x/2.0+3.0*x*x-x*x*x+x*x*x*x;
& t+ N( U9 H0 T) x  q; f> C(f,optimized);9 N+ S+ Z# G+ ^+ C% r8 b: o' Z
      t2 = x*x;: h0 P( B8 G2 K, f
      t5 = t2*t2;
$ H' l  s+ S; c: L* b9 B# o      t6 = 1.0-x/2.0+3.0*t2-t2*x+t5;
3 L) X& B. L1 u4 }( f% y2 f8 L* _5 Poptimized命令表示要对转换的表达式进行优化, 如果不加此可选参数, 则直接对表达式进行一一对应的转换., |9 w- h+ h9 G) G, n
5.3.2 生成LATEX
% p3 L) ?; T2 p+ u  `$ c8 e% R1 kMaple可以把它的表达式转换成LATEX, 使用latex命令即可:& k* {" v( U0 S4 g) j6 U' ^3 C( c
> latex(x^2+y^2=z^2);. H# B/ ~/ A" |/ s: d8 E
{x}^{2}+{y}^{2}={z}^{2}: P0 i; Z6 t# b# b9 R! ?
    还可以将转换结果存为一个文件(LatexFile):
; ^) X. F+ E: N- e> latex(x^2 + y^2 = z^2, LatexFile);
8 |% `' i3 x( Y! v7 F    再如下例:. X: ^: z- k0 V: w9 z/ f; A
> latex(Int(1/(x^2+1),x)=int(1/(x^2+1),x));
( D: k2 L$ Z& D\int \! \left( {x}^{2}+1 \right) ^{-1}{dx}=\arctan\left( x \right)
9 O" J2 t6 z4 x( S% a. U" U! g5 j; T1 ^
zan
已有 1 人评分体力 收起 理由
darker50 + 2 用word发不是很好吗?呵呵!

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

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

0

主题

13

听众

27

积分

升级  23.16%

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

    [LV.3]偶尔看看II

    社区QQ达人

    群组国赛讨论

    回复

    使用道具 举报

    0

    主题

    4

    听众

    181

    积分

    升级  40.5%

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

    [LV.5]常住居民I

    群组学术交流A

    群组学术交流B

    回复

    使用道具 举报

    0

    主题

    2

    听众

    19

    积分

    升级  14.74%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    46

    主题

    3

    听众

    1967

    积分

    升级  96.7%

  • TA的每日心情

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

    [LV.2]偶尔看看I

    社区QQ达人 新人进步奖

    群组数学建模

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

    群组LINGO

    听说女人如衣服,兄弟如手足。回想起来,我竟然七手八脚的裸奔了20年!
    & p5 J! \8 m1 L& `0 q0 p) Z  Y/ _
    ' P! ]6 S  b2 Y. P7 v
    + F% {6 j) m% k8 A& j; c! u
    回复

    使用道具 举报

    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

    回复

    使用道具 举报

    darker50        

    107

    主题

    45

    听众

    1万

    积分

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

    [LV.5]常住居民I

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

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

    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2025-8-4 03:22 , Processed in 0.784986 second(s), 99 queries .

    回顶部