QQ登录

只需要一步,快速开始

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

maple基础

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

1

主题

5

听众

4

积分

升级  80%

该用户从未签到

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

8 r1 B) ?3 P" d; k第一章  Maple基础$ \9 U$ X! y+ K# n9 u- u

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

" d+ x0 u5 [. J) K5 O$ y  P2 b
4 e' ^" P  O5 o# A) L* T* f   Z3 r; W0 A9 x% m4 S1 s+ F* c" n
: S. v% }3 z- U* T/ m" j4 G

. y5 O; E1 A7 X# N  S' V' ] # J0 k4 a% H  L' [

8 _4 X+ c9 W9 [8 z+ F7 A! l 3 O, `, g& Y+ _2 a. q! |, `( m
4 x+ \5 s1 k" |2 @
( {9 N8 w: F" f: y
alpha        beta        gamma        delta        epsilon        zeta        eta        theta        iota        kappa        lambda        mu5 X; G! V9 N7 N3 l$ G" ^0 E

: m) j; i& y2 V2 m8 I' I) a7 v
- e5 O" p" e- M3 {2 P* j" E
# J% I5 o0 T8 ]& N 4 N: y1 k4 \1 V+ |3 N6 e

( t( i- U- s" t( `# ]: ?
$ o5 y9 p9 `2 ^; K. q7 ~ ; a, y) z' M. f8 U. y  ~
5 y2 y# @7 y  n

( w9 ~0 d) ]' X) s7 K8 I, M
4 o" {+ ~, K" ]- h* F
2 F2 g6 t& o, M: F
5 H& [/ j! v, Y; B) f
5 x' F3 ^6 D' W# \7 Tnu        xi        omicron        pi        rho        sigma        tau        upsilon        phi        chi        psi        omega
4 ~* b$ t; i" @" m  s1 l( W有时候为了美观或特殊需要,可以采用Maple中的函数或程序设计方式控制其输出方式,如下例:
# o/ N5 m3 U' Q. w> for i to 10 do
- ^# T8 m2 [4 D: J4 a, Sprintf("i=%+2d and i^(1/2)=%+6.3f", i, eval(sqrt(i)));
( S& I6 Y- `" ood;; z4 U& f+ @: G3 }. G
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.1629 A5 ^$ E- x3 E* {) L2 J& ]
+2d的含义是带符号的十进位整数,域宽为2. 显然,这种输出方式不是我们想要的,为了得到更美观的输出效果,在语句中加入换行控制符“\n”即可:# x' }0 c, @; v& v
> for i to 10 do 7 r9 n7 f% x9 B7 V1 @: ^; m
printf("i=%+2d and i^(1/2)=%+6.3f\n", i, eval(sqrt(i)));' m; _. o! d/ L( e& Z) l
od;0 ~9 }. G4 D5 A8 K6 P
i=+1 and i^(1/2)=+1.000
6 T+ L9 f! D, B+ M2 m! z2 O' ti=+2 and i^(1/2)=+1.414
$ h* C$ d0 q' P" |3 d/ w2 Z; C) Pi=+3 and i^(1/2)=+1.7327 G; V2 l# I; H& d% \2 R2 X
i=+4 and i^(1/2)=+2.000( y0 L+ ~) c0 |- o
i=+5 and i^(1/2)=+2.236/ U6 t/ m  I, g
i=+6 and i^(1/2)=+2.449, h( n4 \" S3 p0 r! I3 t- }
i=+7 and i^(1/2)=+2.646) F# Z  H5 U8 u
i=+8 and i^(1/2)=+2.828
4 x+ A( o2 }8 g8 c! _8 K6 i( J" P2 n, @i=+9 and i^(1/2)=+3.000( t( c9 ^( W. p: ?1 U; ?/ A" |6 d7 {  A
i=+10 and i^(1/2)=+3.162- R5 C5 X8 G8 k/ `" N# f( I
再看下例:将输入的两个数字用特殊形式打印:. A; q: q3 @* s& I- \
> niceP:=proc(x,y)6 a6 H3 j1 p5 R7 p+ r$ ~
printf("value of x=%6.4f, value of y=%6.4f",x,y);
- y/ C" }4 m2 T2 O1 D& h1 w" \end proc;! O( [" @9 ]" s* F7 Y  t; N5 r
1 Q9 H2 r% I8 W3 N5 r* U
> niceP(2.4,2002.204);) D! B" G+ b3 [! N( ^) F
value of x=2.4000, value of y=2002.2040
+ D# K* b/ G' E& w5 N2 ~7 Z1.4 Maple联机帮助
* h5 W, |. h0 o+ F/ m" ^- ?学会寻求联机帮助是掌握一个软件的钥匙. Maple有一个非常好的联机帮助系统, 它包含了90%以上命令的使用说明. 要了解Maple的功能可用菜单帮助“Help”, 它给出Maple内容的浏览表, 这是一种树结构的目录表, 跟有…的词条说明其后还有子目录, 点击这样的词条后子目录就会出现(也可以用Tab键和up, down选定). 可以从底栏中看到函数命令全称, 例如, 我们选graphics…, 出现该条的子目录, 从中选2D…, 再选plot就可得到作函数图象的命令plot的完整帮助信息. 一般帮助信息都有实例, 我们可以将实例中的命令部分拷贝到作业面进行计算、演示, 由此可了解该命令的作用.
8 u/ N9 V1 m$ j" S+ q  @在使用过程中, 如果对一个命令把握不准, 可用键盘命令对某个命令进行查询. 例如, 在命令区输入命令“?plot”(或help(plot);), 然后回车将给出plot命令的帮助信息, 或者将鼠标放在选定的要查询的命令的任何位置再点击菜单中的“Help”即可.
/ U# r+ ]2 h" w4 r# J2  Maple的基本运算
' S; C; S6 ^( V, u# l+ L; O, D2.1 数值计算问题) e' R% @% A' D4 J* ^- k
算术是数学中最古老、最基础和最初等的一个分支, 它研究数的性质及其运算, 主要包括自然数、分数、小数的性质以及他们的加、减、乘、除四则运算. 在应用Maple做算术运算时, 只需将Maple当作一个“计算器”使用, 所不同的是命令结束时需加“;”或“:”.
6 M) ?; p6 @, A( ?. x0 u在Maple中, 主要的算术运算符有“+”(加)、“–”(减)、“*”(乘)、“/”(除)以及“^”(乘方或幂,或记为**), 算术运算符与数字或字母一起组成任意表达式, 但其中“+”、“*”是最基本的运算, 其余运算均可归诸于求和或乘积形式. 算述表达式运算的次序为: 从左到右, 圆括号最先, 幂运算优先, 其次是乘除,最后是加减. 值得注意的是, “^”的表达式只能有两个操作数, 换言之,  是错误的, 而“+”或“*”的任意表达式可以有两个或者两个以上的操作数.
) I, J& ~+ _1 H  Z/ }, [9 H& p# Z/ @Maple有能力精确计算任意位的整数、有理数或者实数、复数的四则运算, 以及模算术、硬件浮点数和任意精度的浮点数甚至于矩阵的计算等等. 总之, Maple可以进行任意数值计算. 6 X4 U; @1 u/ D: d* R
但是, 任何软件或程序毕竟只是人们进行科学研究的一种必要的辅助, 即便它有很多优点, 但也有它的局限性, 为了客观地认识数学软件、认识Maple, 下面通过两个简单例子予以说明. 6 M6 h3 _0 t! F$ D, l' I: D* D* [# D" l
第一个简单的数值计算实例想说明Maple数值计算的答案的正确性:   : W9 B- ?5 Y0 S8 a0 ^: i
> 3!!!;( F$ Y  R% J4 u5 E
26012189435657951002049032270810436111915218750169457857275418378508356311569473822406785779581304570826199205758922472595366415651620520158737919845877408325291052446903888118841237643411919510455053466586162432719401971139098455367272785370993456298555867193697740700037004307837589974206767840169672078462806292290321071616698672605489884455142571939854994489395944960640451323621402659861930732493697704776060676806701764916694030348199618814556251955925669188308255149429475965372748456246288242345265977897377408964665539924359287862125159674832209760295056966999272846705637471375330192483135870761254126834158601294475660114554207495899525635430682886346310849656506827715529962567908452357025521862223581300167008345234432368219357931847019565107297818043541738905607274280485839959197290217266122912984205160675790362323376994539641914751755675576953922338030568253085999774416757843528159134613403946049012695420288383471013637338244845066600933484844407119312925376946573543373757247722301815340326471775319845373414786743270484579837866187032574059389242157096959946305575210632032634932092207383209233563099232675044017017605720260108292880423356066430898887102973807975780130560495763428386830571906622052911748225105366977566030295740433879834715185526028053338663571391010463364197690973974322859942198370469791099563033896046758898657957111765666700391567481531159439800436253993997312030664906013253113047190288984918562037666691644687911252491937544258458950003115616829743046411425380748972817233759553806617198014046779356147936352662656833395097600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003 g# f+ _# o, a
上述运算结果在IBM PC机(1G, 128M)上计算只需要0.01秒, 得到如此复杂的结果(1747位), 一个自然的问题是: 答案正确吗?
1 z6 l' q3 H; \" v为了回答这个问题, 我们借助于数值分析方法, 由Stiring公式2 s: J$ k1 K6 v2 G+ |0 r0 A9 m2 e

! @$ z; O6 i/ q% F- Z. C可得:  , 前三位数字与Maple输出结果相同, 且两者结果均为1747位. 另外, 在720!的计算中, 5的因子的个数为:   9 S9 \# o1 f3 w$ i1 w1 m" V
6 L2 A4 N7 o& u% {5 J! h% X( V
这些5与足够多的2相乘将得到178个0, 而Maple的输出结果中最后178位数为零. 由此, 可以相信Maple结果的正确性.
) r+ {2 ~9 f8 u( ~另一个例子则想说明Maple计算的局限性:   # [6 W9 _9 t' |% h* x
  ; C, @3 s' R3 w3 T0 E5 M' F) I
Maple在处理问题时, 为了避免失根, 从不求算术式的近似值, 分数则化简为既约分数. 因此, 在Maple中很容易得到:   
) m3 `  V/ ]( F6 |' h
+ w0 z% F' F* n2 D  ~& l! W/ T显然这是错误的. 这一点可以从代数的角度予以分析. + E, ~) b9 r3 ?5 J" g  P' h. l
不妨设 , 则 , 即 , 显然 有3个结果, -2是其实数结果.
4 f  F. y/ \/ o另一方面, 设 , 则 , 即:
# e  v& p- b" B( w* k
& ^/ t  C, H: l4 m% Y$ a  \显然 有6个结果, -2、2是其实数结果. 7 h% `7 N. Z( F
这个简单的例子说明了Maple在数值计算方面绝对不是万能的, 其计算结果也不是完全正确的, 但是, 通过更多的实验可以发现: Maple只可能丢失部分结果, 而不会增加或很少给出完全错误的结果(如上例中Maple的浮点数结果皆为 ). 这一点提醒我们, 在利用Maple或其他任何数学软件或应用程序进行科学计算时, 必须运用相关数学基础知识校验结果的正确性.
# t$ Q' h0 ]! [6 M5 w  o尽管Maple存在缺陷(实际上, 任何一个数学软件或程序都存在缺陷), 但无数的事实说明Maple仍然不失为一个具有强大科学计算功能的计算机代数系统. 事实上, Maple同其他数学软件或程序一样只是科学计算的一个辅助工具, 数学基础才是数学科学中最重要的.
- @5 l% \0 l- t2.1.1 有理数运算$ z- _. B" p; J3 g- a1 O3 _
作为一个符号代数系统, Maple可以绝对避免算术运算的舍入误差. 与计算器不同, Maple从来不自作主张把算术式近似成浮点数, 而只是把两个有公因数的整数的商作化简处理. 如果要求出两个整数运算的近似值时, 只需在任意一个整数后加“.”(或“.0”), 或者利用“evalf”命令把表达式转换成浮点形式, 默认浮点数位是10 (即: Digits:=10, 据此可任意改变浮点数位, 如Digits:=20). 0 `" f' U- N  d7 o
> 12!+(7*8^2)-12345/125;% c4 n2 D0 |  @6 V. k' s* u; {

; I7 x% j) E7 U6 Z> 123456789/987654321;0 o$ g. H1 |2 V9 |' B
1 A# D- y* R; f) ^0 u
> evalf(%);
( Y8 p5 r$ o. h" k; M+ j% H! p. l
7 w% [0 p& E. o; \2 C& Z> 10!; 100*100+1000+10+1; (100+100)*100-9;
" q3 \. g" r5 B. _ " y) l! z- s& x$ H, [7 W
- W9 Q, C' E, p$ X6 i
: g, A" C: E0 r$ C
> big_number:=3^(3^3);
' S) {& h0 F6 n3 \+ N% r1 n # Y& }9 D4 d1 O, A  O5 }7 b
> length(%);
/ Z$ H1 d$ u4 s; q3 y2 f6 W
9 X* V0 N5 H$ ?0 s8 G: N+ u上述实验中使用了一个变量“big_number”并用“:=”对其赋值, 与Pascal语言一样为一个变量赋值用的是“:=”. 而另一个函数“length”作用在整数上时是整数的十进制位数即数字的长度. “%”是一个非常有用的简写形式, 表示最后一次执行结果, 在本例中是上一行输出结果. 再看下面数值计算例子:   
/ w8 F! P0 ]5 B+ W5 m    1)整数的余(irem)/商(iquo)
* V8 q0 g+ \- g$ D$ R命令格式:   , U; a% |  \. R) o1 u' J. B! P
irem(m,n);        #求m除以n的余数
* v* }8 s7 m) u( g4 Direm(m,n,'q');    #求m除以n的余数, 并将商赋给q; W8 ^# c- s8 W1 n8 u3 H$ o
iquo(m,n);        #求m除以n的商数2 |2 I. h, Q8 a- P0 A
iquo(m,n,'r');    #求m除以n的商数, 并将余数赋给r
2 c) w$ g, A/ ?; h' L其中, m, n是整数或整数函数, 也可以是代数值, 此时, irem保留为未求值.
. }. ?/ O! j. Q! g1 {. ~$ n9 `( R> irem(2002,101,'q'); # 求2002除以101的余数, 将商赋给q2 ?; l% L! p+ p
: K! f- g& A( v# D' s4 \& r
> q; #显示q
! g. @' ^, Q& K& m6 _ , b2 ?3 Q1 h" }! S6 a6 h
> iquo(2002,101,'r'); # 求2002除以101的商, 将余数赋给r
1 q% Y4 @  W) r3 ~
$ a  M2 k/ I. k6 w, \: ]# T> r; #显示r& A4 W  |0 x) |8 K7 i

  _: P, F. z: R  _/ Y> irem(x,3);  V7 y  M8 ]# N3 u- P( J  R, ?6 Q

, G' V% W- v: Z2)素数判别(isprime)
  h( N$ ?2 L* p  q, X. O素数判别一直是初等数论的一个难点, 也是整数分解问题的基础. Maple提供的isprime命令可以判定一个整数n是否为素数. 命令格式: isprime(n); , K& ~4 O! M4 R% x/ f/ A
    如果判定n可分解, 则返回false, 如果返回true, 则n“很可能”是素数.   ]3 y# \$ ~2 `) C; ], V/ S
> isprime(2^(2^4)+1);. n- p$ j; W3 \, d
0 N  t% {/ V2 S% Q
> isprime(2^(2^5)+1);3 Q( E8 J1 u. t( n* G, G
/ h0 p1 O& x+ H$ A
上述两个例子是一个有趣的数论难题。形如 的数称为Fermat数, 其中的素数称为Fermat素数, 显然, F0=3、F1=5、F2=17、F3=257、F4=65537都是素数. Fermat曾经猜想所有的Fn都是素数, 但是Euler在1732年证明了F5=641•6700417不是素数. 目前, 这仍是一个未解决的问题, 人们不知道还有没有Fermat素数, 更不知道这样的素数是否有无穷多. 6 A, B3 L1 D- ?; x
3) 确定第i个素数(ithprime)
3 ?# g; w$ g. M' P若记第1个素数为2,判断第i个素数的命令格式: ithprime(i);   
) P5 J& g& T  H1 e+ O& h' w> ithprime(2002);4 H+ A  }" y' B3 s, @" M2 b; S
4 i, b3 T% u2 _2 x
> ithprime(10000);
( Y1 b& }) z/ C) z5 ]   [6 Q# ~! m4 M1 _0 W" i
4) 确定下一个较大(nextprime)/较小(prevprime)素数
) G; }- _& n3 D, U当n为整数时,判断比n稍大或稍小的素数的命令格式为:   
9 X3 R( X. P7 K7 _9 unextprime(n);  0 \$ O6 |  q2 }' T' c
prevprime(n);
" V3 \* j8 n* p8 L) W! v5 t> nextprime(2002);
: i: q. X4 U9 V. a: Y . `1 U  ~2 f) @; }6 W! e
> prevprime(2002);, |) _' X& f  W, d7 k% x$ Y
% {, v7 c! B* T3 I
5) 一组数的最大值(max)/最小值(min)6 \* y$ w2 Z& E. u
命令格式: max(x1,x2,…,xn);   #求x1,x2,…,xn中的最大值8 X- X6 q& k9 O( d/ E
             min(x1,x2,…,xn);   #求x1,x2,…,xn中的最小值
& Q* l4 Q) p5 @> max(1/5,ln(3),9/17,-infinity);
% U, X+ a' u7 z- ?+ D
+ H4 I$ @3 Y9 N9 h> min(x+1,x+2,y);
5 Y. J. Z! B  a6 P; H) M2 q: ^
, y( ]! k4 b* o6)模运算(mod/modp/mods)7 j$ Q7 O  a" w& ^7 e1 f
命令格式:  e mod m;    # 表达式e对m的整数的模运算
: b, L% J" O, r4 qmodp(e,m);  # e对正数m的模运算( \0 y. q6 b" B+ }; ?& B- D
mods(e,m);  # e对m负对称数(即 -m)的模运算
; H  a" H/ @* u7 H( d`mod`(e,m);  # 表达式e对m的整数的模运算, 与e mod m等价/ f. w  a# r( K* V1 c5 L- `
值得注意的是, 要计算i^n mod m(其中i是一整数), 使用这种“明显的”语法是不必要的, 因为在计算模m之前, 指数要先在整数(可能导致一个非常大的整数)上计算. 更适合的是使用惰性运算符“&^”即: i &^n mod m, 此时, 指数运算将由mod运算符智能地处理. 另一方面, mod运算符的左面优先比其他运算符低, 而右面优先高于+和-, 但低于*和/. 3 D8 s7 V6 @$ I
> 2002 mod 101;! ~! ~& W, k. V; ~( e9 j
% z4 q% b9 Z8 `/ \3 _
> modp(2002,101);5 X8 ~- m$ z, K9 |/ J9 d

7 Z* a  j5 l4 `4 }1 U0 e7 `& w# `> mods(49,100);$ E% ^) i7 |# r* Y: `/ K% W
  r' ]; O2 Y# E; v
> mods(51,100);! ^; K/ d# R4 ?5 l! M% ]4 T
9 e% D& F- p/ w6 {. {$ Z% Q  x
> 2^101 mod 2002;  # 同 2 &^101 mod 2002;( R- u. M7 H2 }4 v" R  s& V: X+ q/ l- y
4 u1 t; d& ]# n$ c7 G8 W
7)随机数生成器(rand)) Q* M' v. ~7 r, B  M+ Z! s
命令格式:   ; l& w" a- Z2 b/ X+ `) [, [
rand( );    #随机返回一个12位数字的非负整数
3 u2 Y3 Y: H# E9 G8 M& prand(a..b);  #调用rand(a..b)返回一个程序, 它在调用时生成一个在范围[a, b]内的随机数
) V2 ~2 Q. _4 B, N> rand();5 X# [* @+ |* k6 a7 r  A
: ]* z( L2 ], G( w* @
> myproc:=rand(1..2002):
2 |" L* u+ z  ^> myproc();
! }9 a" D. J3 M* q4 G" E1 N ) o- a" ~0 `' ?' Y
> myproc();. V/ f  L  K9 |; G- u- S) i: m

1 D7 j+ v0 s- z    注意, rand(n)是rand(0..n-1)的简写形式., |# W; s% U" |* Z
2.1.2 复数运算# M5 O# I2 _5 d. t2 W
复数是Maple中的基本数据类型. 虚数单位i在Maple中用I表示. 在运算中, 数值类型转化成复数类型是自动的, 所有的算术运算符对复数类型均适用. 另外还可以用Re( )、Im( )、conjugate( )和argument( )等函数分别计算实数的实部、虚部、共轭复数和幅角主值等运算. 试作如下实验:   
# s/ }# a, r5 E> complex_number:=(1+2*I)*(3+4*I);
: |" {& {! X4 S' _1 [$ ^: C; \ ( ~; m- \  \1 x
> Re(%);Im(%%);conjugate(%%%);argument(complex_number);
3 G% N3 B/ j; B+ {- U; A: f2 @
+ r, G) H% X. f5 Z / F$ F. P5 t% F' k% P1 A

3 b- |5 k8 N( m7 c8 t% F5 s  N; V 3 H7 y2 B- g! z$ Y( W; h$ n  C
值得注意的是上行命令中均以“;”结束, 因此不能将命令中的2个%或3个%(最多只能用3个%)改为1个%, 因为%表示上一次输出结果, 若上行命令改为“,”结束, 则均可用1个%.
8 P, j' X" Q( Y6 w+ s3 }为了在符号表达式中进行复数运算, 可以用函数evalc( ), 函数evalc把表达式中所有的符号变量都当成实数, 也就是认为所有的复变量都写成 的形式, 其中a、b都是实变量. 另外还有一些实用命令, 分述如下:   
0 ^8 X, [! S0 p2 b- `1) 绝对值函数
+ q$ _3 B- Z7 I/ c' m5 k命令格式: abs(expr);  
* t( d. k' ]* R4 M当expr为实数时,返回其绝对值,当expr为复数时,返回复数的模.
+ H, K: K2 d( x> abs(-2002);    #常数的绝对值/ j5 Q) {' y1 O/ d
  X: ^* I; f6 ~. M% g
> abs(1+2*I);   #复数的模
2 P& Q) b0 o+ J- T
7 \5 \2 P3 x# W> abs(sqrt(3)*I*u^2*v);  #复数表达式的绝对值
( F7 d" e: P# K. X3 ], w4 E : F: L( z( n# M: j4 w
> abs(2*x-5);   #函数表达式的绝对值- ~' q5 N$ g0 @3 t. U: c
  [% A6 |$ O/ _  P8 u# p5 J+ A$ s
2)复数的幅角函数/ t" w8 z! P  }8 B4 L" t( X
命令格式:   argument(x);  #返回复数x的幅角的主值
* ?, e% ~$ d' Q1 t1 P> argument(6+11*I);
/ b+ p  R7 d; {6 M2 j9 \ ' N8 ^' T2 {+ m9 V& D2 Q
> argument(exp(4*Pi/3*I));
0 y9 d, o  H6 X# l; c  H3 d: [
. _. ?, T+ D2 ~; d! ?3)共轭复数  p+ @3 |# Z: u
命令格式:   conjugate(x);  #返回x的共轭复数
( C' E6 f) Z( \4 h> conjugate(6+8*I);
+ `% W: r6 N& ?+ e3 [. Y- b) b   A( W# ]/ \1 w$ j
> conjugate(exp(4*Pi/3*I));
. K9 P# H9 I+ _7 |2 V+ X0 _ 8 }  F+ B7 b6 x% C0 Y. L
2.1.3 数的进制转换2 [( A5 O( y1 F1 [1 U2 i
数的进制是数值运算中的一个重要问题. 而在Maple中数的进制转换非常容易, 使用convert命令即可.
" O: d  E3 Z  x5 x  b$ ]命令格式:   convert(expr, form, arg3, ...);   
( x" Y2 t, _6 W+ }其中, expr为任意表达式, form为一名称, arg3, ... 可选项.
" [; X( ?) p/ i% y+ h1 l下面对其中常用数的转换予以概述. 而convert的其它功能将在后叙章节详述.
! ?# p* M8 n( g% L) C$ F: S    1)基数之间的转换' `$ j( Y% G# q% T- z& @- ?( m& s
命令格式:   
% g0 g5 ]# |: `6 |  m, Iconvert(n, base, beta);      #将基数为10的数n转换为基数为beta的数  m8 V  L5 @, D0 f* Y
    convert(n, base, alpha, beta);#将基数为alpha的数字n转换为基数为beta的数. |0 Z% c0 b' ~  K
> convert(2003,base,7); #将10进制数2002转换为7进制数, 结果为: (5561)7  e- u  U- F1 l/ t1 ~5 _+ t# u6 F

$ b  D. |2 ?2 r3 x3 G> convert([1,6,5,5],base,7,10); #将7进制数5561转换为10进制数
7 K3 E5 t7 X& i; L" I: G/ {
( y- {8 C2 A- E! [( s> convert(2002,base,60);       #将十进制数2002转换为60进制数, 得33(分钟)22(秒)+ O* T. ~% w: I2 w% B1 Y
/ A$ I/ V* h' Z; A( g
    2)转换为二进制形式% Y/ m% _8 X, j0 W7 [" W& K* [
命令格式: convert(n, binary);
3 g4 K) Y2 c& G, j, b( T) {" K其功能是将十进制数n转换为2进制数. 值得注意的是, 数可以是正的, 也可以是负的, 或者是整数, 或者是浮点数, 是浮点数时情况较为复杂. ) E) S6 k# ?# [) j6 ^3 U
> convert(2002,binary);   0 f) B, g" T  {7 t: n2 x
8 a7 c. {$ C5 G' M0 f
> convert(-1999,binary); 6 ~& ]/ v9 T" D7 {2 }
, J: Q! t  O* d& X
> convert(1999.7,binary);
6 y/ e9 H4 ]- C- \1 n5 _( `" B
! e2 z0 J4 S1 Z; a( n5 [  p" V3)转换为十进制形式9 E, Q$ ]) R3 o; p) X
其它数值转换为十进制的命令格式为:   , Q  Z8 a- S" U4 g+ |4 d8 y& {6 \
convert(n, decimal, binary);   #将一个2进制数n转换为10进制数
! ~+ S& S0 y' G6 \  q' K    convert(n, decimal, octal);    #将一个8进制数n转换为10进制数
3 @1 d* ?1 G! @    convert(string, decimal, hex);  #将一个16进制字符串string转换为10进制数
. s9 E1 y) f9 ~' j' |- _> convert(11111010010, decimal, binary);   
1 g+ ~( g) O$ O4 q5 t6 R
, {8 y# Y2 I3 c; o1 N> convert(-1234, decimal, octal);           
. \  U) o* b- r7 H% k3 h, Y* D
; y# h3 I6 e4 f3 l1 X8 M7 s> convert("2A.C", decimal, hex);         
. Q9 D  R7 {% k& g) L/ L ' ^, A8 g' s! s$ Y4 i
4) 转换为16进制数4 H8 h1 A; e( U3 p6 L& l7 A
将自然数n转换为16进制数的命令格式为: convert(n, hex);   
! `2 F5 H0 [2 {& g4 ~> convert(2002,hex);  convert(1999,hex);- T" S0 ]9 u' ^' B
% g# `# P5 D1 Z6 x2 U$ w3 a

5 K! ]8 _' O" J$ @3 x5)转换为浮点数1 M) f, z4 |8 N; z- E4 A- ?, x1 h) U
命令格式: convert(expr, float);
, s; }9 X' F/ T) L注意, convert/float命令将任意表达式转换为精度为全局变量Digits的浮点数, 且仅是对evalf的调用.
. w" C/ h* G/ F' J3 x> convert(1999/2002,float);4 s/ {# l, J# u  r3 J
' z) J; s5 b; b5 F( n4 y
> convert(Pi,float);7 [9 e; f  ]7 C$ Z5 f' m* h* G" D
' H! Z* y: D' H  r6 L
2.2 初等数学5 p  u) L! T3 j  X
    初等数学是数学的基础之一, 也是数学中最有魅力的一部分内容. 通过下面的内容我们可以领略Maple对初等数学的驾驭能力, 也可以通过这些实验对Maple产生一些感性认识.
& o/ v0 w; H, j2.2.1 常用函数
( p* U. P" N  ]  x/ a作为一个数学工具, 基本的数学函数是必不可少的, Maple中的数学函数很多, 现例举一二如下:   
, |% J+ O# }9 ~5 f1 @6 f" u/ ~指数函数: exp
8 z& Z- M2 Q+ O4 v4 s一般对数: log[a]
$ ]$ V3 ]$ B" W/ F. B自然函数: ln5 ?2 W; X$ G( r$ |% l
常用对数: log10
2 t  [8 Z2 h( Y/ Z, x平方根: sqrt
5 e0 K# B+ `. [$ O8 x* s4 I* c% q绝对值: abs( n* ?# {% w! }. U# q" e) ^
三角函数: sin、cos、tan、sec、csc、cot
- G3 E  v0 }  c4 E/ {反三角函数: arcsin、arccos、arctan、arcsec、arccsc、arccot
( [, ^- ^4 N. j2 k; p双曲函数: sinh、cosh、tanh、sech、csch、coth
9 y& y" H% D$ ?; o1 M反双曲函数: arcsinh、arccosh、arctanh、arcsech、arccsch、arccoth3 r& ]' ~: r. }8 b9 k; ~3 P& G
贝赛尔函数: BesselI、BesselJ、BesselK、BesselY
; L8 H" e; f3 a% Q$ B( BGamma函数: GAMMA7 d& S( n/ q! E7 ^: }: @0 h! L. g+ d
误差函数: erf; d- C0 |8 F& n% c3 Y. h( W
函数是数学研究与应用的基础之一, 现通过一些实验说明Maple中的函数的用法及功能.
5 y) a2 O% k1 U2 k$ e/ G1) 确定乘积和不确定乘积  ~6 k% `- c7 m
命令格式: product(f,k);  
" c4 L! X: ]/ p. Xproduct(f,k=m..n);  
) r# U% U) e$ n/ P% ?product(f,k=alpha); 3 T3 C& }( a/ }
product(f,k=expr);; d# o9 m$ S5 }
其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—包含k的任意表达式.
) x. l* x* S, K& N& A> product(k^2,k=1..10);   #计算 关于1..10的连乘8 `  [& }/ c/ C

) y3 d' ^, c: y' t. d> product(k^2,k);         #计算 的不确定乘积
% Y; b6 @8 [( q( c1 V
. t$ P: E! V0 i7 m$ ^6 K; t> product(a[k],k=0..5);    #计算ai(i=0..5)的连乘" u' e0 }% f& a/ z

7 S1 ~- F- {( X: ~9 k7 C" @> product(a[k],k=0..n);    #计算ai(i=0..n)的连乘$ u" A& A0 T  f- ?8 h

# _9 J" A9 M4 p4 v> Product(n+k,k=0..m)=product(n+k,k=0..m);   #计算(n+k)的连乘, 并写出其惰性表达式; S6 M( O) k$ E2 k0 R. |, F
& G- W9 O. z6 B3 R  _( ?
> product(k,k=RootOf(x^3-2));     #计算 的三个根的乘积
% U) G& I. v4 ]0 M8 S  [+ z7 A 7 s8 A0 ?$ b9 e0 Y9 ~
    product命令计算符号乘积, 常常用来计算一个公式的确实或不确实的乘积. 如果这个公式不能求值计算, Maple返回 函数. 典型的例子是:   - R- m! F0 X# I
> product(x+k,k=0..n-1);
9 E9 H; Y# }, U) \
, R* d/ c% N+ P# i如果求一个有限序列值的乘积而不是计算一个公式, 则用mul命令. 如:   
6 t" C8 m" c( }( e> mul(x+k,k=0..3);+ y% Z8 `6 w, E2 D& n
! I  x. G! n+ |
2)指数函数
9 V/ p. }4 _# m7 _& n: I$ h3 v( x计算指数函数exp关于x的表达式的命令格式为: exp(x);
( M1 q9 ?8 P/ t4 q, ?) z0 P6 h> exp(1);# ^; \+ n$ C1 G) G. n

7 i9 Y2 v- N* a  l6 j( o7 n: X> evalf(%);( h4 F8 o& L2 f) n& X& P' L! k1 ]- R
/ U" ]# d7 G6 h
> exp(1.29+2*I);
4 J9 x' H0 c+ d" e) I9 k0 ^ # A+ {/ [6 Y9 c
> evalc(exp(x+I*y));* }; j, ^; E7 y, E/ f

; G% W$ E" v, u9 @& d3)确定求和与不确定求和sum
# s1 ?4 Y/ A' J3 X' |- f. c' H3 x命令格式: sum(f,k);  ; W, W7 @  e# s5 I8 }) P2 X+ J0 O0 G
sum(f,k=m..n);  
: q- v& P* @# }3 V* R! e+ \sum(f,k=alpha);
3 s3 S2 w0 p6 i, b7 w) esum(f,k=expr);
" e) W& S# @/ I2 Q- M其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—不含k的表达式.
" R2 _4 V" @6 a- ^. `> Sum(k^2,k=1..n)=sum(k^2,k=1..n);
( A3 a# E& c1 R$ Z0 O& K5 g7 V
& r9 m2 I% U8 @5 R! X> Sum(k^3,k=1..n)=sum(k^3,k=1..n);
; Q  Q( P5 G0 q4 J" N$ l9 G: [& `
6 c7 r; w( B4 w' |> Sum(k^4,k=1..n)=sum(k^4,k=1..n);
# m; R9 s2 o. Y) `. `. m8 r
+ w$ d" D1 ]+ I2 Z0 o& n7 T, C> Sum(1/k!,k=0..infinity)=sum(1/k!,k=0..infinity);
* }! U% q, _+ ]8 i" S 8 b( y9 b$ P  b2 R3 @* m
> sum(a[k]*x[k],k=0..n);! L9 u+ _& g  u, x. c, j

# K  A5 F4 T' q> Sum(k/(k+1),k)=sum(k/(k+1),k);
2 q7 c; f# Q: R! A # |3 B& o' K3 V- j0 p4 c
> sum(k/(k+1),k=RootOf(x^2-3));
7 }7 }2 m- r" S: }4 o 4 T  o4 B( W# o
sum函数可计算一个公式的确定和与不确定和, 如果Maple无法计算封闭形式, 则返回未求值的结果. 值得注意的是, 在sum命令中将f和k用单引号括起来, 可避免过早求值. 这一点在某些情况下是必需的.
& O1 [4 w, m9 K0 {) m> Sum('k','k'=0..n)=sum('k','k'=0..n);& ^" X9 w1 r* h$ k

6 m( O) |3 O' ]5 j8 `如果计算一个有限序列的值, 而不是计算一个公式, 可用add命令. 如:   % U: W- r$ S0 L9 a. V; D' x3 V4 |
> add(k,k=1..100);3 w& i) k7 i  p! h5 d2 I: X% \  e

1 T: D. Q/ e' D( J尽管sum命令常常用于计算显式求和, 但在程序设计中计算一个显式和应该使用add命令. + R9 d2 x* a; B( _% C: t
另外, sum知道各种求和方法, 并会对各类发散的求和给出正确的结果, 如果要将求和限制为收敛求和, 就必须检查显式的收敛性.
7 x; }) j: B$ k1 ~: n4 p& A3)三角函数/双曲函数! O' r! L# L$ L+ }
命令格式:   sin(x);   cos(x);   tan(x);   cot(x);   sec(x);   csc(x);. g7 |4 w. O7 z' n/ P
          sinh(x);  cosh(x);  tanh(x);  coth(x);  sech(x);  csch(x);
. t6 A6 U" H8 ^! k  ]. k( S其中, x为任意表达式.
& d6 e9 D! E' L值得注意的是三角函数/双曲函数的参数以弧度为单位. Maple提供了利用常见三角函数/双曲函数恒等式进行化简和展开的程序, 也有将其转化为其它函数的命令convert.' x. x" t  ^' c& L* j  h) h( d
> Sin(Pi)=sin(Pi);/ `) b9 r) @5 ]- b1 Y% m) q

' N. `( `; ^# G/ @5 _3 q0 k> coth(1.9+2.1*I);; F8 y5 m7 @/ t) }4 l( `

" j* `8 L! P- a  y> expand(sin(x+y));     #展开表达式3 o$ r0 `6 z0 G7 G2 y# @' Q
9 j5 {# J1 m9 h; R3 V
> combine(%);        #合并表达式- ^* O0 r- c  R, V% B( }

* u( I8 z. c! \> convert(sin(7*Pi/60),'radical');
. c3 C- z6 [2 ]" s5 S# d ; q  p0 c0 p! t6 {0 z
> evalf(%);$ z8 I2 M# {0 x, v
* x( N  }0 G/ A5 J
但有趣的是, combine只对sin, cos有效, 对tan, cot竟无能为力.1 ~. I) X8 _2 L7 D5 G' V( L$ ?
4)反三角函数/反双曲函数
: S4 y" C% f/ T! U; V8 B! l* q4 G  n7 E命令格式: arcsin(x);   arccos(x);   arctan(x);   arccot(x);   arcsec(x);   arccsc(x);
; c& i% c/ k4 p9 P  w     arcsinh(x);  arccosh(x);  arctanh(x);  arccoth(x);  arcsech(x);  arccsch(x);   4 _# q& k% ]- {
arctan(y,x);
& c8 t& ~4 {/ v& C! h其中, x, y为表达式. 反三角函数/反双曲函数的参数必须按弧度计算.
+ \" }% V8 V: M( Q算子记法可用于对于反三角函数和反双曲函数. 例如, sin@@(-1)求值为arcsin.
4 q1 A* m9 ]: M> arcsinh(1);
1 d3 g" a/ B3 s7 U' z/ `# m
" c& U7 W. X4 Y# g> cos(arcsin(x));) r& q/ e1 G  D
/ m4 {. k2 R8 e1 o
> arcsin(1.9+2.1*I);
" L5 ^1 K. \# z* Q8 u0 I& _
; s0 K& g$ q  X9 Y! _5)对数函数  p8 }$ I- }2 q9 c: f
命令格式: ln(x);           #自然对数  W6 }7 A2 [* `: t1 ]- C, V1 N( N
log[a](x);        #一般对数" S0 @0 b; Q: x( \
log10(x);        #常用对数
! {8 q+ V$ ~9 L1 n3 x一般地, 在ln(x)中要求x>0. 但对于复数型表达式x, 有:   
) I. F# z3 ?) e  V  (其中,  )  E( Z5 F* h) [! N$ ^$ x
> ln(2002.0);
6 d/ i: ^2 B, t
7 R- C, c& {" Y$ `2 C7 H> ln(3+4*I);. V: h+ ^. e1 j' ]  j  Q
% W& i# D5 l# Z( _4 q# ~
> evalc(%);    # 求出上式的实部、虚部
3 _6 L( x6 B  W: F3 a
3 K3 P6 C1 [" c: e, ^$ k) `/ P> log10(1000000);/ u" Q6 G8 x) u8 ?+ _4 x

# {) N+ e8 s; S! Y9 r> simplify(%);   #化简上式' Q! D/ q  V8 L, y, N2 I

. x& b0 K2 T' x5 N' I2.2.2 函数的定义
  @2 V( j- B, i$ q! M7 wMaple是一个计算机代数系统, 带未知或者已知字母变量的表达式是它的基本数据形式. 一个简单的问题是, 既然表达式中可以包含未知变量, 那么它是不是函数呢?试看下面一个例子:   
5 T5 q- E/ |* r6 l% Z2 J> f(x):=a*x^2+b*x+c;
$ m/ O" g2 P2 p
; E! y3 l" c- v: d3 E5 j可以看出, Maple接受了这样的赋值语句, 但f(x)是不是一个函数呢?要回答这个问题,一个简单的方法是求函数值:   
3 g0 d5 [& g- k* B8 U- g& m> f(x),f(0),f(1/a);# ~# [: M- A2 F! F+ y, }) Z, `
& u7 A7 u& a2 V4 K, r$ j! |
由上述结果可以看出, 用赋值方法定义的f(x)是一个表达式而不是一个函数, 因为f(x)不能把所定义的“自变量”或者“参数”转换成别的变量或表达式. 但从赋值“过程”可以看出, f(x)虽然也算是一个“函数”, 但却是一个没有具体定义的函数:   
2 w6 W. c8 f  U7 P) e8 |$ ~- ~> print(f);
" V, j2 p; Q+ Q# D9 S + D3 ^- ~( E+ T. n; [, a) ?. v: W% n* r
事实上, 我们所做的赋值运算, 只不过是在函数f的记忆表(remember table)中加入了f(x)在x上的值, 当我们把自变量换作0或1/a时, f(x)的记忆表中没有对应的表项, 所以输出结果就是抽象的表达式.
" W, s: D, {9 h% Z' k, w在Maple中, 要真正完成一个函数的定义, 需要用算子(也称箭头操作符):   
- V. t0 O% o  L% V; d) k+ P3 ]> f:=x->a*x^2+b*x+c;
( A; k# q5 T! F$ w( A0 M  `; N) K2 { 8 {# `: M6 c9 e5 }, R
> f(x),f(0),f(1/a);9 Z2 p8 T4 u8 D. z, `

3 M5 e9 h# E7 d+ x$ }) v+ v多变量的函数也可以用同样的方法予以定义, 只不过要把所有的自变量定成一个序列, 并用一个括号“()”将它们括起来(这个括号是必须的, 因为括号运算优先于分隔符“,”). 6 J+ ]+ q. v1 t8 [6 q% _
> f:=(x,y)->x^2+y^2;
% Z) A  v& d; C% } - V+ H4 ^5 S! e, v# q
> f(1,2);* U' d4 s" C/ o3 c5 _- L6 m2 \$ |* s

  I# L5 J' @/ u1 Q  j, g- S% I0 D> f:=(x,y)->a*x*y*exp(x^2+y^2);
% `' }. Q) j5 |  Q+ B
+ I) f! J+ b# K6 U0 n2 I' U( Z" S综上所述, 箭头操作符定义函数的方式一般为:   
9 Z! \. Y: Y9 ?' o: I3 Y一元函数: 参数->函数表达式5 |) _2 y7 {6 `5 ^: q+ z% A# i
多多函数: (参数序列)->函数表达式/ y- l  O1 k! r0 D# _
无参数函数也许不好理解, 但可以用来定义常函数:   6 u$ Z' t# H! l9 w
> E:=()->exp(1);
0 k! ]2 t) X& t5 L9 C1 ]- ^* s 4 z, ?" v6 u# u  Y9 }1 x: ]
> E();
( Y9 S$ m5 U1 b" A% }# [ 2 W; L! n" x" k( h
> E(x);6 A6 J' Q1 A- G
& h' ~8 f' o# z: y7 o6 M4 e
另一个定义函数的命令是unapply,其作用是从一个表达式建立一个算子或函数. 0 T( d0 P( V% t6 q8 @
定义一个表达式为expr的关于x的函数f的命令格式为:  f:=unapply(expr, x);         
( p7 x( G5 t: c. q) l定义一个表达式为expr的关于x,y,…的多元函数f的命令格式为:  f:=unapply(expr, x, y, …);     9 Q" G- V" l9 U: G1 t' d' c
> f:=unapply(x^4+x^3+x^2+x+1,x);1 P$ |4 s0 }8 F* ]1 e, f

; |5 B2 }5 h% P2 H' }/ K6 k- D* M8 X> f(4);6 ]: V5 ?$ s8 t- Q9 ^/ N

+ P5 B- j  Q. s6 q( n- a7 t) I3 B4 T% C> f:=unapply(x*y/(x^2+y^2),x,y);2 q, g9 Y! L0 j' |

2 d. i' F- z( Y# l& \9 ~2 m> f(1,1);" R' R  m$ P' ?" X! |

; j4 j5 A7 x& j* W; N7 }$ B借助函数piecewise可以生成简单分段函数:) M+ o4 q2 W# s; t6 O" V  D8 F
> abs(x)=piecewise(x>0,x,x=0,0,x<0,-x);
* L' w/ N3 \- E) p. w" G! N9 ~5 P8 T
1 S) |+ a3 @7 l! J( M- S0 ]: Q, P清除函数的定义用命令unassign. " ?' I2 U3 p/ G1 N
> unassign(f);. N$ g* p; i# k7 k- h) w9 c
> f(1,1);( U/ n" u, v9 E3 p3 l; `/ b

4 T& v9 |4 E' q9 v; o& N除此之外, 还可以通过程序设计方式定义函数(参见第6章). 3 \8 B" ~" }; C1 G
定义了一个函数后, 就可以使用op或nops指令查看有关函数中操作数的信息. nops(expr)返回操作数的个数, 函数op的主要功能是获取表达式的操作数,其命令格式为:  ^  a9 o$ f  x/ t, C7 v' K
op(expr);          , q, X9 j. H: w/ H( y9 U  L* h3 N
op(i, expr);         
5 k& ?( U' U% f: @, ^; f& Dop(i .. j, expr);      # Q* ?0 Q& N1 N0 L. C# O) w' b
nops(expr);
$ m7 ^) m" q7 R9 }如果函数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的类型.
  O5 O' E- H: `. U' p命令op(i .. j, expr); 执行的结果是expr的第i到第j个操作数, i..j中含负整数时的情形同上.+ T8 D( b+ t# Q5 N' ]
命令op(expr); 等价于op(1..nops(expr), expr); / }7 P9 ]6 F: V5 ?+ g8 k
特别地, 当op函数中i为列表[a1, a2, ..., an], 则op([a1, a2, ..., an], expr); 等价于op(an, op(..., op(a2, op(a1, e))...)); 5 M0 N: E& ?. O4 y. y. d
而当expr为一般表达式时,nops(expr)命令返回的是表达式的项数, 当expr是级数时返回级数每一项的系数和指数的总和.
7 F2 R) K8 I. C0 v7 [( |" R> expr:=6+cos(x)+sin(x)*cos(x)^2;% m  D# u* Q/ J& w

! i3 F6 r& Z' v$ p$ y$ {- ^> op(expr);  e9 x# Q+ H" V7 l( U8 t$ E
* w/ I. I1 A# {1 \6 G) q
> nops(expr);& C1 a4 n: D; }" g5 U+ u
9 C7 s: Y  Y0 F$ j' w( ~$ i
> p:=x^2*y+3*x^3*z+2;
  P& u6 u: ~; M$ G4 X) m6 k
% Y0 J; }4 h! q! v( x" B, n) b> op(1,p);0 n: c& N" q& r% U& W9 x: z# S
! f* V/ a1 U% A
> op(1..nops(p),p);
( @6 y5 }4 p, q% L( P , U4 p: f7 H7 r9 s
> op(op(2,p));
. o# m* G% B' o' c) B4 [# K6 z " t( \0 b9 G# b% [. T
> u:=[1,4,9];
5 X- K( ^6 H1 E 2 p. m$ ~- n+ I9 Z5 v/ [) ?
> op(0,u);
% j9 I3 h' x( v! s4 u# ]* M2 \ ' X) p1 ?! [8 ]0 x: @
> s:=series(sin(x),x=1,3);
. ^4 b# [7 c5 o % b& }/ T  l. Z, S( A/ O
> op(0,s);, b7 e' ~) }/ x2 U, `
       
5 l, u7 {- m, A6 U" b> nops(s);( e  D7 a# H) E8 A2 \% d3 s5 z

, [% K; h' m5 `- I+ n下面一个有趣的例子说明了Maple在处理算术运算时的“个性”:! _/ I( _+ a/ W6 G
> op(x*y*z);5 f! @4 H% C3 h5 J* `9 s
  g* l+ q9 P) b0 `: c! K
> op(x*y*z+1);
; _# N  K3 T+ u$ |- Z : T6 U. W3 L+ O6 N9 {, e" B7 B
2.2.3 Maple中的常量与变量名& W3 d. k6 c( D% ]+ X! u/ l2 j
为了解决数学问题, 一些常用的数学常数是必要的. Maple系统中已经存储了一些数学常数在表达式序列constants中:   
1 ?( x1 E" X9 P" o" I( T6 d  _> constants;
8 l1 D/ @0 p  I* v0 ]& e- u+ m# a
$ p% w% n5 y/ I  ^6 j- r2 `为了方便使用, 现将上述常数的具体含义列示如下:   . B; U- }! C6 M
常    数        名 称        近似值
! z" c: `/ `! @, l* @% W( s圆周率
/ v$ s) h+ i' v7 ]3 m6 ~' J8 }" PPi        3.1415926535
# U4 V6 r0 p- t9 ^Catalan常数 6 C0 i4 B0 s4 V+ P6 _3 A
Catalan        0.9159655942
  v; {# g4 U3 p- F6 o4 pEuler-Mascheroni常数
7 z; u% B( e$ @gamma        0.5772156649$ F. m- o$ s( J  H

& S6 D1 E: O0 k% [9 uinfinity          @3 `$ ]$ [% w) |0 C

! \, b* v5 y) {, u5 S( H( G! h需要注意的是, 自然对数的底数e未作为一个常数出现, 但这个常数是存在的, 可以通过exp(1)来获取. # `" q7 A* E% y) b
在Maple中, 最简单的变量名是字符串, 变量名是由字母、数码或下划线组成的序列, 其中第一个字符必须是字母或是下划线. 名字的长度限制是499个字符. 在定义变量名时常用连接符“.”将两个字符串连接成一个名. 主要有三种形式: “名.自然数”、“名.字符串”、“名.表达式”. 8 L8 ]& F4 t1 q6 c5 g9 k% Q
值得注意的是, 在Maple中是区分字母大小写的. 在使用变量、常量和函数时应记住这一点. 数学常量 用Pi表示, 而pi则仅为符号 无任何意义. 如g, G, new_term, New_Team, x13a, x13A都是不同的变量名.
- D& w4 P2 [7 X  E: `; E在Maple中有一些保留字不可以被用作变量名:   
- S1 s2 u* d. A2 @+ O0 h3 cby      do      done     elif     else     end        fi        for      
' L' ]/ q4 p# Cfrom    if       in       local     od     option    options     proc         
' B( s) r& t7 kquit    read     save     stop     then     to        while      D' _, z3 q1 l; U0 z0 D" f
Maple中的内部函数如sin, cos, exp, sqrt, ……等也不可以作变量名.   ]( A/ v' Y8 Y" A0 \
另外一个值得注意的是在Maple中三种类型引号的不同作用:   
. g* R  z  }( r- z  ^$ h`  `:   界定一个包含特殊字符的符号, 是为了输入特殊字符串用的;      T7 |) O* K2 x' }- L/ H
'  ':   界定一个暂时不求值的表达式;    & @; e" ]) v5 k" D
"  ":   界定一个字符串, 它不能被赋值.
1 O& |) z. k" g9 G+ v" a2.2.4 函数类型转换           . l2 B  t/ v7 ?8 k2 M$ V  D
函数类型转换是数学应用中一个重要问题, 譬如, 将三角函数转换成指数函数, 双曲函数转换成指数函数, 等等. 在Maple中, 实现函数类型转换的命令是convert. 命令格式:  ! @7 q  H8 b$ }" z" c5 ~
    convert(expr, form);        #把数学式expr转换成form的形式
! I3 D. @9 m( j. w7 f3 o; Uconvert(expr, form, x);      #指定变量x, 此时form只适于exp、sin、cos
; `3 f: p; [( _& Wconvert指令所提供的三角函数、指数与函数的转换共有exp等7种:   # n3 o1 Y& Y# i/ A
(1) exp: 将三角函数转换成指数
2 b7 a+ d2 h0 N  n+ u8 J(2) expln: 把数学式转换成指数与对数
% \) ?& M* j* c4 A(3) expsincos: 分别把三角函数与双曲函数转换成sin、cos与指数的形式
* o" b' }$ h; m' M# M  {(4) ln: 将反三角函数转换成对数. E0 O7 `$ N1 E% K( B1 L1 f0 U$ l2 i
(5) sincos: 将三角函数转换成sin与cos的形式, 而把双曲函数转换成sinh与cosh的形式
, G# [3 \. Q  p- {$ u(6) tan: 将三角函数转换成tan的形式/ B6 Y6 i  t% J$ N) a- b
(7) trig: 将指数函数转换成三角函数与对数函数
% g+ \9 F2 v( V8 U) [> convert(sinh(x),exp);   #将sinh(x)转换成exp类型
" `1 k/ q2 @( x8 W4 W
: h! ~: A  j* W# P: c> convert(cos(x)*sinh(y),exp);
1 v+ N. H: Y1 P
5 U) n% Z7 z1 P7 b( q> convert(cos(x)*sinh(y),exp,y);
* z& n+ u0 F7 t$ e
7 ]; L: z$ U2 x; ~> convert(exp(x)*exp(x^(-2)),trig);
; c7 s( M" R# I- q+ H( v$ D ' T# L1 l: R" D
> convert(arcsinh(x)*cos(x),expln);
+ I# L" a; u0 ]9 W$ Z   l' z) I; y, E! Q
> convert(cot(x)+sinh(x),expsincos);* O  W0 a7 E2 M6 j
2 ~9 k1 |) \& z' \# G* H2 k
> convert(arctanh(x),ln);5 u( p0 Q5 y- P# [- z2 J6 a

7 _, }2 S& w6 [convert在有理式的转换中也起着重要的作用. 在有关多项式运算的过程中, 利用秦九韶算法可以减少多项式求值的计算量. 在Maple中, 可以用函数convert将多项式转换为这种形式, 而cost则可以获取求值所需的计算量. 注意: cost命令是一个库函数, 第一次调用时需要使用with(codegen)加载. 例举如下:   , t# u* v* I8 s5 b$ t0 G
> with(codegen):: {; ^2 A: _% O3 G2 G9 i
> p:=4*x^4+3*x^3+2*x^2-x;
( M" B) p6 \5 O/ v , h: z$ G$ a5 d! u8 }
> cost(p);
% W' n; Q( W3 F 0 x4 h1 n/ Y  u  \
> convert(p,'horner');  #将展开的表达式转换成嵌套形式
( p# t* S3 d$ p& k% l( Q, L
# n! {" x# R- X> cost(%);
3 U) O, W1 B& y- `/ L
) s( ]) f$ J) V6 X同样, 把分式化成连分式(continued fraction)形式也可以降低求值所需的计算量. ! J" G1 J7 N0 L& w6 W1 l5 w
> (1+x+x^2+x^3)/p;1 ]' `: s0 U8 X7 Z! S

! a- o% I8 a1 [$ q- D$ X; K> cost(%);
' {) ?1 y9 h5 k7 E5 v( b, K
7 ?% c# ~6 F8 G8 P( x> convert(%%,'confrac',x);
+ R5 {8 t: k! ?
0 t. U" B1 L% I/ q3 b4 Y/ x> cost(%);; r2 Z+ U7 M( Y  q5 s+ h
' k2 M) P( Q' ^" T, A) x2 m
在某些场合下(比如求微分、积分时), 把分式化成部分分式(partial fraction)也就是几个最简分式的和式的形式也可以简化运算, 但简化程度不及连分数形式. 6 R+ s( i# J3 A2 u. s4 I6 k
> convert(%%, 'parfrac',x);# Z( C) `  A2 r& v8 |& e6 u& a
$ K9 E6 }" y) v/ a
> cost(%);
2 B9 y: }3 E. L9 W
9 K. J, ^% o2 D3 w1 X* L4 P! |( s而把分数转换成连分数的方法为:+ Q/ U" v4 r, n: n) E
> with(numtheory):& ]8 `/ W: F7 b6 J, o! D
> cfrac(339/284);
9 j$ l9 V$ O1 |$ V, n$ b 3 ]* ?1 y3 `: \
2.2.5 函数的映射—map指令
8 ?2 l7 A7 V* N3 e# ?3 H在符号运算的世界里, 映射指令map可以说是相当重要的一个指令, 它可以把函数或指令映射到这些结构里的元素, 而不破坏整个结构的完整性. 命令格式为:- y/ c! l" z$ S. x: u) r
map(f, expr);      #将函数f映射到expr的每个操作数
0 Q* O; Q1 \/ M/ P. F9 n, amap(f, expr, a);    #将函数f映射到expr的每个操作数, 并取出a为f的第2个自变量
/ b7 B9 y- F7 f" X1 F1 o3 ?map(f, expr, a1, a2,…, an); #将函数f映射到expr的每个操作数, 并取a1~an为f的第2~n+1个自变量& s% |) K. h; u2 J3 e% P5 D
map2(f, a1, expr, a2, …, an);    #以a1为第1个自变量, expr的操作数为第2个自变量, a2为& X1 n/ }: p! Z
第3个自变量…, an为第n+1个自变量来映射函数f( a# z  z& ?  n% J. U
> map(f,x1+x2+x3+x4,a1,a2,a3,a4);- K$ h9 H  M' Y# N$ y  v6 A; {, X
6 A! w4 H) ]! ~+ b. Z
> f:=x->sqrt(x)+x^2;+ V  T& C' C9 ]9 ^7 I3 l+ w+ D
# d1 X5 x$ J+ M5 P; r1 D
> map(f,[a,b,c]);
" ^8 x& J  j' v; y( A& l5 j ' \6 N# g: k: z
> map(h, [a,b,c],x,y);
1 C9 a: h- w5 S& c# i% l 4 f: Y. f/ K6 ?2 N7 z2 {+ F: C
> map(convert,[arcsinh(x/2),arccosh(x/2)],ln);% ~; c2 m  L- t- `# {/ {' m  }
* V; u* H5 Z( C
> map(x->convert(x,exp),[sin(x),cos(x)]);; c6 W# y% s- h8 @. k( l; ^

% s2 a2 R$ e6 J4 P上式的映射关系可通过下式理解:* D& C* W$ h) D& n6 L, L- m2 U
> [convert(sin(x),exp),convert(cos(x),exp)];* n( Y" D1 V9 z+ I2 c

# j$ h' [# ~, m* N4 {6 e$ {> restart: " l2 u5 B0 Y( }3 Y# ^
map2(f,a1,x1+x2+x3+x4,a2,a3,a4);0 d( S4 I" _8 \5 v; D+ e6 O1 B. D
! W  L3 C( `  f* c  \( U1 r
> map2(max,k,[a,b,c,d]);
! T0 o9 h  a& ^) b/ O- ?; ]
8 q* @+ {" P; T, c) o9 d再看下面示例:   
  n: Y! e2 L/ d3 J* x> L:=[seq(i,i=1..10)];  l9 E' K- j$ E+ K+ I
" w* d; }5 h$ U3 o' \/ y
> nops(L);3 V2 E9 j  e7 z( o

- W7 B2 f$ [& A6 h0 Q, G* i$ U+ E4 Z> sqr:=(x)->x^2;
' T! f3 b: w! A; j" m " ^7 S, }/ d% p; ?9 F8 D
> map(sqr,L);
* Z8 l) o! E; `. ?7 L4 i4 h2 W 5 N' L1 J" r3 C( ?; r! v# q
> map((x)->x+1,L);- [9 ?, N7 L: e; a0 J

. a7 \8 W2 G6 l$ q% `. o) k) J" ]> map(f,L);
4 ~5 L6 \4 s1 s8 p5 }1 ]! D7 r
8 B. R1 w" K4 A/ C$ K$ D  w9 |> map(f,{a,b,c});
' d& C; e5 X8 ?- V" g9 Z
' K* Q' k7 s: x3 Q1 @: Q+ W8 ^> map(sqr,x+y*z);
; R' D  Y/ f5 ~/ t( i % e4 F: b; b1 Y# Y- R9 i$ o" D" A
> M:=linalg[matrix](3,3,(i,j)->i+j);7 A8 v, p5 ^! B4 A$ K) a( D  D) B7 ?

% e' l4 b0 c# }> map((x)->1/x,M);6 X/ V5 D9 D1 H( g. k6 d5 |! f* W
8 E$ G( \0 u- O. @" s7 c* d+ I
3 求 值
5 g0 J0 F; X0 |3.1 赋值
$ S; N% |4 {1 P% S1 }" `% B% K在Maple中, 不需要申明变量的类型, 甚至在使用变量前不需要将它赋值, 这是Maple与其它高级程序设计语言不同的一点, 也正是Maple符号演算的魅力所在, 这个特性是由Maple与众不同的赋值方法决定的. 为了理解其赋值机制, 先看下面的例子. 5 t, H  u3 ]6 o8 P' L1 t+ C
> p:=9*x^3-37*x^2+47*x-19;
3 z; G- S7 ^* T% m8 |/ K $ z7 h8 z3 ]$ _
> roots(p);8 T; p& E. ~) \0 t) a5 q
0 |$ R. n. `. w. P6 I9 @% f" N
> subs(x=19/9,p);6 v. c' P! I: ]/ G* D6 G8 D
0 }# e" @) n& o1 X
在这个例子中, 第一条语句是一个赋值语句, 它的作用是把变量p和多项式9x3-37x2+47x-19相关联, 在此之后, 每当Maple遇到变量p时就取与之唯一关联的“值”, 比如随后的语句roots(p)就被理解为roots(9x3-37x2+47x-19)了, 而变量x还没被赋值, 只有符号“x”, 通过subs语句得到将p所关联的多项式中的所有x都替换成19/9后的结果, 这正是我们在数学中常用的方法—变量替换, 但此时无论x还是p的值仍未改变, 通过“> x; p;”这样的简单语句即可验证.
3 {+ w( V4 c2 R# `$ k% |7 ?/ S3.2 变量代换
4 w. V+ G* @. }7 u- l1 o/ B在表达式化简中, 变量代换是一个得力工具. 我们可以利用函数subs根据自己的意愿进行变量代换, 最简单的调用这个函数的形式是这样的:   
5 T! [& V5 h* ^( B$ @, A, @1 p/ nsubs ( var = repacedment, expression);) h7 z  f8 v* j+ I. D  _
调用的结果是将表达式expression中所有变量var出现的地方替换成 replacement. # k5 H2 P+ p6 n* u5 s  Y) A2 i# O
> f:=x^2+exp(x^3)-8;) g) t0 O: \" f/ r! Z/ \

; T' ]6 Q& |/ F% M2 K# M& K# ~9 ^> subs(x=1,f);
. e# b2 O  {# i! _1 B
, J" c: v) l6 Q& L* C( I1 I> subs(x=0,cos(x)*(sin(x)+x^2+5));% g0 Y+ E0 d1 i8 h* W
2 ^0 T6 m- R' G5 ?3 t
    由此可见, 变量替换只得到替换后的结果, 而不改变表达式的内容, 而且Maple只对替换的结果进行化简而不求值计算, 如果需要计算, 必须调用求值函数evalf. 如:   
- P) i4 c! V8 q; i> evalf(%);
; P; m& |; W. k, {8 H; } 8 _0 \5 h4 \+ N+ ?4 s0 v5 q
变量替换函数subs也可以进行多重的变量替换, 以两重代换为例:   
5 O" x! R9 u7 n* p" Hsubs (var1 = repacedment1, var2 = repacedment2, expression)+ t+ b+ ~* R: b. M/ Z7 A
调用的结果和按从左到右的顺序连续两次调用是一样的, 也就是先将expression中的var1替换成replacement1, 再将其结果中的var2替换成replacement2, 把这种替换称作顺序替换;    与此相对, 还可以进行同步替换, 即同时将expression中的var1替换成replacement1, 而var2替换成replacement2. 同步替换的调用形式为:   " n* r5 b9 G5 ]/ i* a
subs ( {var1 = repacedment1, var2 = repacedment2 }, expression)
( A" A$ {8 p3 [7 f* t8 _下面通过例子说明这几种形式的替换.   R' k% r3 `& Z* v
> subs(x=y,y=z,x^2*y);              (顺序替换)  m. r& R" H9 ~" ^, F( [. [  @

1 I, E5 v) q) |( ^/ J> subs({x=y,y=z},x^2*y);            (同步替换)
5 X1 f* p3 z9 I2 m0 C1 W' ~
% W' }6 e8 ^$ J2 I# O3 j6 N" @4 u> subs((a=b,b=c,c=a),a+2*b+3*c);   (顺序替换)
* X- W: o7 L4 Q# t' m# h : ?  ?1 a8 \' N8 r( L3 u; b
> subs({a=b,b=c,c=a},a+2*b+3*c);    (轮  换)% R2 ^! D6 ?! O( w
- o. }* m2 B0 l7 c$ D3 T
> subs({p=q,q=p},f(p,q));             (互  换)) _8 j3 w; w1 Q! \( H8 l1 i

0 P$ n+ t; a: s3.3 假设机制2 t* Q/ l" O' |5 S
Maple是一种计算机代数语言, 显然, 很多人会尝试用Maple(或其他计算机代数语言)解决分析问题. 但由于分析问题与处理问题的考虑方法不同, 使得问题的解决存在某些困难. 例如考虑方程 的解. 如果k是实数, 结果显然是x=1, 但如果k是 的复根, 为了保证解x=1的正确性, 必需添加附带条件: 也就是当 时x=1. 这是一个对结果进行正确分析的例子. 然而从代数的角度考虑这个问题时就会把k当作不定元, 此时k没有值, 从方程两端去除k的多项式是合法的, 只要这个多项式不是零多项式即可(这一点是可以保证的, 因为其所有系数不全为0). 在此情况下x=1就不需要任何附加条件. 计算机代数系统经常采用这种分析的观点. 5 i9 C0 G9 \) q& M; g& d
在Maple中, 采用分析观点解决这类带有一定附加条件的实用工具是函数assume, 其命令格式为: assume(x, prop);& N; n6 m3 y/ a/ j9 K
函数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);”也不会产生矛盾. ( |0 C$ M( N5 F& {# A* c
> Int(exp(-s*t),t=0..infinity);
3 V" `  h4 s9 O4 Z6 ?- v5 r . X! U' M# L" K$ M: a! M1 P
> value(%);
4 A6 g1 L. x# I9 g% yDefinite integration: Can't determine if the integral is convergent.; @& K3 t8 k7 J& N& D
Need to know the sign of --> s$ a3 Z5 h* l# [. S8 W
Will now try indefinite integration and then take limits.6 \1 J9 Z& {  e% m& e1 ?+ P

2 J1 e% U$ `! @1 F! V  M, X" h& z> assume(s>0);8 }  s# N+ c+ q& N$ C+ m
> Int(exp(-s*t),t=0..infinity);( I# }& [3 F# a- ~( U! s" J* Z4 [7 U
% r# E& @) @% ]0 Z; t8 i
> value(%);
8 p; x* B' j( B. c3 B3 k 8 \5 W( P* `( \1 j4 M
3.4 求值规则' t5 }, g& d- d5 Q- `! k
在多数情况下, Maple的求值规则设计为做用户期望的事情, 但要做到这一点很困难,因为不同的人在相同的情形下会有不同的期望. 在大多数情况下, 全局变量被完全求值, 局部变量被一层求值. 而由符号' '界定一个暂时不求值的表达式, 单步求值仅去掉引号, 不作计算, 这也是允许取消指定名字或清除变量的原因. 如下例:   
: s9 ~5 a2 S& {* Y+ V8 W> x:=y;" [4 n+ V1 e) b' ~! {; @. ]4 w

6 @9 s$ t2 ?5 h6 X> y:=z;
) T) F4 E% A/ f, U4 M$ o
  E0 z1 r' W/ F3 M& P7 L8 h0 C> z:=3;
. W; d$ C8 @2 Z% j* N : o# R3 J( U3 F3 E8 E# Z2 i
> x;
. l8 ]) b# M8 Y3 K
0 i  E  T3 N' a> y;
/ x- m3 o0 I8 T( |6 f/ i7 P : h+ K# h: `; f& z# a) z% c& y
> x:='x';; \- ?. V# F. E' e
: k6 p7 i5 T* l* m% x: ~7 u$ T
> x;0 f  Q# y# R0 R1 }% l) T" ~

3 u0 m: f# Q9 H" i5 b2 o# y6 t> y;1 j8 c. K) M4 n/ S) `9 y

. T5 {' c0 A3 ?7 S; f/ X* V对于不同的问题, Maple设计了不同的求值命令. 现分述如下:   
3 ^$ q8 N$ K  h" }1) 对表达式求值
- m+ |! \& B) R$ i! {命令格式: eval(e, x=a);  #求表达式e在x=a处的值, F" H9 s  c1 b( M+ K1 w
             eval(e, eqns); #对方程或方程组eqns求值9 N" y( f/ d8 x. u+ T, P2 A
             eval(e);      #表达式e求值到上面两层" Y( E, x" M; X; Z( p6 O( k
             eval(x,n);    #给出求值名称的第n层求值
6 {" Z6 r) N7 {4 s% C% y8 t/ Z> p:=x^5+x^4+x^3+x^2+x+73;
$ v4 L9 P1 ]3 j8 U. e& {* j * b9 |2 a. P" p/ w% S) n
> eval(p,x=7);
# ]5 N1 _# p) @ 2 e" F6 v: N: S' l8 c
> P:=exp(y)+x*y+exp(x);7 x. F) R- Z9 \/ L  Z
" ~$ |- \# O& Y" S
> eval(P,[x=2,y=3]);" O) R4 b! Q) K( x, q

% B( ^; z9 ^: i    当表达式在异常点处求值时, eval会给一个错误消息. 如下:   3 P% I1 L" \5 _! H) \
> eval(sin(x)/x,x=0);
' o% N. p/ Q+ R" qError, numeric exception: division by zero
" d. p! w# k& Q) H& p* d. o$ i    下面再看使用eval进行全层求值或者对名称几层求值的示例:   ( G9 B7 T) Y& P* h- J' z, X1 `; A
> a:=b: b:=c: c:=x+1:
9 J7 h+ t! C# o+ c> a;              #默认的全层递归求值
1 _9 f" E% n# N  O5 L0 [   z8 X, F4 I" `+ ~# p( F
> eval(a);        #强制全层递归求值
7 ]$ y) M* o$ Q# w , E0 n( ?/ S5 ^6 @
> eval(a,1);       #对a一层求值7 f  H- }+ p7 G+ p; Z' _

3 U' a- Y+ L9 o> eval(a,2);       #对a二层求值& j$ B( B- Z* I  L5 E

) p3 i0 T* G" i/ V# v! E> eval(a,3);       #对a三层求值7 x- g3 M! s7 @, B3 W
7 z4 U9 M, B. d. C# ^
> eval(a,4);       #对a四层求值
1 ^4 b" y: d3 l+ g: j7 i6 E 8 ]8 D7 @! S: u1 z  O2 P
    2) 在代数数(或者函数)域求值" M% x- c* S- ~
命令格式: evala(expr);       # 对表达式或者未求值函数求值
, G5 R$ H" t5 n: G0 ^             evala(expr,opts);   #求值时可加选项(opts)  i: m& {- ~, C0 O6 Q7 O6 j8 A
所谓代数数(Algebraic number)就是整系数单变量多项式的根, 其范围比有理数大, 真包含于实数域, 也就是说任意实数都是整系数多项式的根(如 就不是任何整系数多项式的根). 另一方面, 代数数也不是都可以表示成为根式的, 如多项式 的根就不能表示成为根式的形式. & z6 T2 Z7 K  ^9 x
代数数的计算, 算法复杂, 而且相当费时. 在Maple中, 代数数用函数RootOf()来表示. 如 作为一个代数数, 可以表示为:   
7 c% g# j+ T( {) L" r> alpha:=RootOf(x^2-3,x);
+ z2 f* H! z$ L. q : A0 P3 _5 G% H
> simplify(alpha^2);% S% r  H3 P6 y0 f4 @% ~0 [6 [3 v

  z# w6 O. x$ M% j+ @' t4 o; W在Maple内部, 代数数 不再表示为根式, 而在化简时, 仅仅利用到 这样的事实. 这里, Maple用到一个内部变量_Z. 再看下面一个例子,其中alias是缩写的定义函数,而参数lenstra指lenstra椭圆曲线方法:+ {. Q* R, i  y* [) o$ W+ p9 c
> alias(alpha=RootOf(x^2-2)):7 D# p  u" x( R
> evala(factor(x^2-2,alpha),lenstra);6 f! a. h8 r4 A* @2 S" ^* A

; \, {) O/ g) T: p- ]* ~- c; ?+ n> evala(quo(x^2-x+3,x-alpha,x,'r')); , g: @/ `0 F- f& G7 p- N+ X
& s. P6 q! T  a+ Q' K
> r;4 P( m/ D4 Y0 M3 b6 n
8 x" G- ]; g  p
> simplify(%);
" @. w- g) K4 ?: C) V( Z- d7 B 7 I  W7 o8 a; r4 `  l3 K; y
3) 在复数域上符号求值4 W' d4 a  x" ]/ d) D
操纵复数型表达式并将其分离给出expr的实部和虚部的函数为evalc, 命令格式为:+ d* M+ D& T5 o5 d! m; B5 ?# i
evalc(expr);     o, T; U& I& x2 i
evalc假定所有变量表示数值, 且实数变量的函数是实数类型. 其输出规范形式为: expr1+I*expr2.
& ]' B  V) T$ B9 [3 i> evalc(sin(6+8*I));5 E& m0 S# h8 b+ [! [2 G
: l3 O$ `; g0 R6 Q% i9 j' V. {- k0 _
> evalc(f(exp(alpha+x*I)));
$ Y& U2 M& y+ n % L; ^* t9 t6 B8 a( {1 h
> evalc(abs(x+y*I)=cos(u(x)+I*v(y)));, p' P& r; [. c  R6 c. G

- `, l8 X2 G1 e( E" l/ O1 w4) 使用浮点算法求值. e/ x# p# `6 @9 n- O; Z
浮点算法是数值计算的一种基本方法,在任何情况下均可以对表达式expr使用evalf命令计算精度为n的浮点数(n=Digits), 如果n缺省, 则取系统默认值, 命令格式为: evalf(expr, n);     - I* ]* @7 T: y, V# ^! G
> evalf(Pi,50);   
  k9 m* x. Y; y. i& M6 a
' Q7 t& r4 X5 P/ f> evalf(sin(3+4*I));   
- ~6 L& j3 T! x8 M7 ~5 O6 u( d   [) i( P$ H$ k4 i/ q6 p
> evalf(int(sin(x)/x,x=0..1),20);3 {: E' J/ ]+ H5 n& F
8 P  K: o' B( M+ a% b8 G
5) 对惰性函数求值
; `: T( Q7 J& _  I把只用表达式表示而暂不求值的函数称为惰性函数, 除了第一个字母大写外, Maple中的惰性函数和活性函数的名字是相同的. 惰性函数调用的典型用法是预防对问题的符号求值, 这样可以节省对输入进行符号处理的时间, 而value函数强制对其求值. 对任意代数表达式f求值的命令格式为: value(f);   % R& y. _: o# o. l
> F:=Int(exp(x),x);
! G# o, A& I, V4 X: c8 ?0 b 5 x- l6 Q2 e' ^. Q. i2 `$ h
> value(%);6 F2 t- h; a7 f0 W

! d7 X5 A$ C- P* I$ @> f:=Limit(sin(x)/x,x=0);0 N3 @# A; r4 l" Q) M3 p

" o3 D5 r1 X) x8 `; ]% ]  F> value(%);& L6 G4 z# ^6 L& p1 \. r

, ~* p" Y, c2 k2 c4 i. K另外, 将惰性函数的大写字母改为小写字母亦即可求值. 如下例:   
7 S( ]1 f( s6 p) s0 E( X* F8 Y5 K> Limit(sin(x)/x,x=0)=limit(sin(x)/x,x=0);
. l$ n: `5 c4 v' s- ^ 0 H9 f/ \6 B1 A% k* y( H
4 数据结构
9 y- x& c# f* r. B& ^Maple中有许多内建的与FORTRAN、C或Pascal不同的数据结构. 主要的数据结构有序列(sequence)、列表(list)、集合(set)、代数数( algebraic number)、未求值或惰性函数调用、表(table)、级数(series)、串(string)、索引名(index)、关系(relation)、过程体(process)以及整数(integer)、分数(fraction)、浮点数(float)、复数(complex number)等数据结构, 而矩阵(matrix)在Maple中表示为阵列, 是一种特殊的表.
8 W7 C; P5 M; J, h' x4.1 数据类型查询" R# R& y% W& t: K$ d) @- T' u
在Maple中, 用whattype指令来查询某个变量的数据类型或特定类型, 命令格式为: ) @) [- B: b; N4 O, f% w: u
whattype(expr)        # 查询expr的数据类型5 F/ s" N+ I/ G& d
type(expr, t)           # 查询expr是否为t类型, 若是则返回true, 否则返回false
; _' Y" H# U$ \. m0 Y> whattype(12);$ n' R# V0 b6 c+ P6 b
" l$ b/ A! {! t. n: Y
> whattype(Pi);( ?9 z. R, N3 P1 Z9 o8 V; W7 u- I6 E% @) V
; y" N0 S; M1 E6 R7 Y' M6 b. J* [
> type(1.1,fraction);
5 G1 r9 @5 u0 A9 G  F4 }) I , S( F/ R* a; t1 W3 G. r! q
> whattype(1.1);
7 N; h& M$ v3 H+ I5 b/ \" O* ? 1 _, C0 q4 Z# |2 ~# T
4.2 序列, 列表和集合7 X2 F& M7 |0 D6 m2 `
4.2.1 序列( [) T9 x- U6 k/ S1 z. k6 ?# V, D
所谓序列(Sequence), 就是一组用逗号隔开的表达式列. 如:   : b8 R1 f* Q' A: G5 Y4 b3 Y5 j
> s:=1,4,9,16,25;
1 Z- x3 y# O. Y/ U9 e' A4 [5 `
" L/ _. B. e* [1 }0 x) i5 `> t:=sin,com,tan,cot;
0 Q' V1 {) w; o8 m6 o7 U) q
1 n4 N1 f2 ^) q/ p* l& B& j0 o: D4 Z一个序列也可以由若干个序列复合而成, 如:   - }) \' s- ?, A  |# J$ w
> s:=1,(4,9,16),25;" X1 u+ F6 f4 b+ [. [) `% Z7 T! |

; j' ~! D* K, R> s,s;
+ L( K3 W* A: J' J $ n* P2 V$ d6 h7 `* T
而符号NULL表示一个空序列. 序列有很多用途, 如构成列表、集合等. 事实上, 有些函数命令也是由序列构成. 例如:   
, Z+ A5 ^, H: [/ p1 P' p+ |7 N. v' z& O> max(s);5 y5 G# ~9 X# h
$ s6 w) Z  Z+ ?. f
> min(s,0,s);5 |; t% a! G; D! f% ^$ f0 T- M
8 ]) x' X8 B, H
值得注意的是, op和nops函数命令不适用于序列, 如op(s)或nops(s)都是错误的, 如果要使用op(s)或nops(s)前应先把序列s置于列表中.
5 |, I- F. O$ e( C: d+ l> s:=1, 2, abc, x^2+1, `hi world`, Pi, x -> x^2, 1/2, 1;
6 s+ f- K+ {. g2 l' V% C4 G 4 g8 _* a" j& A  f- a6 {3 j
> op(s);; c. Y) I2 `) j) ~  j9 o
Error, wrong number (or type) of parameters in function op! l( t. _- n& }) d
> nops(s);1 Y4 g/ K0 z, A
Error, wrong number (or type) of parameters in function nops
: a" C/ ?' D! N" H( y> op([s]);
, m" x8 `. H0 N" W 3 _- U. n' S- n' X
> nops([stuff]);; |, F0 e3 Q5 Y) T) l0 K$ P$ e% D$ P! D
6 S3 d* w0 R& z" F# `
函数seq是最有用的生成序列的命令, 通常用于写出具有一定规律的序列的通项, 命令格式为:   
/ _- y; l, T0 y8 U0 Lseq(f(i), i=m..n);  # 生成序列f(m), f(m+1), …, f(n) (m,n为任意有理数)
) l! |* _. b6 \4 _3 J0 f; L7 Gseq(f(i), i=expr);  # 生成一个f映射expr操作数的序列
, R: C9 J9 q% @$ k# vseq(f(op(i,expr)), i=1..nops(expr));  # 生成nops(expr)个元素组成的序列
1 _5 F, q. @9 x% ]- v6 f" U> seq(i^2,i=1..10);
4 i1 m9 V1 c3 v' b % y# ]$ H) z- V/ }0 Q% C$ U
> seq(ithprime(i),i=1..20);
9 r! \( m0 a  I: Z
# P6 |$ C% e' Q> seq(i^3,i=x+y+z);
. Y: ^7 ~  Q9 n: T0 _  d+ t7 ^; |
' I8 I, i  }& b' y' u3 D> seq(D(f),f=[sin,cos,tan,cot]);
: A) l( `6 R, A% P. Z# c) T5 W5 X+ }
  B3 }. S1 E! V3 Y> seq(f(op(i,x1+x2+x3+x4)),i=1..nops(x1+x2+x3+x4));4 B- Y1 _. a* a! M4 a4 ^! d# z; d
8 _  t  }7 w9 d' L7 [
获得一个序列中的特定元素选用操作符[  ], 如:   ! X, b, Y8 `7 Y
> seq(ithprime(i),i=1..20);
& G& `5 S, P5 t3 f 3 x7 F# f: q$ W
> %[6],%[17];
7 W% V) X6 t' {3 H! T- `- Y
: m4 H5 W9 X$ |2 O6 X4.2.2 列表
4 Z0 ^- ~5 u9 F) J: {& s列表(list), 就是把对象(元素)放在一起的一种数据结构, 一般地, 用方括号[  ]表示列表. 如下例:   9 |8 ~3 f2 \/ S1 J  W; i: h7 Y( B
> l:=[x,1,1-z,x];
3 w$ R# M7 R  G) @6 G) P+ c 2 c7 c$ B+ N9 c2 Z
> whattype(%);
/ O; g9 N+ W$ a# n+ ]! \; J1 V
* f2 ?7 j# [! R1 e空列表定义为[ ]. 8 v* v4 A8 h5 R
但下述两个列表是不一样的, 因为对于列表而言, 次序是重要的:   
, y6 K7 A* q% l> L:=[1,2,3,4];% C8 q/ a4 K8 d8 I
/ f" c4 A# L$ ?* p
> M:=[2,3,4,1];
! D& X% e: w* ] 7 l7 f% G0 H8 [: g. }$ y0 `
4.2.3 集合  K& J9 c/ T+ P; X
集合(set)也是把对象(元素)放在一起的数据结构, 与列表不同的是集合中不可以有相同的元素(如果有, Maple也会自动将其当作同一个元素), 另外, 集合中的元素不管次序. 一般地, 用花括号表示集合.
0 N$ ?9 X" H8 ~9 _9 P> s:={x,1,1-z,x};
& z# C; ]! T8 a
& J6 [0 e. M& S* N' j) p> whattype(%);
( V% O6 c% ?7 J: D/ D' h/ }! s# M / c! G3 u5 k+ t  a# g" B; w
空集定义为{ }. 4 ~6 r# p3 L" X# Z) h& K
函数nop返回列表或集合的元素数, 而op则可返回其第I个元素.
4 E+ {* ]6 b3 P) w6 k> op(1,s);
, x( J( I4 L1 r8 z# u# h& K+ e 6 t# i9 T* ]$ y9 r
> s[1];
  i$ i/ i( o& k ' C: D8 `  z2 S* R
> op(1..3,s);$ F2 P/ y: c! C* S" I
6 O- x- l; [/ P
> s[1..3];
$ f) t. e0 D  z
: M( I8 M$ M/ l/ Y3 e: [+ S; P4 u函数member可以判定元素是否属于一个列表或集合, 如果属于, 返回true, 否则返回false.
" |% n7 y5 M4 v2 b3 J! Z) v  }7 Z> member(1+x,s);' Q) ], P& P9 a

. m0 r1 m. I: p# E& w2 ]可以通过下述方法在列表中增减元素:   " y0 I: D$ D8 g1 e9 J( N9 y
> t:=[op(s),x];( q6 }" e) u! ]4 L
5 z2 `9 E- M; D& C
> u:=[s[1..5],s[7..nops(s)]];  f) D, c1 o( d* `

6 m0 V9 i$ |  Y8 g& Z& {Maple中集合的基本运算有交(intersect)、并(union)、差(minus):   $ s9 C' y' ~7 c" Y# `9 {1 N. b
> A:={seq(i^3,i=1..10)};B:={seq(i^2,i=1..10)};) I/ F. k. ]) x0 V
( @3 ^0 B! C9 f5 L; K1 G

5 _) T& y+ g; {% e; q4 p> A intersect B;
% G- ?  A: t5 A  c- L- i5 L
' L  I6 F1 s9 x4 c3 R0 M* u  [1 E> A union B; 1 j# ?: n& ^- X
+ g2 ^1 M' p) A" w. s( l
> A minus B;
( ~, k3 a( M; z5 @ # i5 ~. b' b7 X0 @
4.3 数组和表7 ^4 |) q% b( `  _  s% U' v
在Maple中, 数组(array)由命令array产生, 其下标变量(index)可以自由指定. 下标由1开始的一维数组称为向量(vector), 二维以上的数组称为矩阵(matrix). 数组的元素按顺序排列, 任意存取一数组的元素要比列表或序列快的多. 区分一个数据结构是数组还是列表要用“type”命令. 5 J/ g& j' K" [' U' P
    表(table)在建立时使用圆括号, 变量能对一个表赋值, 但一个在存取在算子中的未赋值变量会被自动地假定是表, 表的索引可以成为任意Maple表达式. 表中元素的次序不是固定的.
3 e9 ~2 X) F  w> A:=array(1..4);  g& h* e8 t: G: o1 U4 G
( m: n# ?& A% O8 p' j  [
> for i from 1 to 4 do A[i]:=i: od:( d- l  Q0 W' I; P
> eval(A);$ ?' r1 i$ Z# z# @8 g/ a$ h
, n% ^' C# o& Z/ x* o8 G" `4 u. g( ^
> type(A,array);% `7 u+ ~9 O4 P& S# H
4 b' Q0 }/ e& \3 o+ Z
> type(A,list);
: R3 c9 a. Z6 L+ i7 h; t: @! l7 | ) }: b+ G5 \- @* l. U
> T:=table();8 o$ Q1 F9 O  e, H8 H
2 E  p4 b, g( t0 a9 J) H+ H, q
> T[1]:= 1;0 r9 `  l- n$ n; V/ {
3 |6 m1 y3 g. O6 G6 @% i6 K* M
> T[5]:= 5;9 `1 t1 ~3 A, s4 `  s

1 E8 r3 k# s# U> T[3]:= 3;. v: ^( f6 U0 v  j* B
; d3 `. T/ ^; m& M8 x) S/ ?
> T[sam]:=sally;
& \: C7 Z- f2 u6 L   A7 t4 A6 R' W
> T[Pi]:=exp(1);9 v2 D/ {- ^; b/ C" @
" F6 t: d+ W5 E7 E7 u+ Q: t
> x:='x';; O4 i' p& i. Y5 p
3 V: H2 w1 a: w1 @7 w
> T[(1+x+x^3)*sin(x)] := 0;  L: y: g% k0 {0 Z% n  f

( t" N; ~; X5 v! O% b- i  {> eval(T);
! g/ c' x8 d2 {# }" [# G
8 C( Y" x$ q# c/ u% A. W> T[3]:='T[3]';
) z0 _6 C$ |, g9 G 3 [9 Q6 f+ L7 J7 e; q
> eval(T);
5 ]5 e: Q4 K( [0 j
7 T# l6 X8 `% N# K' {) r8 _- D4.4 其他数据结构! {( B: o2 |7 B$ u; m
串在Maple中是很重要的, 他们主要用于取名字和显示信息. 一个Maple的串可以作为变量名, 它们中的大多数是简单的、不需要加引号的串, 但是如果变量名中包含/. 例如“diff/T”则必须把变量名用引号括起来.
& c, B0 g3 [+ L, S% u3 U索引名是像Database[1,2,drawer]或A[3]这样的对象, 在使用索引前不需要直接建立表, 如果不得不做, Maple会自动建立表. 索引名通常被用于矩阵和向量. 为了保证Maple建立表的正确次序, 建议在赋值前直接建立.   l% F' b0 J+ V0 y
> x:=T[3];4 x, |* j8 S, B6 X& p
- j" v' O# e, U, z! ?
> eval(T);  n& H* s! F, ?8 `6 r
0 H; l1 B! i2 g8 O! d/ P
> T[5]:=y;+ F/ O, Z1 N  I4 Y
; `1 T3 q) V" S/ a6 a% I7 n6 B
> eval(T);7 ]9 x. s; w8 p& p) Z& i
  ~6 G8 X' E4 m! V
由此可见, Maple并不直接建立T的表, 直到给T[5]赋了值.     
! |5 v# ?8 p4 G/ ^3 N8 v5 j- \数值数据结构(整数、分数、有理数、浮点数、硬件浮点数和复数等)在它们的使用中是大量透明的. 浮点数是有传染性的, 这意味着如果数值结构中有一个是浮点数, 则整个结构自动转换为浮点数.
9 B& o& u2 a+ z" y4.5 数据类型转换和合并
4 b* l) r! T" I0 J: |6 M  Oconvert是一个功能强大的类型转换函数, 它可以实现列表和数组的类型转换:   
' y8 A! _, @: e# Q' I> L:=[1,2,3,4];
! y& W2 W7 E3 k8 n/ P& }2 Y 0 K* A  ]9 \) T; K/ i9 _- a, p
> type(L,list);9 H2 F) s0 g, C1 z) y3 `5 P
" L  m  Q* c  d
> A:=convert(L,array);5 p) P- L- T* \" C+ H' T; i. G
8 U/ G: W3 R: Q% T2 ]
> type(A,list);) I/ @: ^( T1 n5 [
  Q% h7 M2 L. n/ U8 ?4 [- A& k
> type(A,array);; \4 b5 K. p  @/ v

) F& a2 K1 {1 o另一个有用的函数zip则可把两个列表或向量合并:   
. Q6 ]: Y4 f( q- ]0 k>L:=[seq(i,i=1..10)];% f' |. J4 b2 f0 R( C2 |

" P- |4 B1 A( m8 e  @" ^5 I9 s) ^> Sqr:=(x)->x^2;' n- u  E8 g5 |! [

! c% \" B( j% I5 e, @( C9 g$ ~$ ~> M:=map(sqr,L);
: D( x  l4 j! K% H9 J1 `
1 j/ y4 P* i1 q' T1 `( c: M7 ]> LM:=zip((x,y)->[x,y],L,M);
- u, _& S8 T; {' g
: n. |. S; y$ I> map(op,LM);
0 j% ~+ x+ U; }8 Q ( D2 @, I# @0 O. X2 Z/ O- k
5 Maple高级输入与输出操作
9 t$ ?2 h; {5 ?: X' K& L1 `6 fMaple提供了良好的接口来编辑与计算数学式. 许多时候, 我们可能需要把Maple的运算结果输出到一个文件中, 或者在一个文本编辑器里先编好一个较大的Maple程序, 再将它加载到Maple的环境里.
9 r: I" z! y& {: |5 n" B* ^1 g5.1 写入文件
1 K% j# G* c0 `2 k4 h3 Z2 _5.1.1 将数值数据写入到一个文件/ m6 \$ O% ~9 M: B, N% |% D, W
如果Maple的计算结果是一长串的数值串行或数组, 而想把它写到一个文件时, 用writedata命令.
" M; M9 T1 A: O0 I. X9 G- c若Maple的计算结果data为集合、矩阵、列表、向量等形式时, 将其写入名为filename的文件时命令格式为: writedata("filename", data);
. l. @, q0 \, o9 x1 ?> with(linalg):+ N6 _& L# J4 H( Q% C* q3 {. ~+ p
> M:=matrix(3,3,[1,2,3,4,5,6,7,8,9]);! Q0 o) x% y% b1 {! o. X5 o8 i

1 N3 s! e2 |/ R+ Z- K/ _- |> writedata("e:\\filename.txt",M);
" G# u" a0 w0 ]; i: `1 C2 {而将结果附加在一个已存在的文件后时,使用命令: writedata[APPEND]("filename", data);
1 _1 N, V5 E: E8 {3 U( y> W:=matrix(2,2,[1,2,3,4]);; |& F( \* H, }) [
- ^. g  r$ m( q  ?
> writedata[APPEND]("e:\\filename.txt",W);
% g$ F  O7 U/ z& p( ]需要注意的是, 这里的APPEND是必需的, 否则W结果将会覆盖M结果.) h" }6 ^. U/ a  Z( E+ y7 s
另外, 若想将结果显示在屏幕上时, 用命令: writedata('terminal', data);
' O1 l. l& _# s  E$ \* W; {> writedata[APPEND]("e:\\filename.txt",W);
4 N8 ?- o6 J9 f; |9 [> writedata('terminal',M);$ o9 M) Q: j0 N/ }# @/ p
1                   2                   3           
" l# X, e! @2 g4 T, _4                   5                   6           ' i  B$ Z5 n: r3 U6 _/ n
7                   8                   9    ) U, D  G5 o6 l" g2 i
5.1.2 将Maple语句写入一个文件1 b! B: l  _' d$ }
如果所要写入文件的是表达式、函数的定义或者是一个完整的程序, 则使用命令save, 写入一个或多个语句的命令格式分别如下:! k3 H5 \4 r$ i0 U1 y/ `2 `
save name, "filename";- M1 _3 w- W* O/ F
save name1, name2, …, "filename";2 n7 t3 r7 f2 g3 i0 D
若filename的扩展名为.m, 则Maple会以内定的格式储存, 若扩展名为.txt, 则以纯文本文件储存. 以内定的格式储存的文件作纯文本编辑器无法读取, 但在大多数情况下, 它会比纯文本文件的加载速度更快, 且文件容量小.# F# H( C3 }$ m3 a. {9 N( A
> myfunc:=(k,n)->sum(x^k/k!,x=1..n);
7 e3 {7 W, P5 E( S" a4 r  G $ l# T/ n4 m0 R. |: i2 {
> myresult:=myfunc(6,8);# ^# W5 Z- P: r( E3 s1 f* K
+ |$ F$ A$ c* `+ _4 d0 u- E
> save myfunc,myresult,"e:\\test.m";& B( c- S0 o  H
调用已存m文件用命令read. 试看下述实验:: k4 t3 S2 a+ E( p
> restart:
- ]1 B" H% a7 ?5 y7 ]> myfunc(6,8);/ a+ J$ u6 W, l2 x1 Z# O. C

, C4 b; y7 {* V) v' C> read "e:\\test.m";3 V( P$ G* V8 ^6 G; z& O" \0 u9 l
> myfunc(6,8);" g; @& `$ A6 @4 \. v7 E
5 I4 R1 n% P. N5 O& e1 M/ P
> myresult;' c# Q4 ~, p* k
* s) H. Y0 X" v0 F' _9 f5 {
    而存为txt文件时则将整个语句存为一个文件:$ L3 {, z8 N& R) n
> save myfunc,myresult,"e:\\test.txt";% `6 ?6 X# ?/ T+ M6 _$ ]  I) |
> restart: read"e:\\test.txt";
$ Z7 z8 O& t4 [2 Z4 E6 m% h( Y 7 i( {8 y1 C6 f9 d* V+ q
, |- t# N" Y9 P
5.2 读取文件& Q  w; S" a0 @4 t0 m9 ]. R0 V' n
在Maple里最常用的两个读取文件的命令, 一个是读取数值数据, 另一个是是读取Maple的指令.5 P( p- a' l& U: p  o
5.2.1 读取数值数据" l7 k* w# `; g1 I0 G" `6 I
如果想把大量的数据导入Maple里进行进一步的运算或者要运用大量的实验数据在Maple环境绘图时, 可以用readdata( )命令完成.  b! G$ C! d+ s  z3 c, h; {
从filename文件里读取n行数据时使用命令: readdata("filename",n);! n) G0 m. x. ?* v
以指定的格式读取数据时使用命令: readdata("filename",[tyep1,type2,…]);& X/ O! ]$ N; a3 }9 _, T
> readdata("e:\\filename.txt",3);
$ `, }4 @( d2 f3 c! O, f
  j# J) j- h! J& S, S3 k8 N' T- V+ P7 ^    读取filename的前三列, 第一列为整数形式, 第二、三列为浮点数形式:
) Q; b# L8 x+ @' c; \- ]> readdata("e:\\filename.txt",[integer,float,float]);5 V$ g9 Q4 O" |6 D  P
& w& g* Q6 B; j( j
下面再看一个运用大量的实验数据在Maple环境绘图的实验:
: G2 h7 L, b$ o8 ~! f> mypts:=[seq([x/1000,cos(x^2/100000)],x=1..1000)]:  I# E/ z/ Y& A, j
> writedata("e:\\data.txt",evalf(mypts));4 x+ A# i7 U, g0 j- S4 p
> dots:=readdata("e:\\data.txt",100):6 Z2 T# I8 C2 ^4 l
> nops(dots);; o8 L* ]# C9 e* a9 l

8 u2 j; G# h6 b0 y0 V, _> dots[1..4];7 F* a: K( g4 ~- T( Q, G
+ _( M: B2 e) Q" s/ ], P
> plot(dots,style=line);' j. r/ ?% y0 B
  U2 [" o/ V9 F6 W+ z
5.2.2 读取Maple的指令$ x( \1 }. {2 q: r" T( K& ]
在编写程序时, 在普通软件中先编好程序再将其读入Maple环境中常常比直接在Maple中编写更为方便. 如果要将程序代码或Maple指令加载用read命令:
- s3 f) j6 |8 _% ?8 g' J( Bread "filename";
( S; \, t- ~* D6 B如下例:" v1 T/ o: h: I5 H7 X& X' E
> reatart:0 C7 N! ]/ E2 \7 M8 d; U; t
> myfunc:=(a::list)->add(i,i=a);
3 M. y4 A7 E- k, O- |7 G % [: ~& H( Q& K6 a0 y
> avg:=(a::list)->myfunc(a)/nops(a);, B( Y% K6 g! V) j/ P
. E; h% Z# W' ~  F' i7 M, `: K
> save myfunc,avg,"e:\\function.m";8 o( i' \2 m2 F" c
> restart:
; K3 E$ G, E, ~1 t  q- R> read "e:\\function.m";
" ^! z& Y1 A5 T8 Z> myfunc([1,2,3,4,5,6,7,8,9]);: S8 S. i8 [  X$ G4 t
( V5 @% U- s1 b) k2 I) z2 I+ w
> avg([1,2,3,4,5,6,7,8,9]);: L& b* a6 c# G+ Y6 J, W: a' k! {
1 ~+ c4 W% l/ I; U6 {5 D+ U) g
5.3 与其它程序语言的连接
- ?% c6 J( |; c1 z5.3.1 转换成FORTRAN或C语言
- G/ d- ^- T, x0 F, m调用codegen程序包中的fortran命令可以把Maple的结果转换成FORTRAN语言:
3 ~/ `, X* }+ p7 Z" z/ Q* r> with(codegen,fortran):
% V; h2 G  M1 A9 D4 e$ q) p/ e' Nf:= 1-2*x+3*x^2-2*x^3+x^4;
- z- r) U/ A: a1 j) J4 I
# e2 a( a7 M! n1 Y0 `( S. d> fortran(%);
* x; M+ ]" A# O$ R6 D4 s6 G      t0 = 1-2*x+3*x**2-2*x**3+x**4
% `3 y3 |( I/ z$ o% @' n > fortran(f,optimized);& H( ^: h6 y- c$ U7 W! V
      t2 = x**2# C( L, E& X6 y& [7 c% f3 m
      t6 = t2**2% z. u! c& _& U! q- `
      t7 = 1-2*x+3*t2-2*t2*x+t6" W4 z% l& m) ]: Y$ P
> fortran(convert(f,horner,x));! J7 m& b: @  {* g4 d5 m1 F; ?; ?* E
      t0 = 1+(-2+(3+(-2+x)*x)*x)*x
; B* T9 D$ B" p& l* V/ N. [而codegen程序包中的C命令可以把Maple结果转换成C语言格式:. x' z) m& I9 f9 E8 V' E. f
> with(codegen,C):
( G/ M$ M5 e% d% S+ |2 o. Hf:=1-x/2+3*x^2-x^3+x^4;
7 ]8 V& e1 a& A  M( P 0 Y. l% l8 n0 M5 }, l" }/ r
> C(f);
$ n9 U6 V- w/ S+ Y      t0 = 1.0-x/2.0+3.0*x*x-x*x*x+x*x*x*x;
& R# ]; D) t5 h' f5 R9 n> C(f,optimized);1 x  G" B7 [* l( U
      t2 = x*x;
3 H) E+ c7 t- c- Y$ y- q      t5 = t2*t2;
* X) D7 k# v# k      t6 = 1.0-x/2.0+3.0*t2-t2*x+t5;/ K+ [( B  P5 T& @' Z' H
optimized命令表示要对转换的表达式进行优化, 如果不加此可选参数, 则直接对表达式进行一一对应的转换.
" t! D+ l- [: j& j% o% N$ L5.3.2 生成LATEX
* g. J2 M; @+ L- j9 O! }/ WMaple可以把它的表达式转换成LATEX, 使用latex命令即可:9 _  @2 h2 f& w
> latex(x^2+y^2=z^2);* [9 I8 @$ x" U
{x}^{2}+{y}^{2}={z}^{2}
1 W7 x2 J8 i$ t% h9 W    还可以将转换结果存为一个文件(LatexFile):  x# Z8 f8 |5 a1 D$ s
> latex(x^2 + y^2 = z^2, LatexFile);
. Q  ?1 F! o% F- u' X    再如下例:4 B2 [7 l, v! V+ I" I+ R
> latex(Int(1/(x^2+1),x)=int(1/(x^2+1),x));% y) e( i: l! `2 c5 A: |
\int \! \left( {x}^{2}+1 \right) ^{-1}{dx}=\arctan\left( x \right)7 K, A4 e! ?; K$ {5 O( J4 d' |
( G# F! [' N. L) P8 N2 C
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年!
    ; V- F( Z. m" c+ s+ S
    9 R  h4 I8 y& g" H3 `8 r
    ! B8 q' v' {. d
    回复

    使用道具 举报

    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-11-2 21:17 , Processed in 0.861217 second(s), 100 queries .

    回顶部