QQ登录

只需要一步,快速开始

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

maple基础

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

1

主题

5

听众

4

积分

升级  80%

该用户从未签到

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

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

3 j$ z* U3 A. i' H6 F% _
1 J1 @* V7 y# x7 e+ a% C 2 I# _8 P$ R+ I+ x

5 B# O+ r3 X* x
$ Z% K. Y* O8 s $ Z! @* _3 g! W
! K; d+ d$ d+ R* m2 Y% d

+ o) m. x; @0 Y2 H5 l. v% }2 U, ]
, ?9 l9 t: z5 ]( n% f
9 j8 u* F6 a. | ( E& ]& b) b8 A- s
% F6 T( o9 H4 b& W9 G& n

4 \3 W  F7 U: walpha        beta        gamma        delta        epsilon        zeta        eta        theta        iota        kappa        lambda        mu( l- s7 X! r( s+ e

" E" o  U3 o1 `) Z2 d, M6 D
, Z! i' {0 ^. p! ^. \ % o% B& c* U( T+ X( J2 p

2 e! f% u' c5 Q  P ! J# h3 p0 v7 t2 u0 F
) x& W+ b0 J' T9 V% C

/ U" ~7 x! S3 ?+ z  w" m5 c' { / J0 f. {/ K7 i0 X5 V6 r

/ s/ \( [) d9 L# Q. s5 J & f4 t: r! i# i4 n

7 k' P& z! G1 }
  z& Z# \' r  u3 W( E6 Y9 I$ ^0 i) s# c6 E+ \: B
nu        xi        omicron        pi        rho        sigma        tau        upsilon        phi        chi        psi        omega" F( n( g* J+ e1 Z
有时候为了美观或特殊需要,可以采用Maple中的函数或程序设计方式控制其输出方式,如下例:
4 l0 F& o' V( O> for i to 10 do
5 Z4 U8 `$ X7 x" }' W. z2 L$ w8 t8 Wprintf("i=%+2d and i^(1/2)=%+6.3f", i, eval(sqrt(i)));4 ?  O5 i! W- E8 w. e+ @8 f5 R( C
od;
+ q4 I% T2 N1 R* A6 Ji=+1 and i^(1/2)=+1.000i=+2 and i^(1/2)=+1.414i=+3 and i^(1/2)=+1.732i=+4 and i^(1/2)=+2.000i=+5 and i^(1/2)=+2.236i=+6 and i^(1/2)=+2.449i=+7 and i^(1/2)=+2.646i=+8 and i^(1/2)=+2.828i=+9 and i^(1/2)=+3.000i=+10 and i^(1/2)=+3.162
) H9 P- M" i1 k5 v+2d的含义是带符号的十进位整数,域宽为2. 显然,这种输出方式不是我们想要的,为了得到更美观的输出效果,在语句中加入换行控制符“\n”即可:
( Q! a1 t! p# `- d> for i to 10 do 4 h: x# `5 F" l+ m1 L6 ]& E
printf("i=%+2d and i^(1/2)=%+6.3f\n", i, eval(sqrt(i)));( |4 Z& v+ ~( q: g: ~
od;6 |: a7 G4 {# F% p8 F+ k
i=+1 and i^(1/2)=+1.000* U% V4 }, r$ G( x; i
i=+2 and i^(1/2)=+1.414% S5 {$ I& \( e2 D
i=+3 and i^(1/2)=+1.732
+ \  f/ z  S3 |/ h/ k$ ~' zi=+4 and i^(1/2)=+2.000, o8 a) C! H' m
i=+5 and i^(1/2)=+2.236
0 t$ Z6 o1 |# F2 d" Q0 [! r" ~% ii=+6 and i^(1/2)=+2.4496 o/ X: N1 j$ m# `
i=+7 and i^(1/2)=+2.646
) A8 b+ }# b1 f- N$ Ti=+8 and i^(1/2)=+2.828
9 @( V- g) w' z' Ti=+9 and i^(1/2)=+3.000  M- l9 }! C9 m# N0 E3 o
i=+10 and i^(1/2)=+3.162
( n3 @: }1 N4 D( k/ s' i/ a. A; }7 |再看下例:将输入的两个数字用特殊形式打印:+ s2 K  C% q9 a4 p
> niceP:=proc(x,y)
7 e, m$ Y3 K! E6 D; Jprintf("value of x=%6.4f, value of y=%6.4f",x,y);
/ v- E, A& D3 P9 D7 S% q! B: x$ Hend proc;+ K7 A. Z! K, y% `9 Y# Y- c
6 F2 M8 x" @2 J" F" K
> niceP(2.4,2002.204);
% L  F: j' Z$ r, `, x% [9 avalue of x=2.4000, value of y=2002.2040% Z8 K; @2 c5 T$ k
1.4 Maple联机帮助  ?" K- s/ `1 \3 V
学会寻求联机帮助是掌握一个软件的钥匙. Maple有一个非常好的联机帮助系统, 它包含了90%以上命令的使用说明. 要了解Maple的功能可用菜单帮助“Help”, 它给出Maple内容的浏览表, 这是一种树结构的目录表, 跟有…的词条说明其后还有子目录, 点击这样的词条后子目录就会出现(也可以用Tab键和up, down选定). 可以从底栏中看到函数命令全称, 例如, 我们选graphics…, 出现该条的子目录, 从中选2D…, 再选plot就可得到作函数图象的命令plot的完整帮助信息. 一般帮助信息都有实例, 我们可以将实例中的命令部分拷贝到作业面进行计算、演示, 由此可了解该命令的作用.
  d2 P. ^& w/ s& \/ G在使用过程中, 如果对一个命令把握不准, 可用键盘命令对某个命令进行查询. 例如, 在命令区输入命令“?plot”(或help(plot);), 然后回车将给出plot命令的帮助信息, 或者将鼠标放在选定的要查询的命令的任何位置再点击菜单中的“Help”即可. 8 s8 K2 R7 G6 M: [, O
2  Maple的基本运算
; P2 N4 i8 z$ I/ E4 W8 [2.1 数值计算问题2 m, D! J/ |  X6 r- j
算术是数学中最古老、最基础和最初等的一个分支, 它研究数的性质及其运算, 主要包括自然数、分数、小数的性质以及他们的加、减、乘、除四则运算. 在应用Maple做算术运算时, 只需将Maple当作一个“计算器”使用, 所不同的是命令结束时需加“;”或“:”. 6 [: E/ I- U! f1 b% q
在Maple中, 主要的算术运算符有“+”(加)、“–”(减)、“*”(乘)、“/”(除)以及“^”(乘方或幂,或记为**), 算术运算符与数字或字母一起组成任意表达式, 但其中“+”、“*”是最基本的运算, 其余运算均可归诸于求和或乘积形式. 算述表达式运算的次序为: 从左到右, 圆括号最先, 幂运算优先, 其次是乘除,最后是加减. 值得注意的是, “^”的表达式只能有两个操作数, 换言之,  是错误的, 而“+”或“*”的任意表达式可以有两个或者两个以上的操作数.
% K+ R5 j. h0 w- s: D3 {, Y2 uMaple有能力精确计算任意位的整数、有理数或者实数、复数的四则运算, 以及模算术、硬件浮点数和任意精度的浮点数甚至于矩阵的计算等等. 总之, Maple可以进行任意数值计算. 3 \  t* R, v% J$ H5 a7 q2 B% ?
但是, 任何软件或程序毕竟只是人们进行科学研究的一种必要的辅助, 即便它有很多优点, 但也有它的局限性, 为了客观地认识数学软件、认识Maple, 下面通过两个简单例子予以说明. ' s& k) w' \8 U! e2 D% \+ c) G7 A9 }
第一个简单的数值计算实例想说明Maple数值计算的答案的正确性:   
. t& p) x# [- D' y> 3!!!;/ C7 P0 A; m6 m. s
2601218943565795100204903227081043611191521875016945785727541837850835631156947382240678577958130457082619920575892247259536641565162052015873791984587740832529105244690388811884123764341191951045505346658616243271940197113909845536727278537099345629855586719369774070003700430783758997420676784016967207846280629229032107161669867260548988445514257193985499448939594496064045132362140265986193073249369770477606067680670176491669403034819961881455625195592566918830825514942947596537274845624628824234526597789737740896466553992435928786212515967483220976029505696699927284670563747137533019248313587076125412683415860129447566011455420749589952563543068288634631084965650682771552996256790845235702552186222358130016700834523443236821935793184701956510729781804354173890560727428048583995919729021726612291298420516067579036232337699453964191475175567557695392233803056825308599977441675784352815913461340394604901269542028838347101363733824484506660093348484440711931292537694657354337375724772230181534032647177531984537341478674327048457983786618703257405938924215709695994630557521063203263493209220738320923356309923267504401701760572026010829288042335606643089888710297380797578013056049576342838683057190662205291174822510536697756603029574043387983471518552602805333866357139101046336419769097397432285994219837046979109956303389604675889865795711176566670039156748153115943980043625399399731203066490601325311304719028898491856203766669164468791125249193754425845895000311561682974304641142538074897281723375955380661719801404677935614793635266265683339509760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
' l3 }2 `" I3 B+ `! I1 `$ i4 ~上述运算结果在IBM PC机(1G, 128M)上计算只需要0.01秒, 得到如此复杂的结果(1747位), 一个自然的问题是: 答案正确吗?
& n+ X% D9 t9 D: z/ I& J, S* A为了回答这个问题, 我们借助于数值分析方法, 由Stiring公式. x1 X- M$ z1 z6 u  E" [9 i5 T- j

) T- w. k8 W. Q8 R: g可得:  , 前三位数字与Maple输出结果相同, 且两者结果均为1747位. 另外, 在720!的计算中, 5的因子的个数为:   1 `8 [; `: l) m

# X& i3 c$ y$ D: }这些5与足够多的2相乘将得到178个0, 而Maple的输出结果中最后178位数为零. 由此, 可以相信Maple结果的正确性. 2 O3 ]9 z2 @/ B9 |6 M& i$ T; C% A
另一个例子则想说明Maple计算的局限性:   
1 a4 \% t3 d) W' r+ p  
% J/ k* c" \  X5 X4 U; S' @Maple在处理问题时, 为了避免失根, 从不求算术式的近似值, 分数则化简为既约分数. 因此, 在Maple中很容易得到:   
! o2 P( |. n4 {: h! P* W
+ T% I7 Z& A) B- f# L显然这是错误的. 这一点可以从代数的角度予以分析. , n: w/ b/ @' |6 E# P+ H& u, h, v3 v
不妨设 , 则 , 即 , 显然 有3个结果, -2是其实数结果.
7 T- l2 s: ~2 y, {2 a1 y# k7 f0 U另一方面, 设 , 则 , 即:9 \5 q" s- ]6 v( A. Q* n9 a
9 l/ p6 g; h/ X5 L; B& R
显然 有6个结果, -2、2是其实数结果.
4 p7 W7 m0 U9 g' z, w* K这个简单的例子说明了Maple在数值计算方面绝对不是万能的, 其计算结果也不是完全正确的, 但是, 通过更多的实验可以发现: Maple只可能丢失部分结果, 而不会增加或很少给出完全错误的结果(如上例中Maple的浮点数结果皆为 ). 这一点提醒我们, 在利用Maple或其他任何数学软件或应用程序进行科学计算时, 必须运用相关数学基础知识校验结果的正确性.
: I- B. O6 B/ M4 o1 b1 K( k尽管Maple存在缺陷(实际上, 任何一个数学软件或程序都存在缺陷), 但无数的事实说明Maple仍然不失为一个具有强大科学计算功能的计算机代数系统. 事实上, Maple同其他数学软件或程序一样只是科学计算的一个辅助工具, 数学基础才是数学科学中最重要的. $ W9 o2 y' z6 \: P7 e
2.1.1 有理数运算
. X- G( K# M% \作为一个符号代数系统, Maple可以绝对避免算术运算的舍入误差. 与计算器不同, Maple从来不自作主张把算术式近似成浮点数, 而只是把两个有公因数的整数的商作化简处理. 如果要求出两个整数运算的近似值时, 只需在任意一个整数后加“.”(或“.0”), 或者利用“evalf”命令把表达式转换成浮点形式, 默认浮点数位是10 (即: Digits:=10, 据此可任意改变浮点数位, 如Digits:=20).
  N# u0 W5 y8 U* }* x> 12!+(7*8^2)-12345/125;( Y* h' e6 P4 E, P  n' T2 j1 O" f2 Q. ?

$ D+ ]5 k: X1 ?6 A: D* L+ w> 123456789/987654321;
& f5 d+ w& E6 j# j3 O, |. h7 f& M( v - P3 f# w- h, J
> evalf(%);0 ^6 g  N- F+ I5 D, r6 C7 q/ L: f

7 D% G, p9 K+ W> 10!; 100*100+1000+10+1; (100+100)*100-9;
- w. U- \& V+ C8 S0 V 1 ^; P2 ]1 F) [" I

+ l5 b) ?. s$ ^9 g9 C5 ? * ~% x0 C; N, j" d# d2 z
> big_number:=3^(3^3);3 g, S! z  T! k5 g  \
  E6 F7 p: A! b$ U
> length(%);
, Z9 K( X4 g" X- t$ {; j$ [# U8 _
& r. T" ~- N8 j6 Q$ U& Z% H# x* p上述实验中使用了一个变量“big_number”并用“:=”对其赋值, 与Pascal语言一样为一个变量赋值用的是“:=”. 而另一个函数“length”作用在整数上时是整数的十进制位数即数字的长度. “%”是一个非常有用的简写形式, 表示最后一次执行结果, 在本例中是上一行输出结果. 再看下面数值计算例子:   ! Q& K6 p5 q6 }+ f/ G! g4 j( O% c6 E
    1)整数的余(irem)/商(iquo)
' I; @3 G, U3 ]4 B3 D( G; r, O命令格式:   
9 ]3 i  ?, E' C* \/ Jirem(m,n);        #求m除以n的余数
0 Z' Z) I$ V. A" o0 \irem(m,n,'q');    #求m除以n的余数, 并将商赋给q
4 W: V/ W8 B  g: |" A, G7 [* Kiquo(m,n);        #求m除以n的商数
6 g) _7 H. b- K) ?! l0 ~iquo(m,n,'r');    #求m除以n的商数, 并将余数赋给r: b0 u; {( U7 j, ^4 b5 u
其中, m, n是整数或整数函数, 也可以是代数值, 此时, irem保留为未求值. . ]3 S# X6 u. E7 E; c& c1 L
> irem(2002,101,'q'); # 求2002除以101的余数, 将商赋给q: j1 g; G1 \+ q3 w1 P

  n7 f# K7 I" x# N! }( @3 Z> q; #显示q
1 a) n9 f' u& P5 @& u- z' ~3 D9 j7 N
# z# R- X/ ?/ w/ {; X% K> iquo(2002,101,'r'); # 求2002除以101的商, 将余数赋给r
  r0 r5 I, v+ U) v0 X6 c
: ?" P9 i: g/ V6 Y, y> r; #显示r: e6 Z5 i) W2 W
1 d( ~) C1 w0 W0 L# C
> irem(x,3);2 @  i+ ^) G2 W) q( ^$ n
0 k( H, E$ D! t  H+ U, l
2)素数判别(isprime)
9 C, |* ~, p; D5 o! z. d素数判别一直是初等数论的一个难点, 也是整数分解问题的基础. Maple提供的isprime命令可以判定一个整数n是否为素数. 命令格式: isprime(n);
7 D( C; T& O8 X6 U5 |    如果判定n可分解, 则返回false, 如果返回true, 则n“很可能”是素数.
0 P. S! H2 O; C/ u5 `5 F: z  D> isprime(2^(2^4)+1);7 i1 K" F1 {! [6 n- i% }
) L. j( A7 A: u6 x
> isprime(2^(2^5)+1);
+ ]6 l4 ?# u- A& l, M. s 3 {/ m+ U7 C9 Z  y$ P( |% Z% U& B
上述两个例子是一个有趣的数论难题。形如 的数称为Fermat数, 其中的素数称为Fermat素数, 显然, F0=3、F1=5、F2=17、F3=257、F4=65537都是素数. Fermat曾经猜想所有的Fn都是素数, 但是Euler在1732年证明了F5=641•6700417不是素数. 目前, 这仍是一个未解决的问题, 人们不知道还有没有Fermat素数, 更不知道这样的素数是否有无穷多. * I2 `# A7 P, g4 f
3) 确定第i个素数(ithprime)
5 o" A9 A/ s0 k  m& p' q# k( r若记第1个素数为2,判断第i个素数的命令格式: ithprime(i);   
& b, q! B& k) z9 Y' T> ithprime(2002);
5 J1 Q  a4 F: k* z4 m4 l ' m* D% H3 V' ^! D
> ithprime(10000);+ x$ k, n& k% {
1 D: ~1 @4 o* r, J% m
4) 确定下一个较大(nextprime)/较小(prevprime)素数
" g, F8 V( f, u  O$ a当n为整数时,判断比n稍大或稍小的素数的命令格式为:   
, A$ g; O2 l( K6 V, Onextprime(n);  
% i4 I# |) N6 s7 Q1 I# ~prevprime(n);
- A. M7 W7 u6 n5 m> nextprime(2002);
. {* K3 I9 I. r1 L
) v" p/ A: ?$ r9 L2 Z. P* C1 D> prevprime(2002);) i( S3 i. G( M& C: g
' k+ K$ @3 a* p  F
5) 一组数的最大值(max)/最小值(min)
5 P& `' l$ y8 N+ r. x! Z命令格式: max(x1,x2,…,xn);   #求x1,x2,…,xn中的最大值9 a! d8 i5 q1 P0 N% V4 ^
             min(x1,x2,…,xn);   #求x1,x2,…,xn中的最小值
5 H) @" U& E5 W; f> max(1/5,ln(3),9/17,-infinity);
2 f5 q: W4 t6 [4 I& j- w) T
/ i1 w  d, K9 I2 e" E: y* H4 S: L> min(x+1,x+2,y);
. u5 I2 R0 v9 `/ ]* V * M# n, e- p( s! Z8 w
6)模运算(mod/modp/mods)# ^6 M8 Y$ n0 c, u) q
命令格式:  e mod m;    # 表达式e对m的整数的模运算
. J$ u1 y: y8 K1 P2 O. A! ^modp(e,m);  # e对正数m的模运算
& M1 K& m% C) O. f4 g, L7 Ymods(e,m);  # e对m负对称数(即 -m)的模运算
$ V# b/ X  g  l  {`mod`(e,m);  # 表达式e对m的整数的模运算, 与e mod m等价7 K8 g/ {( E( Y" Q8 \; i  v
值得注意的是, 要计算i^n mod m(其中i是一整数), 使用这种“明显的”语法是不必要的, 因为在计算模m之前, 指数要先在整数(可能导致一个非常大的整数)上计算. 更适合的是使用惰性运算符“&^”即: i &^n mod m, 此时, 指数运算将由mod运算符智能地处理. 另一方面, mod运算符的左面优先比其他运算符低, 而右面优先高于+和-, 但低于*和/.
0 `" B2 p7 @, b> 2002 mod 101;
: i9 |) ^6 n3 ~2 t0 }$ Z 0 K$ ~7 a$ |3 _# t: z! v
> modp(2002,101);6 Q5 e% m$ L- ~
' D2 }8 Q( [1 U  i$ T/ k* W
> mods(49,100);
3 A* B! ~% S: h) y2 i4 A+ a- c7 m 3 V9 m0 P/ G+ o, d1 L: h5 a8 i
> mods(51,100);
& L# O2 z% a7 o3 H1 _! p: X* U& a
* X7 c& O" O( L3 C+ c& V> 2^101 mod 2002;  # 同 2 &^101 mod 2002;
' _! s9 h+ q7 A2 s- P+ _- P ) R! M9 h1 |3 R5 X5 x. v& J
7)随机数生成器(rand)
, u% o8 z( c0 v6 E- Q命令格式:   
7 I1 L1 l$ w1 p9 |! @- nrand( );    #随机返回一个12位数字的非负整数/ W* e- q0 I2 b2 g$ j: N
rand(a..b);  #调用rand(a..b)返回一个程序, 它在调用时生成一个在范围[a, b]内的随机数: ^* O( n( B# w
> rand();8 M2 v8 z' |+ |+ i+ {" M6 R/ w8 l

1 K- x; R/ B1 p& N+ I> myproc:=rand(1..2002):
5 |5 `( R. d3 G- P9 C> myproc();! g4 ]2 Y5 V: w( v& q# `" b+ n2 V

* U. m: N4 Y. Q, H0 A> myproc();# b- }* X: G6 `) p: h6 o

0 w* l. s  c! {" y( t1 r    注意, rand(n)是rand(0..n-1)的简写形式.
6 f8 B% R' Y; d& S( d6 e* F2.1.2 复数运算
, \% P, f4 @! w2 T3 B5 O& |" O复数是Maple中的基本数据类型. 虚数单位i在Maple中用I表示. 在运算中, 数值类型转化成复数类型是自动的, 所有的算术运算符对复数类型均适用. 另外还可以用Re( )、Im( )、conjugate( )和argument( )等函数分别计算实数的实部、虚部、共轭复数和幅角主值等运算. 试作如下实验:   ; R: \+ @2 z( z) o1 ]. n! p% x
> complex_number:=(1+2*I)*(3+4*I);
1 N' R, t5 @1 m6 \ 2 G! O5 m* y# M
> Re(%);Im(%%);conjugate(%%%);argument(complex_number);
! C" L+ ]2 I2 F( N9 [ * F1 s: B7 W5 ?: S0 C' }

/ {, w- c- I( j1 ~* p( j$ {: E  y6 t  @
. ~# f6 `& o" q! U8 J0 a
' O, F4 f. @; s9 _4 z2 c; D6 J9 {值得注意的是上行命令中均以“;”结束, 因此不能将命令中的2个%或3个%(最多只能用3个%)改为1个%, 因为%表示上一次输出结果, 若上行命令改为“,”结束, 则均可用1个%. 8 C7 S) c! Y1 E, h/ r
为了在符号表达式中进行复数运算, 可以用函数evalc( ), 函数evalc把表达式中所有的符号变量都当成实数, 也就是认为所有的复变量都写成 的形式, 其中a、b都是实变量. 另外还有一些实用命令, 分述如下:   
& `3 I6 `) e  t# p1) 绝对值函数9 O. C7 s7 r. s; u
命令格式: abs(expr);  
) K- C( ]' j% a+ w! t# ^当expr为实数时,返回其绝对值,当expr为复数时,返回复数的模.* z! ]8 l; F6 B4 K7 u/ k7 n3 F
> abs(-2002);    #常数的绝对值
2 W: i7 f- a% I% i ( K! o$ K8 ~- i  G
> abs(1+2*I);   #复数的模
3 Z8 [2 X7 C9 s- W$ U
( z7 q  K3 n: _: v) s> abs(sqrt(3)*I*u^2*v);  #复数表达式的绝对值
, Q0 G1 c4 o! m1 P( R 9 u2 R' o, R% a" _
> abs(2*x-5);   #函数表达式的绝对值; U9 P7 s' B  ?; S& Z

6 ?6 l9 x: }5 R; U. O2)复数的幅角函数
; \+ V- O! D! ^- V6 c6 j命令格式:   argument(x);  #返回复数x的幅角的主值
2 b. W% W( `0 f" D> argument(6+11*I);
4 _5 `! \+ A* [6 U# w, t: N
; Q# k. {; W9 \/ B- f7 x> argument(exp(4*Pi/3*I));$ ]) W/ w2 R# p4 v3 g
/ ^* r* I& Q5 S4 m1 t' C
3)共轭复数
4 j+ r* N: B* z3 S1 T  D命令格式:   conjugate(x);  #返回x的共轭复数
3 M+ \) T" q# W% ]* |3 D. l) b) }> conjugate(6+8*I);% C- u3 ]" T, v8 X. Z, {* ~
& W  P5 }% N$ J4 B
> conjugate(exp(4*Pi/3*I));
0 \& C+ K) E) Z% w2 O1 t  E9 ?; Z' F
& ^" R. }' q) ~1 ]8 o6 a! k1 |2.1.3 数的进制转换
1 _7 Y9 l/ n* o/ v' j6 \数的进制是数值运算中的一个重要问题. 而在Maple中数的进制转换非常容易, 使用convert命令即可.
7 U) A: I4 W& R命令格式:   convert(expr, form, arg3, ...);   
$ N* e, A; w" K其中, expr为任意表达式, form为一名称, arg3, ... 可选项.
. z9 c2 ]6 p" i7 R( y; \下面对其中常用数的转换予以概述. 而convert的其它功能将在后叙章节详述. 1 b) ?0 m' j  w& S
    1)基数之间的转换$ x% X3 e: \3 @& h5 i
命令格式:   
; S8 R  z: O" U7 `6 ]. o" fconvert(n, base, beta);      #将基数为10的数n转换为基数为beta的数
5 m- L* M$ f: K8 ~, n: K# p% {9 x0 f    convert(n, base, alpha, beta);#将基数为alpha的数字n转换为基数为beta的数# l5 b2 n- K5 `" S/ ]4 ]/ ]/ j8 `
> convert(2003,base,7); #将10进制数2002转换为7进制数, 结果为: (5561)7
+ Q, [- S2 W& L: Z! [# P
# \4 J4 @! B  H, W9 i9 Z) q> convert([1,6,5,5],base,7,10); #将7进制数5561转换为10进制数
: {% \. h' h+ m: g( J9 u. V # V9 ~7 k  z' z( d+ R2 D
> convert(2002,base,60);       #将十进制数2002转换为60进制数, 得33(分钟)22(秒)( c  i- b# q2 l/ [+ h% L" K
. A( V' ^. r4 B
    2)转换为二进制形式
  K; H# t" s" H( g  p% f命令格式: convert(n, binary);
# m7 L' r2 p% `* f4 c) P1 E其功能是将十进制数n转换为2进制数. 值得注意的是, 数可以是正的, 也可以是负的, 或者是整数, 或者是浮点数, 是浮点数时情况较为复杂.
& ]* C! N- g, s7 N) z. j& y> convert(2002,binary);   2 m1 X2 P1 ~- s% J" i) c6 E: a
, |* ?3 \; Y$ v2 b- T
> convert(-1999,binary); 3 p+ t' z- ]6 q' |+ e

* K+ P/ Z" g. X3 o5 f( ~> convert(1999.7,binary);
$ |7 R' v  F+ }. }$ G' k   p' ~5 P1 X& B- ]% o
3)转换为十进制形式- Z) j' n3 `. T. n
其它数值转换为十进制的命令格式为:   
; T2 c- o- ^# D2 v! c. fconvert(n, decimal, binary);   #将一个2进制数n转换为10进制数
# X+ l, }$ t" s# u0 M* p& U    convert(n, decimal, octal);    #将一个8进制数n转换为10进制数
1 L7 o4 q& I2 X2 |2 [" d    convert(string, decimal, hex);  #将一个16进制字符串string转换为10进制数7 x9 m: G0 {  ?  B, @1 Y& |
> convert(11111010010, decimal, binary);   
1 y0 y" H. N9 n3 W5 P$ }5 k% o7 X
3 }* D# n( c* V: q3 G  [> convert(-1234, decimal, octal);           
/ V* C' l6 _7 `% S& _
8 ]$ l6 _/ o, Q' N9 n1 g9 ]> convert("2A.C", decimal, hex);         
5 v0 Q/ W2 p9 ]$ }. s
9 }/ a3 r5 _* G/ a( [4 N; T/ c0 B4) 转换为16进制数8 F( Q" ~- Y) [% O
将自然数n转换为16进制数的命令格式为: convert(n, hex);   
) _# H  r; W4 x% Y5 ?) y) b* N> convert(2002,hex);  convert(1999,hex);" N2 q4 t, Q% I: K2 X
1 L7 `" C& @% Q

* q- {; _& I3 Y+ O  k3 H5)转换为浮点数9 E& T1 B: F  ]2 Y
命令格式: convert(expr, float);
: `3 N% ~" v3 c& O注意, convert/float命令将任意表达式转换为精度为全局变量Digits的浮点数, 且仅是对evalf的调用. . a, U8 b  m" N  j* X
> convert(1999/2002,float);# Q( l/ z& `1 N! n: E

! B  O4 A6 `. T# _. @2 ?/ e7 T> convert(Pi,float);, Y& ?9 \4 Y* ]- ?  {

! R" d" ~/ J( R) `$ T5 }+ j2.2 初等数学$ n, l) T5 i: o: E& W
    初等数学是数学的基础之一, 也是数学中最有魅力的一部分内容. 通过下面的内容我们可以领略Maple对初等数学的驾驭能力, 也可以通过这些实验对Maple产生一些感性认识. 2 q5 S2 \7 I6 s4 T  Q+ e
2.2.1 常用函数4 J) Q! o+ Y1 m
作为一个数学工具, 基本的数学函数是必不可少的, Maple中的数学函数很多, 现例举一二如下:   " H6 _* ?0 D+ y+ n
指数函数: exp
7 x5 [# ?- ^. {) o8 g0 X* @一般对数: log[a]( i4 d6 ^( `  U8 ]$ \
自然函数: ln
/ k1 P! [# H. h* B/ M. d1 U3 u3 }0 ^% m常用对数: log10) e+ g( A/ N" U/ `* q
平方根: sqrt
1 S$ ]  S7 l  T8 `, W# F% s2 r# l绝对值: abs
5 G8 c5 h- i% ~# j# E2 C% @/ l三角函数: sin、cos、tan、sec、csc、cot
4 d4 i0 k% K; y7 x6 r反三角函数: arcsin、arccos、arctan、arcsec、arccsc、arccot: H5 h2 r5 y3 f* @
双曲函数: sinh、cosh、tanh、sech、csch、coth1 C5 ~! T+ w8 ^2 d4 G; ~- ]
反双曲函数: arcsinh、arccosh、arctanh、arcsech、arccsch、arccoth  H+ W) F$ i+ b" t, W: W
贝赛尔函数: BesselI、BesselJ、BesselK、BesselY
3 o; t& y4 g) FGamma函数: GAMMA
) [1 G# a' M: w5 T+ d误差函数: erf! @, n7 [. t  o9 R
函数是数学研究与应用的基础之一, 现通过一些实验说明Maple中的函数的用法及功能. 5 A& i5 D5 Q# \( h1 Z( ?
1) 确定乘积和不确定乘积$ C: F3 M2 Q* Z8 ~! V
命令格式: product(f,k);  
1 g7 [& ~" H5 ^9 M: F, _product(f,k=m..n);  
7 y) A8 F/ \3 A* Kproduct(f,k=alpha); ) H$ K  @. `, q) n
product(f,k=expr);
- W2 N: M9 Y0 T! k" U# t% f其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—包含k的任意表达式.
* u- \* C% B# a' J9 h> product(k^2,k=1..10);   #计算 关于1..10的连乘
: \' @9 }0 b. Z9 z# L2 e % I* O& H  J6 k& i( k( x( v
> product(k^2,k);         #计算 的不确定乘积$ x* r1 k) Q9 P: \6 U
1 H3 S1 e3 }3 W& W
> product(a[k],k=0..5);    #计算ai(i=0..5)的连乘
6 L. F1 j2 g# S, F* c) j 7 ?9 B9 \7 u2 V. ]! r
> product(a[k],k=0..n);    #计算ai(i=0..n)的连乘
. q6 j/ Q, K. H( e/ L1 w
+ m$ S+ D3 e+ E/ g3 a> Product(n+k,k=0..m)=product(n+k,k=0..m);   #计算(n+k)的连乘, 并写出其惰性表达式
# ~- {- {" w+ r$ }
# [' K" N2 q! ^; y$ [> product(k,k=RootOf(x^3-2));     #计算 的三个根的乘积
4 Y7 l4 @8 v- i0 A ) L6 P2 j3 g  u8 C: E
    product命令计算符号乘积, 常常用来计算一个公式的确实或不确实的乘积. 如果这个公式不能求值计算, Maple返回 函数. 典型的例子是:   
( ^+ A& H# S9 U. G9 |  c' O- L> product(x+k,k=0..n-1);
$ r  m, D1 ^9 u/ T5 z) ?
1 }% Y* J7 _! Y8 L5 l3 J, \! r如果求一个有限序列值的乘积而不是计算一个公式, 则用mul命令. 如:   
) h% h4 o8 c5 H> mul(x+k,k=0..3);5 M5 \0 H! H' ^. T7 V

* w* j+ A: z' ^1 _4 L2)指数函数
6 Q2 C! u' {2 e2 j计算指数函数exp关于x的表达式的命令格式为: exp(x); 4 R& a+ a( M$ |' Q+ a
> exp(1);+ A  e  h4 m4 Y$ ]0 I  g

- [4 o% l. i4 r" \7 M9 I; e3 \> evalf(%);9 c/ C5 K4 M, [
3 I8 V2 a# F  z8 K
> exp(1.29+2*I);' l2 A7 d1 d7 ]- G

# C1 ~  V7 d3 f& ?> evalc(exp(x+I*y));( h7 ]' [5 r) w. Y7 S0 {

* w0 e; p7 U8 [8 }# l% ?3)确定求和与不确定求和sum+ L1 c, u9 F. ~8 ^0 ]8 E$ N# @" Q
命令格式: sum(f,k);  ( p) {! }" j7 ^1 k( b1 c
sum(f,k=m..n);  ' O4 B0 Z7 ?' a7 C1 u7 `. R
sum(f,k=alpha);   {: Q6 [; k; P3 s" L
sum(f,k=expr);
& p6 _) I' x' M6 n5 J% |+ e+ _: I. D其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—不含k的表达式.
. A8 V: g+ m3 }6 U# I+ y> Sum(k^2,k=1..n)=sum(k^2,k=1..n);! M0 o2 B* q2 Y
0 v' n  O7 _+ N, m5 L  C
> Sum(k^3,k=1..n)=sum(k^3,k=1..n);
2 X5 \% l0 F' l" z
4 M7 A# z! F% _' X> Sum(k^4,k=1..n)=sum(k^4,k=1..n);
* w$ Z) P& y+ G3 g
. T7 J/ R% K1 R. u> Sum(1/k!,k=0..infinity)=sum(1/k!,k=0..infinity);1 e  P$ M$ G) z

+ V; Q8 k+ z- a5 _6 O> sum(a[k]*x[k],k=0..n);; H: M) ]- F) P6 i9 {

2 U) F0 y) k1 v$ C> Sum(k/(k+1),k)=sum(k/(k+1),k);
3 P# s3 w1 }' g$ \( S% s1 I2 q 9 U) H. R  T( }3 H) D4 s% |: ?
> sum(k/(k+1),k=RootOf(x^2-3));% T8 u  O2 b9 f5 z( h: B

( Y# S3 v! ^* R; C+ \; ^sum函数可计算一个公式的确定和与不确定和, 如果Maple无法计算封闭形式, 则返回未求值的结果. 值得注意的是, 在sum命令中将f和k用单引号括起来, 可避免过早求值. 这一点在某些情况下是必需的. + Z- u8 X9 L  E
> Sum('k','k'=0..n)=sum('k','k'=0..n);
( o/ \: X4 s- z% p  w3 j7 B3 \ ! _3 m/ y+ f9 s
如果计算一个有限序列的值, 而不是计算一个公式, 可用add命令. 如:   . ]: N2 t2 r& q, k7 ]
> add(k,k=1..100);1 n7 |' g, A# T& `8 A: f1 U( z
3 P  H3 P" W( s- ?) G
尽管sum命令常常用于计算显式求和, 但在程序设计中计算一个显式和应该使用add命令.
' S) C9 T4 J5 Q0 S  ^" Q. M另外, sum知道各种求和方法, 并会对各类发散的求和给出正确的结果, 如果要将求和限制为收敛求和, 就必须检查显式的收敛性.
+ ~7 W  M, P7 Y3)三角函数/双曲函数) p; F+ n% K2 J
命令格式:   sin(x);   cos(x);   tan(x);   cot(x);   sec(x);   csc(x);+ Q& ]. t7 G6 q: I+ E- @; c
          sinh(x);  cosh(x);  tanh(x);  coth(x);  sech(x);  csch(x);# d# o4 e# o) S2 U$ r4 X
其中, x为任意表达式. ! @, F: N5 x- w" k( x1 ]( J% r4 _
值得注意的是三角函数/双曲函数的参数以弧度为单位. Maple提供了利用常见三角函数/双曲函数恒等式进行化简和展开的程序, 也有将其转化为其它函数的命令convert.
3 W7 ~8 ~" [+ X* B2 }> Sin(Pi)=sin(Pi);
% t6 x! u& f& ` , k) S: e% P# f3 b% R" ]
> coth(1.9+2.1*I);
* K/ u1 p  I4 f
& }2 g2 G  x4 ~5 b& X' W> expand(sin(x+y));     #展开表达式
1 v9 I6 \" c2 q9 j" _
3 u8 e- V# I4 U% \> combine(%);        #合并表达式
' g% t% y! r. K7 l' j% r' ]5 b& @ 9 B  q* f, S1 w* e
> convert(sin(7*Pi/60),'radical');
( \; I& h; S, L. L 3 Z7 a: J7 F5 D5 I  \+ j
> evalf(%);
3 G+ J# H5 H% {  g. @+ }8 O 2 a# g0 A4 [) |# o& ^$ j1 M
但有趣的是, combine只对sin, cos有效, 对tan, cot竟无能为力.* a) T+ n6 A$ k; A9 F) I
4)反三角函数/反双曲函数& W( I" Z3 t( k8 L0 r  [" G7 e. B
命令格式: arcsin(x);   arccos(x);   arctan(x);   arccot(x);   arcsec(x);   arccsc(x);4 W; W7 q0 b/ C
     arcsinh(x);  arccosh(x);  arctanh(x);  arccoth(x);  arcsech(x);  arccsch(x);   2 S7 G7 z- P) ?1 i3 E0 F: J, U
arctan(y,x);( k4 v& F; z* U( {  T
其中, x, y为表达式. 反三角函数/反双曲函数的参数必须按弧度计算. : U* O' h# @+ m
算子记法可用于对于反三角函数和反双曲函数. 例如, sin@@(-1)求值为arcsin.6 F1 `! x8 x( g6 Y- E0 ^5 k
> arcsinh(1);
) {9 d7 {+ N( I5 W8 g % d0 ~+ o3 z; @+ G2 t4 n9 m
> cos(arcsin(x));4 U7 J" c9 [$ M- V/ E% n( z) F. C1 M
7 [9 y) U0 {/ Q* `& y" g( q& |. K
> arcsin(1.9+2.1*I);
# c5 U! B+ i& x2 Z0 D. f; V
: ~; C! O% g$ J' k9 g7 e5)对数函数
6 P, t  i- I/ ^& ~  g2 z) y- O命令格式: ln(x);           #自然对数, n! q# P' W$ p3 U4 K9 a
log[a](x);        #一般对数8 `* J- @9 T2 I; }: ]3 X6 K
log10(x);        #常用对数' F4 v6 L9 L( {6 H
一般地, 在ln(x)中要求x>0. 但对于复数型表达式x, 有:   
7 r, }3 u6 ^0 G/ {( g  (其中,  )% D) b& L/ D  Y2 b3 W9 s
> ln(2002.0);
' S3 ~! O* z' Y+ B/ S3 l$ {
* O9 j0 e# V) Z* A& d4 |> ln(3+4*I);+ N9 L7 s& b* Z6 a! X

8 O8 W! ?. K# g> evalc(%);    # 求出上式的实部、虚部8 Q6 i. n" f5 F/ F' d* \
' [" z, G  V0 E$ D% e5 s9 {
> log10(1000000);' Q& S  i( }2 W

( h: T- i! f/ Z3 d> simplify(%);   #化简上式6 l; _' A$ D. v! o+ Y

' N, M2 O. Q0 E) w2.2.2 函数的定义8 I- h' m- M) ~
Maple是一个计算机代数系统, 带未知或者已知字母变量的表达式是它的基本数据形式. 一个简单的问题是, 既然表达式中可以包含未知变量, 那么它是不是函数呢?试看下面一个例子:   
" @1 r$ ]( s0 y/ F. C6 F& ^: {+ `> f(x):=a*x^2+b*x+c;" W" l4 V, x/ i4 s0 P1 d/ E
+ P: _# s% \1 K
可以看出, Maple接受了这样的赋值语句, 但f(x)是不是一个函数呢?要回答这个问题,一个简单的方法是求函数值:   
' i, [% p! S0 u! a  A# i> f(x),f(0),f(1/a);
) |% g# G# W0 h" ^% y6 }   w3 J  Y# J/ r9 }2 P8 d/ p
由上述结果可以看出, 用赋值方法定义的f(x)是一个表达式而不是一个函数, 因为f(x)不能把所定义的“自变量”或者“参数”转换成别的变量或表达式. 但从赋值“过程”可以看出, f(x)虽然也算是一个“函数”, 但却是一个没有具体定义的函数:     Z2 U, X# z1 o8 K5 _4 f8 Y
> print(f);
% L5 M2 @! z3 G9 p9 H 5 B/ Q6 f# D) n  B. }+ H& `! u
事实上, 我们所做的赋值运算, 只不过是在函数f的记忆表(remember table)中加入了f(x)在x上的值, 当我们把自变量换作0或1/a时, f(x)的记忆表中没有对应的表项, 所以输出结果就是抽象的表达式. - _6 O3 X; f2 |$ j- S8 R
在Maple中, 要真正完成一个函数的定义, 需要用算子(也称箭头操作符):   7 K# Z  [; Y- K: h( T
> f:=x->a*x^2+b*x+c;! e& {, [) o3 n2 x3 I: Y) b
. `8 z# V1 z3 X* j) F
> f(x),f(0),f(1/a);! ^, t0 T, C& W

. w" b8 u) t4 D! B, V% [多变量的函数也可以用同样的方法予以定义, 只不过要把所有的自变量定成一个序列, 并用一个括号“()”将它们括起来(这个括号是必须的, 因为括号运算优先于分隔符“,”).
! f0 b( W; g% [5 d- G+ Q. W+ _7 R! x> f:=(x,y)->x^2+y^2;' M  c" }' q. x# m3 G7 S8 Z  r9 _

6 q3 m, J7 E0 e. ~, Y, v> f(1,2);
' t) W5 r8 x0 s! m+ e. f$ N " i0 e4 ~, [) z2 [6 S2 W' Q
> f:=(x,y)->a*x*y*exp(x^2+y^2);
) F6 q3 K3 C& e0 I! y0 _5 t; b ; \0 j6 B" t8 }6 L8 Q
综上所述, 箭头操作符定义函数的方式一般为:   
" _9 s& t3 ?6 G一元函数: 参数->函数表达式' B  e. ?6 j1 h6 M) i
多多函数: (参数序列)->函数表达式+ `4 T: G- u- o% c
无参数函数也许不好理解, 但可以用来定义常函数:   
- J; s5 q& e# e( G% N0 b/ Q> E:=()->exp(1);
' }7 t1 T. M3 D8 `3 c 1 M* `  T. z1 K7 N& E9 O  M7 g
> E();
! v! G3 j1 _2 j- s% R$ ~) j/ P 1 p2 O4 J9 q2 a$ o0 @3 Y, ~: k0 \4 Z* s; d
> E(x);
8 }0 g  h0 L' }2 J! H
9 P- _* i, ?' l+ z; p: c4 h1 g' C2 P另一个定义函数的命令是unapply,其作用是从一个表达式建立一个算子或函数. 7 S; d8 g- T9 r, b6 h, A8 D' H
定义一个表达式为expr的关于x的函数f的命令格式为:  f:=unapply(expr, x);         
, g  Y# \) j8 C定义一个表达式为expr的关于x,y,…的多元函数f的命令格式为:  f:=unapply(expr, x, y, …);     2 c& @5 \! {4 G! ^
> f:=unapply(x^4+x^3+x^2+x+1,x);' t1 s% S' [  i. Z  z7 V8 m

( q' m) l$ i2 F. e> f(4);5 d) E4 {: D2 ^/ g" x3 c
$ |! n7 u; s: U; r) e, A
> f:=unapply(x*y/(x^2+y^2),x,y);
) i  b6 Q2 Q9 ?" ~* C; y7 |
5 L8 C; g' d- x. m$ N> f(1,1);
9 r3 q9 a# O/ A4 A $ @. `) m& t6 Z- R
借助函数piecewise可以生成简单分段函数:
) L" U, T% I9 X( X> abs(x)=piecewise(x>0,x,x=0,0,x<0,-x);
; E% r% t- ?. ]
' A, m' N  a) H" |清除函数的定义用命令unassign. 8 I+ ^* a# Q% _* c
> unassign(f);: w; m) [: {) r. ~
> f(1,1);
5 E0 u. P( r3 C) l0 A/ l5 F
, F. H5 v. ]1 A1 x* m* `- q除此之外, 还可以通过程序设计方式定义函数(参见第6章). ' i& C/ i* l( P' J! n9 X5 e5 q# G
定义了一个函数后, 就可以使用op或nops指令查看有关函数中操作数的信息. nops(expr)返回操作数的个数, 函数op的主要功能是获取表达式的操作数,其命令格式为:8 ?) ^. h% p3 a1 k- H' y
op(expr);         
& {$ T/ t# p8 h9 kop(i, expr);         
! u- H  R1 E$ o  N( r5 l$ v' jop(i .. j, expr);      
4 q" i4 i- {5 n0 }' J% cnops(expr);+ [4 N- b$ B4 c5 z* u
如果函数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的类型. 7 {1 C- W& x- ?7 m+ m  X1 N
命令op(i .. j, expr); 执行的结果是expr的第i到第j个操作数, i..j中含负整数时的情形同上.
7 @( {- @: q. T3 O& n命令op(expr); 等价于op(1..nops(expr), expr);
/ m; Z# Q9 ^2 @+ S# U特别地, 当op函数中i为列表[a1, a2, ..., an], 则op([a1, a2, ..., an], expr); 等价于op(an, op(..., op(a2, op(a1, e))...));
4 l/ Q! M$ F7 S3 O9 X而当expr为一般表达式时,nops(expr)命令返回的是表达式的项数, 当expr是级数时返回级数每一项的系数和指数的总和.
2 d2 e2 U! W) n9 n/ c* V> expr:=6+cos(x)+sin(x)*cos(x)^2;
* F' B4 v" o) L$ G& b# Y; j + M4 W% Q" g8 t- i  [; y) }5 W
> op(expr);
9 v; E4 Z6 n  E9 D& N
7 J- P4 z7 R, L: ]9 K, C. Z. I" T> nops(expr);
  x+ P% Q# [2 p  d$ T7 Y1 L  d ' F: `3 X5 z) v7 q+ C* r! _! [
> p:=x^2*y+3*x^3*z+2;
  y% [: e5 i& f+ x( {4 w# ?
( }! U. N; h- e; C> op(1,p);/ j3 a" B/ i  T
" p% T, w; w3 [
> op(1..nops(p),p);
4 c- L7 a  ~( B, m $ J' f% z3 L+ ]8 S$ B, _
> op(op(2,p));
5 T/ s5 j" P! d5 |   K! B* w  E2 k, O2 V8 o
> u:=[1,4,9];
5 k- ]# w: m6 Q; }# f  H( D ; O1 Z! d+ |( p: Y0 l# U0 c
> op(0,u);$ q# z5 I0 l( d
: m5 m6 s  ~* Y0 X9 A
> s:=series(sin(x),x=1,3);" a; S. C4 X" A
2 Q8 H+ P3 w6 x
> op(0,s);
, |' P4 r% n4 I' s7 b5 Q         # y2 c! x0 F7 ]. P0 P
> nops(s);3 q6 f3 X9 }, j; P* N+ }8 X
! y% ?7 T8 N& B# T/ ~
下面一个有趣的例子说明了Maple在处理算术运算时的“个性”:7 Y! ^' y, d, E8 O
> op(x*y*z);" h  O4 m0 Q$ v' H& g  U% H6 C1 d

- x; t  {$ d# `/ w2 L> op(x*y*z+1);% y% ]% v  N0 d; O$ m1 p
0 V  k+ t5 M5 ?: d& U9 i
2.2.3 Maple中的常量与变量名$ f  {2 _$ _7 g9 l' K
为了解决数学问题, 一些常用的数学常数是必要的. Maple系统中已经存储了一些数学常数在表达式序列constants中:   
. L+ {9 p7 J- N( _" Q  h- ?> constants;! A' r* a+ i3 @7 H' b
" d# e5 u" j4 O7 \
为了方便使用, 现将上述常数的具体含义列示如下:   
" ]' G! d7 z1 ?) d, u常    数        名 称        近似值
! m6 `( C( {+ R圆周率
* O' Q0 M. M# w9 S$ `9 P4 TPi        3.1415926535
' o' P2 q- L; K( [Catalan常数   d1 z7 r6 g& P+ y  B9 |" q+ K, I
Catalan        0.9159655942/ _# [7 `# o5 X' F
Euler-Mascheroni常数
0 H. h  s% a+ t) vgamma        0.5772156649+ P9 A, }# l5 E" M: W# t
4 x7 B8 j5 j. F6 o. |2 t. l! g. a
infinity       
% x# {9 G: R& P  K4 I+ `3 U  H4 I& _
需要注意的是, 自然对数的底数e未作为一个常数出现, 但这个常数是存在的, 可以通过exp(1)来获取. * x/ y) U+ x* _" e& E' O7 C4 T
在Maple中, 最简单的变量名是字符串, 变量名是由字母、数码或下划线组成的序列, 其中第一个字符必须是字母或是下划线. 名字的长度限制是499个字符. 在定义变量名时常用连接符“.”将两个字符串连接成一个名. 主要有三种形式: “名.自然数”、“名.字符串”、“名.表达式”. ( @5 u4 E+ c3 I) n8 n+ Z3 b
值得注意的是, 在Maple中是区分字母大小写的. 在使用变量、常量和函数时应记住这一点. 数学常量 用Pi表示, 而pi则仅为符号 无任何意义. 如g, G, new_term, New_Team, x13a, x13A都是不同的变量名. # ?4 m) I$ ]& t$ V  b3 l7 \# i3 A- m) b
在Maple中有一些保留字不可以被用作变量名:   . Z  h' ?! i, |7 X3 c, y
by      do      done     elif     else     end        fi        for      : O' z+ }4 R! c7 P& ^9 |- S# @
from    if       in       local     od     option    options     proc         ; T3 j' C6 `* D2 l' I- u
quit    read     save     stop     then     to        while      D# J. J7 F- K4 M; ]
Maple中的内部函数如sin, cos, exp, sqrt, ……等也不可以作变量名.
; [3 P& }1 f6 H1 c另外一个值得注意的是在Maple中三种类型引号的不同作用:   * ^. f# g  n& ]) ^4 x$ P( D, l9 x
`  `:   界定一个包含特殊字符的符号, 是为了输入特殊字符串用的;   
" U  a8 z" C" u% l4 Z' Q'  ':   界定一个暂时不求值的表达式;    ; C% X  R  ^' C+ D# W  U7 ~
"  ":   界定一个字符串, 它不能被赋值.
8 q+ _, q( w5 ?3 R* Q2.2.4 函数类型转换           4 y" A9 r! T# Z/ v9 h1 l
函数类型转换是数学应用中一个重要问题, 譬如, 将三角函数转换成指数函数, 双曲函数转换成指数函数, 等等. 在Maple中, 实现函数类型转换的命令是convert. 命令格式:  - g5 ^0 L# ?" a) W& h
    convert(expr, form);        #把数学式expr转换成form的形式
7 u2 Y+ Y+ }$ z0 ?' b/ L0 Uconvert(expr, form, x);      #指定变量x, 此时form只适于exp、sin、cos
0 J* G/ \8 s, e' J- B: ?convert指令所提供的三角函数、指数与函数的转换共有exp等7种:   
& d: I4 s3 ~, [$ N% ?0 v+ L(1) exp: 将三角函数转换成指数, P; M6 s8 J& K8 n$ Y! i
(2) expln: 把数学式转换成指数与对数# \8 p8 _* t) M9 ?) U: Z- w9 v
(3) expsincos: 分别把三角函数与双曲函数转换成sin、cos与指数的形式' Q$ l1 L. h& @3 M$ O
(4) ln: 将反三角函数转换成对数
2 m( t7 T4 a7 T* ^$ Q" c& |(5) sincos: 将三角函数转换成sin与cos的形式, 而把双曲函数转换成sinh与cosh的形式0 q0 W. i7 s- C" q' \
(6) tan: 将三角函数转换成tan的形式, }' F+ E& a/ y# G8 n  N
(7) trig: 将指数函数转换成三角函数与对数函数( Z" b: K2 V  K$ L% _. |& b2 j/ V
> convert(sinh(x),exp);   #将sinh(x)转换成exp类型1 d" i8 }7 @# {

1 m! a0 x/ A& ^0 Z- A> convert(cos(x)*sinh(y),exp);
; k3 K+ M$ S4 `
& U5 q$ I7 O& i/ ?# Q> convert(cos(x)*sinh(y),exp,y);
. u- s% U3 Y- g" {- R/ p# n3 b5 m
) K/ |) {% f& {2 c) w1 w$ K9 K9 Z> convert(exp(x)*exp(x^(-2)),trig);) j$ z$ i( P6 i4 y- E8 F: p" m
( U: @2 r5 v9 ]5 {, s7 r
> convert(arcsinh(x)*cos(x),expln);; T- M2 j( ~2 j9 o
. B+ j; A2 p3 v1 ]/ P
> convert(cot(x)+sinh(x),expsincos);: ]8 [, E; V4 F- R

4 Q  m! Y, j3 ^+ F3 f> convert(arctanh(x),ln);. I  W7 {( O7 f2 ~

$ o3 \0 S3 I$ S- H' l- c7 Qconvert在有理式的转换中也起着重要的作用. 在有关多项式运算的过程中, 利用秦九韶算法可以减少多项式求值的计算量. 在Maple中, 可以用函数convert将多项式转换为这种形式, 而cost则可以获取求值所需的计算量. 注意: cost命令是一个库函数, 第一次调用时需要使用with(codegen)加载. 例举如下:   5 @) G/ J/ Z. T5 a+ }
> with(codegen):  C9 {1 G' t3 r; r* N5 z5 A
> p:=4*x^4+3*x^3+2*x^2-x;
6 n' y9 V( w% m: ~8 i' V ' Z* _% S9 |) Q& E* e7 Q5 V
> cost(p);: M$ k1 R+ h3 H/ G/ {
/ I4 G3 a- S. g2 u9 v( x& x
> convert(p,'horner');  #将展开的表达式转换成嵌套形式
7 ~( r$ Q) v& x+ y; }8 N; F8 t
1 H5 s# d1 [" m8 ^5 b" _> cost(%);+ \* U& d2 p2 R  b% {8 r* ?1 p' O

" Q7 v+ y4 r+ w# A同样, 把分式化成连分式(continued fraction)形式也可以降低求值所需的计算量.
7 b: i$ I2 w8 R& k3 m6 M' b> (1+x+x^2+x^3)/p;/ Y+ V+ K  P2 ?% r6 F8 q- b

% D3 M+ m9 M0 c9 `> cost(%);
$ k4 T. L" j4 @( ]5 u " C7 c- r  B) b1 w' D
> convert(%%,'confrac',x);2 A. t/ ?) R6 l' ]7 C" I  _5 I8 @/ D
8 A8 P* K+ k# N' `" ^: J* ~
> cost(%);3 E7 F. K' n) m

7 m+ p1 \2 \/ t- F在某些场合下(比如求微分、积分时), 把分式化成部分分式(partial fraction)也就是几个最简分式的和式的形式也可以简化运算, 但简化程度不及连分数形式. ) Y( o' M% j# v( b0 l
> convert(%%, 'parfrac',x);
7 K. @  J% Z. T2 L
( G& z; k) W( R0 A> cost(%);* Y+ g  S6 k0 ]! d6 {

2 A: W) U$ M9 U而把分数转换成连分数的方法为:
' `- K2 V# G5 D) f  c; c: ]; t> with(numtheory):, p. a) ^2 s7 I0 H
> cfrac(339/284);
4 L5 V8 I7 [& Z- Q7 {
  ~! F+ \! G1 A2.2.5 函数的映射—map指令
" b; k5 H8 Y) |% H在符号运算的世界里, 映射指令map可以说是相当重要的一个指令, 它可以把函数或指令映射到这些结构里的元素, 而不破坏整个结构的完整性. 命令格式为:
1 }. A$ i8 f4 B  L& E2 t6 umap(f, expr);      #将函数f映射到expr的每个操作数
2 S& X+ E7 z. H( F) r6 Wmap(f, expr, a);    #将函数f映射到expr的每个操作数, 并取出a为f的第2个自变量
" L9 r# d  h/ umap(f, expr, a1, a2,…, an); #将函数f映射到expr的每个操作数, 并取a1~an为f的第2~n+1个自变量# |# X$ S6 I5 {) n) @" i5 U6 e5 s
map2(f, a1, expr, a2, …, an);    #以a1为第1个自变量, expr的操作数为第2个自变量, a2为
4 N: s! S. b6 ^( `第3个自变量…, an为第n+1个自变量来映射函数f
# x2 u4 }& k  L# U> map(f,x1+x2+x3+x4,a1,a2,a3,a4);! k% h4 q1 Z& t) |, v
% e5 x0 v+ G' N. T! V0 D$ V0 s' ?
> f:=x->sqrt(x)+x^2;( B" _* U1 o; c6 r

' U! @- U+ @( s. e# O' O> map(f,[a,b,c]);
9 h+ S0 W# H8 Q* Y, u2 M0 O* R% H
4 F0 O6 I& J+ K8 l5 X  Z) v> map(h, [a,b,c],x,y);
1 Z7 V/ m7 b6 u. N- C4 z
! a2 w$ ~( U2 j3 W( M" `+ |> map(convert,[arcsinh(x/2),arccosh(x/2)],ln);" r) l/ W7 {8 Y0 v) S
$ E$ w2 p5 w( q! T  h% ?3 k
> map(x->convert(x,exp),[sin(x),cos(x)]);
: a0 D0 z% B( y& j" ?$ D; ~
2 @% w& g- R4 {$ D上式的映射关系可通过下式理解:
' n3 g2 G; W2 X+ f8 `' _> [convert(sin(x),exp),convert(cos(x),exp)];
1 e2 @& Q) g% [, r  d- M9 y ; [% t$ V$ ~6 J% e0 @
> restart:
8 r, j* l1 K# D" Amap2(f,a1,x1+x2+x3+x4,a2,a3,a4);
* q3 s1 f7 c7 ~5 c# |, \0 l- u4 Z( G * S% c+ [9 F: i) c& I& Y2 F1 O
> map2(max,k,[a,b,c,d]);
/ L9 E+ B) n1 I' i8 A! a0 l
; v0 r% S. G9 Y7 w% ?( O) O再看下面示例:   4 g2 g& }. p8 N# B" R6 ?9 q: o& |
> L:=[seq(i,i=1..10)];8 }* ], }& X2 x+ w% X4 G6 I
0 h# Q  Z" @; S3 W, K' R
> nops(L);* p3 W, c& ?8 Q5 E

$ h3 _" N2 u7 e! |+ T; Q> sqr:=(x)->x^2;% P) O9 K, p: d" h
& a0 Q+ s- ^3 I4 H  m, D. T2 a
> map(sqr,L);7 x! X- |0 T( j* D1 l  j% B
4 i8 h3 Z) w* Q7 x# T2 }
> map((x)->x+1,L);/ J8 L$ k3 \! Z2 k: s( e

+ t/ {$ {  E/ o* {> map(f,L);
) b* V6 c  Z) ~1 F. _ 6 P, E( X" |3 B5 j. Q" Z0 |2 e
> map(f,{a,b,c});
0 Y- |5 V& \! U" v% c+ A' ^* o! X & ?) r# e, S( N4 H, B* X2 F' d
> map(sqr,x+y*z);/ I1 C0 a0 V. q
" A. y8 T! {: O
> M:=linalg[matrix](3,3,(i,j)->i+j);1 k* M8 V* }: Q# O7 {9 J$ c

* W" H7 k) Q2 u5 q( |9 x5 \> map((x)->1/x,M);
. R. J. B4 S( z0 x, K, m) B0 \ & N' \( `/ m) M+ K7 b3 I$ p- K1 K5 A
3 求 值: w! d: H( V' U3 T0 k
3.1 赋值
% r1 d1 l8 Z! l* L8 C& d) z在Maple中, 不需要申明变量的类型, 甚至在使用变量前不需要将它赋值, 这是Maple与其它高级程序设计语言不同的一点, 也正是Maple符号演算的魅力所在, 这个特性是由Maple与众不同的赋值方法决定的. 为了理解其赋值机制, 先看下面的例子. ( E5 A. ?6 _$ m6 T: X
> p:=9*x^3-37*x^2+47*x-19;
1 M/ }, s) H6 A* ]5 i
& K8 r7 @1 x5 d> roots(p);
( |6 w8 ^+ q6 {/ C5 P
4 A$ t) g9 c' ]8 X6 L+ Y8 z, V> subs(x=19/9,p);; H9 @7 N. @: z0 x

6 q  Y" }; T3 \8 Y3 T* _3 I" {在这个例子中, 第一条语句是一个赋值语句, 它的作用是把变量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;”这样的简单语句即可验证. 9 N* s; [' P+ f9 ?) P9 f
3.2 变量代换( T5 n% O6 G& W) X. F; G4 {" p( M
在表达式化简中, 变量代换是一个得力工具. 我们可以利用函数subs根据自己的意愿进行变量代换, 最简单的调用这个函数的形式是这样的:   
5 Q% d+ q' `( U; V  @) P: |& g. Asubs ( var = repacedment, expression);
* R- ^: E- M+ G调用的结果是将表达式expression中所有变量var出现的地方替换成 replacement. ' @* g3 _- l& X. r) a& T& [
> f:=x^2+exp(x^3)-8;
3 i! Q$ m1 J! n4 h' O) E8 l ' N4 A. S" f* q6 c3 o
> subs(x=1,f);4 p( }8 E" u- y! |9 p0 c3 G
9 d0 j& B- E- L$ M+ F% t# V5 S8 s
> subs(x=0,cos(x)*(sin(x)+x^2+5));4 W$ s, J. |0 H
2 _4 i$ L- D# m. s; n: O
    由此可见, 变量替换只得到替换后的结果, 而不改变表达式的内容, 而且Maple只对替换的结果进行化简而不求值计算, 如果需要计算, 必须调用求值函数evalf. 如:   
- J5 O: u1 ?; I> evalf(%);8 I7 E4 {- @% a( D# t
1 _0 `9 D) Z9 R6 Y8 b( C; Y& v
变量替换函数subs也可以进行多重的变量替换, 以两重代换为例:   % L" h( x8 e7 M% [$ B
subs (var1 = repacedment1, var2 = repacedment2, expression)
) Y+ }* ~8 {4 U3 x0 P: m' z调用的结果和按从左到右的顺序连续两次调用是一样的, 也就是先将expression中的var1替换成replacement1, 再将其结果中的var2替换成replacement2, 把这种替换称作顺序替换;    与此相对, 还可以进行同步替换, 即同时将expression中的var1替换成replacement1, 而var2替换成replacement2. 同步替换的调用形式为:   
" H' @3 B' Z$ m( psubs ( {var1 = repacedment1, var2 = repacedment2 }, expression)
; U) o' A; o- E0 l% }4 {下面通过例子说明这几种形式的替换. * E* H  R8 i/ N/ p% [$ T+ s3 N4 L2 U
> subs(x=y,y=z,x^2*y);              (顺序替换)3 J& u1 l- m0 s% R8 A& G9 z
1 w3 ?- I7 P$ J. {6 V
> subs({x=y,y=z},x^2*y);            (同步替换)1 i# A, t( ^9 d* l$ }- @
9 S) d* P) Z2 V; i
> subs((a=b,b=c,c=a),a+2*b+3*c);   (顺序替换)# c) \! _: o2 D: {6 H8 b# r8 {

) Z7 \" \: v2 f# W8 S0 q> subs({a=b,b=c,c=a},a+2*b+3*c);    (轮  换)6 B; X! J( |0 l, B( S3 v! i  R

  U( ?: a) S) w( p$ e, w> subs({p=q,q=p},f(p,q));             (互  换). [+ k5 v* Z* r) [5 k- |1 [

0 T6 ~- H/ G1 N# z' u: D/ h3.3 假设机制
# o: h8 |9 Y8 S; b  Q0 m0 d+ ]Maple是一种计算机代数语言, 显然, 很多人会尝试用Maple(或其他计算机代数语言)解决分析问题. 但由于分析问题与处理问题的考虑方法不同, 使得问题的解决存在某些困难. 例如考虑方程 的解. 如果k是实数, 结果显然是x=1, 但如果k是 的复根, 为了保证解x=1的正确性, 必需添加附带条件: 也就是当 时x=1. 这是一个对结果进行正确分析的例子. 然而从代数的角度考虑这个问题时就会把k当作不定元, 此时k没有值, 从方程两端去除k的多项式是合法的, 只要这个多项式不是零多项式即可(这一点是可以保证的, 因为其所有系数不全为0). 在此情况下x=1就不需要任何附加条件. 计算机代数系统经常采用这种分析的观点.
) O, z. k2 m. i在Maple中, 采用分析观点解决这类带有一定附加条件的实用工具是函数assume, 其命令格式为: assume(x, prop);
% h  |6 J! ]4 d  r! l* r% Y- C函数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);”也不会产生矛盾.
* ^1 ~$ ^9 A- }3 l0 r. V* m. B+ [> Int(exp(-s*t),t=0..infinity);
9 a, w  @/ N, C6 c8 Q   g) P+ ^: [7 Z5 V+ z3 F
> value(%);
! {* l8 @+ @% Y" z2 dDefinite integration: Can't determine if the integral is convergent.! i& l1 L* A3 U
Need to know the sign of --> s* Z; n$ T$ N3 C/ E" T# U# e
Will now try indefinite integration and then take limits.
* b2 _: v. B8 O2 I' { 7 }' {  u+ n8 c  Q& O
> assume(s>0);
8 ?1 w% V. r3 f- W" z> Int(exp(-s*t),t=0..infinity);
' {1 b( |( x. X1 }1 i/ { 5 ]- g. c, H  o" z
> value(%);
2 j& \2 s% T' \# |. x. j
: A, S& }: c$ E1 p$ E2 I, J! ]6 p! V3.4 求值规则. I' Z/ `$ n$ v9 ]# V
在多数情况下, Maple的求值规则设计为做用户期望的事情, 但要做到这一点很困难,因为不同的人在相同的情形下会有不同的期望. 在大多数情况下, 全局变量被完全求值, 局部变量被一层求值. 而由符号' '界定一个暂时不求值的表达式, 单步求值仅去掉引号, 不作计算, 这也是允许取消指定名字或清除变量的原因. 如下例:   
/ C* P5 F' F# ?4 c8 z+ I> x:=y;
  ^, D# W0 J2 ?. v$ K5 E
+ S; ^" G, b+ H. Q6 g> y:=z;. i0 D% E2 [0 U; S6 V

. M$ w2 j) s7 ~4 O5 p> z:=3;
, w" k+ ~4 j' H6 ^ 7 y2 u  V1 i# M
> x;
- A- i5 n5 V1 @8 @! ^* Y3 d / x7 o7 w# K% @# F( o3 W" `- u
> y;3 K% z& H& {  T( w

) F: X5 q! \* h1 _' y# y* D> x:='x';* \5 p5 Q2 o' y2 a) x2 f

$ T* t0 E+ m% U8 \: f> x;
7 v; f; b! u5 A- D 0 d5 k- U0 A1 j" b! L) [5 P3 [
> y;
$ w5 E! U) ]0 ?  C. a3 c6 B4 w
" {! q% x7 G* }' d. L( t对于不同的问题, Maple设计了不同的求值命令. 现分述如下:   ( l! e# u3 h- I1 U
1) 对表达式求值
5 y7 R; Q, {* _5 ~. U2 u# U# E命令格式: eval(e, x=a);  #求表达式e在x=a处的值' a6 ~" x5 `- E& S' o7 Y" I+ W
             eval(e, eqns); #对方程或方程组eqns求值$ W- x8 d8 X5 k; {
             eval(e);      #表达式e求值到上面两层$ A+ ?, x# n9 U# V" j5 F% a
             eval(x,n);    #给出求值名称的第n层求值
8 N4 P6 T: t/ l$ A' t6 V' D> p:=x^5+x^4+x^3+x^2+x+73;) K, \" }3 S3 M" B
- Y: B9 G& X4 ?% C4 e! g
> eval(p,x=7);* M5 G% s- }. \& P- O$ t+ ]

- q$ Y* p3 o; U5 c: {0 e: _> P:=exp(y)+x*y+exp(x);  p: {7 i) d. s. S% Y
4 _" }: t# x# s
> eval(P,[x=2,y=3]);. y- m; r# Z: h$ w3 |2 Z

" F4 l: ]- M5 }1 T. M    当表达式在异常点处求值时, eval会给一个错误消息. 如下:   . I1 U5 N& b) O) c9 z
> eval(sin(x)/x,x=0);" W1 Z( S1 j: E' l
Error, numeric exception: division by zero' ~3 d: O/ j2 \5 C
    下面再看使用eval进行全层求值或者对名称几层求值的示例:   
9 Q5 O/ n# o9 n> a:=b: b:=c: c:=x+1:3 y% L+ b% d7 H- ?2 C
> a;              #默认的全层递归求值
5 \* H# P9 F* n: f3 y  v  w  @ " q" L4 L6 S0 |4 b: `* ]) i
> eval(a);        #强制全层递归求值
/ o' O# F# z7 B" @ 4 h1 q5 ?9 ]0 J6 v) ~: p: {
> eval(a,1);       #对a一层求值
$ b. r) b, ~1 u- i 1 `" f. r2 }. `- U& k
> eval(a,2);       #对a二层求值% |; K. P- }4 W3 f$ Q8 [: f
; a3 _$ f9 G0 z; V2 P: ^
> eval(a,3);       #对a三层求值
% V0 c0 _) m: r/ n2 `" H- S. V6 F : }0 [& c+ P9 ~7 o& ?5 U
> eval(a,4);       #对a四层求值
1 C1 f& |& s/ P  L8 a
: s! j  X* ~8 j0 v2 M& ?    2) 在代数数(或者函数)域求值' C+ S; N$ c# _! [) u) W; p
命令格式: evala(expr);       # 对表达式或者未求值函数求值
/ X& _7 R7 q3 b! i. h+ P  Z$ {# Q             evala(expr,opts);   #求值时可加选项(opts)
9 C) j7 E( d! l. Y所谓代数数(Algebraic number)就是整系数单变量多项式的根, 其范围比有理数大, 真包含于实数域, 也就是说任意实数都是整系数多项式的根(如 就不是任何整系数多项式的根). 另一方面, 代数数也不是都可以表示成为根式的, 如多项式 的根就不能表示成为根式的形式. ; x* l$ _# V, S
代数数的计算, 算法复杂, 而且相当费时. 在Maple中, 代数数用函数RootOf()来表示. 如 作为一个代数数, 可以表示为:     L' P+ k0 m) k# c4 ~
> alpha:=RootOf(x^2-3,x);
1 [& m; ~! l* \" X0 ] . E* B+ p4 o1 Z% q
> simplify(alpha^2);2 O. Z. C1 m- r/ \; T! d
" N% n! w0 ]- o5 j3 s! o
在Maple内部, 代数数 不再表示为根式, 而在化简时, 仅仅利用到 这样的事实. 这里, Maple用到一个内部变量_Z. 再看下面一个例子,其中alias是缩写的定义函数,而参数lenstra指lenstra椭圆曲线方法:, p! t: B/ |; k. Y
> alias(alpha=RootOf(x^2-2)):2 f7 E& L, l0 g5 Q2 H9 l# W
> evala(factor(x^2-2,alpha),lenstra);
# h7 C# g0 H& p: F" c! C' r' F( k/ D
0 ?8 d2 K0 m, _, i; M> evala(quo(x^2-x+3,x-alpha,x,'r'));
& ?7 M, \# W$ q
0 M/ W: K- m% _> r;
* n! Q# u1 q1 } ! d. A+ J$ f! |1 d- i9 [; @5 ?! i" O
> simplify(%);1 t5 X$ b# p8 |) x* I
* \& V, u% G' ~/ L6 x8 x" n- d
3) 在复数域上符号求值
/ v: O( x( _0 ], y7 i. P操纵复数型表达式并将其分离给出expr的实部和虚部的函数为evalc, 命令格式为:- @: e4 K5 `: M. S. s% s
evalc(expr);   
* l/ O; B5 W1 X) Oevalc假定所有变量表示数值, 且实数变量的函数是实数类型. 其输出规范形式为: expr1+I*expr2.
( V' O" f! E% T$ }0 R4 {> evalc(sin(6+8*I));
  m' ^, X+ M% `( {
( o* S& _+ N+ e$ `" n> evalc(f(exp(alpha+x*I)));
3 }9 L4 e( L1 t9 x6 V 6 o+ j2 O8 L  Y" H+ S1 O& r1 S- o
> evalc(abs(x+y*I)=cos(u(x)+I*v(y)));* `' R: x) z9 `2 ^: {
6 ]: R8 U# w) k$ }, C
4) 使用浮点算法求值
+ h4 V. o3 P" [* l4 Q浮点算法是数值计算的一种基本方法,在任何情况下均可以对表达式expr使用evalf命令计算精度为n的浮点数(n=Digits), 如果n缺省, 则取系统默认值, 命令格式为: evalf(expr, n);     ' V  A& B5 W9 H$ n, ?
> evalf(Pi,50);   
4 c) |4 \& |" I * [3 e/ d1 }: c4 P
> evalf(sin(3+4*I));   # I% e6 V. {7 C5 P3 a
! h2 {4 X6 V, o3 P* r1 Z
> evalf(int(sin(x)/x,x=0..1),20);
8 V' g8 o9 L9 h( D! S, @
: }, e5 M9 ?9 E3 y3 A0 q$ Z' y5) 对惰性函数求值
- a; @% K8 j7 C* Y7 {7 C把只用表达式表示而暂不求值的函数称为惰性函数, 除了第一个字母大写外, Maple中的惰性函数和活性函数的名字是相同的. 惰性函数调用的典型用法是预防对问题的符号求值, 这样可以节省对输入进行符号处理的时间, 而value函数强制对其求值. 对任意代数表达式f求值的命令格式为: value(f);   
2 B$ b" e3 M' Z1 s  l  U) V$ A> F:=Int(exp(x),x);, i" i- b0 f3 ~

0 h: P+ n9 t8 q# C> value(%);
6 [. e" ?6 C7 A0 i3 {) L & S& F2 b- E9 _) L; r: J5 y
> f:=Limit(sin(x)/x,x=0);& o- v" _( |! Z6 P  N) i
! q, {! z; C& L. A* T- y7 U( c5 o" d7 r
> value(%);& ?/ w3 O! x: u$ r  t2 s- o. e  s
: N* u( k" G& s
另外, 将惰性函数的大写字母改为小写字母亦即可求值. 如下例:   # L; C6 A/ V* W- ~4 [" O
> Limit(sin(x)/x,x=0)=limit(sin(x)/x,x=0);; ?2 t2 u& i& ~) C; o- \" ^
/ Q, ^" B2 F/ t) I) U
4 数据结构$ r8 O0 D1 E0 e0 ^
Maple中有许多内建的与FORTRAN、C或Pascal不同的数据结构. 主要的数据结构有序列(sequence)、列表(list)、集合(set)、代数数( algebraic number)、未求值或惰性函数调用、表(table)、级数(series)、串(string)、索引名(index)、关系(relation)、过程体(process)以及整数(integer)、分数(fraction)、浮点数(float)、复数(complex number)等数据结构, 而矩阵(matrix)在Maple中表示为阵列, 是一种特殊的表. ( m0 ?/ M0 @7 [6 q  y( S
4.1 数据类型查询
# M" Q1 E2 v8 n% U3 H在Maple中, 用whattype指令来查询某个变量的数据类型或特定类型, 命令格式为:
+ S" d0 }( X+ ~$ bwhattype(expr)        # 查询expr的数据类型
9 E/ M! Z. a/ }; X2 G! q" X1 itype(expr, t)           # 查询expr是否为t类型, 若是则返回true, 否则返回false
. Y- H  C0 {7 b! E$ X> whattype(12);+ k7 O7 x$ D) }5 \6 ?3 V& T: Q* z
' h% m+ A+ F: S4 E& G* k
> whattype(Pi);
& w2 Y# X  N/ w6 `* w  f1 Q' } + i( `; h" W0 f1 I7 p* _" R/ g
> type(1.1,fraction);; b9 k2 ?: \1 o  J
; v" p1 s+ |! ?" f
> whattype(1.1);
9 M; b/ d1 m' k* O4 y4 k- t8 V7 i
1 [1 n) m; |6 a* X- ?4.2 序列, 列表和集合4 X" L  d. d( C* h8 Z- g9 w
4.2.1 序列
+ u1 w; Z( v" ?* D# H所谓序列(Sequence), 就是一组用逗号隔开的表达式列. 如:   , H; G# u! |- d
> s:=1,4,9,16,25;
2 {5 z- h3 D: [) l 0 F- L( ?) F$ H% t7 x$ P: L+ J( l5 i7 D# B
> t:=sin,com,tan,cot;9 I+ j! F% T$ x- ~

: Q7 R3 A2 R$ r- d一个序列也可以由若干个序列复合而成, 如:   " s: R6 P- x7 V  x
> s:=1,(4,9,16),25;
- x: x) y7 ^5 y4 A1 m: D- h
% N. V% G' K3 q> s,s;) s, _0 e/ ?0 F$ b4 P& U: @
) I- ?! D: a. z9 y( I
而符号NULL表示一个空序列. 序列有很多用途, 如构成列表、集合等. 事实上, 有些函数命令也是由序列构成. 例如:   1 o# n7 Y- d$ R% U: I. M
> max(s);
* @, o9 Y5 s( K; K( p" x& H " X- T0 r, b' d
> min(s,0,s);
  f6 r# H5 X' {1 K& @: g6 C ; ^( J- W  z9 \9 Q+ m8 o- R# u+ Y
值得注意的是, op和nops函数命令不适用于序列, 如op(s)或nops(s)都是错误的, 如果要使用op(s)或nops(s)前应先把序列s置于列表中.
$ I0 J( A) W' C8 M> s:=1, 2, abc, x^2+1, `hi world`, Pi, x -> x^2, 1/2, 1;
. x" I! ]& H/ w' E& d" E
5 P! G, [8 b' M5 r6 }* @' j7 d> op(s);* W) ]! J3 r- N+ X- w& J
Error, wrong number (or type) of parameters in function op" y; i! ]# _( b% c& U* G/ r. l
> nops(s);: a8 v. A. h- F6 c" w+ O
Error, wrong number (or type) of parameters in function nops
  m" g1 M9 t9 C! k# l% n" C> op([s]);% ?2 D5 `/ O# X1 k% }, ^$ c

, U2 K. F) V9 E$ E. l> nops([stuff]);
8 R# Z' o: S# r ' j( Y: O0 t- G0 K
函数seq是最有用的生成序列的命令, 通常用于写出具有一定规律的序列的通项, 命令格式为:   
2 x+ s# d/ U- ~8 ~6 u: f$ \5 Cseq(f(i), i=m..n);  # 生成序列f(m), f(m+1), …, f(n) (m,n为任意有理数)8 u& }. D0 k. X' p
seq(f(i), i=expr);  # 生成一个f映射expr操作数的序列5 W8 S7 h, H' F1 F4 ]
seq(f(op(i,expr)), i=1..nops(expr));  # 生成nops(expr)个元素组成的序列
; F$ m( g2 K7 z1 ~+ F> seq(i^2,i=1..10);
( e  a7 r" Q* O& ?1 r
$ k  _8 j; \+ h2 W% e' y, ?> seq(ithprime(i),i=1..20);
9 z- _" P7 }& M, l6 h2 B
  L" N! |- u- {> seq(i^3,i=x+y+z);
; U4 {* e5 h/ i& n6 x7 B
' r: Q; o4 |. @! k0 ^3 l> seq(D(f),f=[sin,cos,tan,cot]);
" x# U* [, {, X, Q
! Q, U( }7 ?3 T> seq(f(op(i,x1+x2+x3+x4)),i=1..nops(x1+x2+x3+x4));1 b0 `8 u% {1 i, X

' Z3 f6 e  s7 {6 V获得一个序列中的特定元素选用操作符[  ], 如:   4 }6 m/ K4 d) B: n' D9 |
> seq(ithprime(i),i=1..20);
; i/ k6 X1 `4 N; |: t% l* c
  z6 ]- s; k3 F1 y- }' w/ t( P> %[6],%[17];
  ^4 j/ x' O2 X- s& \, p$ s : h5 j; [$ v" m$ N: R$ ?7 K: ]
4.2.2 列表, [4 i/ `/ ~8 Q9 `5 H- t- f' c
列表(list), 就是把对象(元素)放在一起的一种数据结构, 一般地, 用方括号[  ]表示列表. 如下例:   
& L7 R2 M9 T1 U0 r9 J* a& d- A  I> l:=[x,1,1-z,x];3 N* O7 M+ ?, P( R0 D; E3 H6 x

! W* @1 o4 T- G> whattype(%);
3 ~& J* k1 v/ L+ g9 Y, ~   t' `# ]! q. }1 {* R& Z; P. w
空列表定义为[ ].
1 v, P2 v1 b: c! ?8 H2 f, ?/ x但下述两个列表是不一样的, 因为对于列表而言, 次序是重要的:   3 J7 `' i4 G, s/ v% K9 O0 I
> L:=[1,2,3,4];
3 `* s: z5 x; y- |+ W
/ G/ C4 O$ g  T& J9 p, o> M:=[2,3,4,1];
% q1 G& q8 S6 {1 B1 l ' V; c* R3 s- L! q+ u% M7 j$ {
4.2.3 集合
9 F  a# a4 p- b/ h; M2 w3 C集合(set)也是把对象(元素)放在一起的数据结构, 与列表不同的是集合中不可以有相同的元素(如果有, Maple也会自动将其当作同一个元素), 另外, 集合中的元素不管次序. 一般地, 用花括号表示集合. 1 \4 a( J1 A8 c
> s:={x,1,1-z,x};
$ Y- A  h. C+ D! F6 s% h
0 k( e) G9 X6 ~  {- B> whattype(%);6 Y& A6 Z) g  o/ W% L% M

0 ^) R6 S; z  S- l空集定义为{ }.
: e5 n! ~. I& h- t; w4 S函数nop返回列表或集合的元素数, 而op则可返回其第I个元素.
9 S  w; \9 Z! r2 {, P" O1 c> op(1,s);2 ~) o- T1 l* N: a4 u4 h9 y

) f  {) D+ {5 H' e> s[1];3 _0 ^2 ^2 i: W/ i
4 z, }! K; P* g# J
> op(1..3,s);
4 E" J0 S4 Y1 q  i# \7 V) ~7 N! r 6 t5 [8 G: k8 B" F4 Z4 l
> s[1..3];
6 n$ \, K; p* N6 O- \3 T( S
8 `; z' L2 j/ i( c  ~* x# H函数member可以判定元素是否属于一个列表或集合, 如果属于, 返回true, 否则返回false.
8 E* ?  W; d6 s3 w1 l* G> member(1+x,s);
+ C) y% a. ^! j( i' Q! h; N
( ]! [1 @* a7 U: w9 p( c6 R4 v) T可以通过下述方法在列表中增减元素:   
* y7 h5 h" L# K' {, K1 r> t:=[op(s),x];
, D! f: o, k1 ^" [* V ' q8 h* [) N4 T4 s. |+ U  T
> u:=[s[1..5],s[7..nops(s)]];! J) t3 n+ W6 ?( [/ O3 {/ S  N# `
- j" a2 m" c+ i: l( ]
Maple中集合的基本运算有交(intersect)、并(union)、差(minus):   
6 @! m, t1 f) ^> A:={seq(i^3,i=1..10)};B:={seq(i^2,i=1..10)};+ \3 J) j5 g8 X- [+ L

8 B8 s4 F5 a" D. \) s
/ h% q- d; Z4 M' k0 E4 ?; ~- u7 S7 C+ X> A intersect B; ) f% i% g( c, ]! _2 Z4 H8 M
. v2 v) U5 w7 p5 R
> A union B; 9 K) w: K2 Y9 Z

- Q" h& a+ J2 r6 D% ?> A minus B;5 _: \7 u7 T5 z
  W+ f4 x, C1 Q% k3 _6 C: X' F; J
4.3 数组和表6 E0 a. t; W1 e( d' t$ L
在Maple中, 数组(array)由命令array产生, 其下标变量(index)可以自由指定. 下标由1开始的一维数组称为向量(vector), 二维以上的数组称为矩阵(matrix). 数组的元素按顺序排列, 任意存取一数组的元素要比列表或序列快的多. 区分一个数据结构是数组还是列表要用“type”命令.
2 l3 @& e2 D# `! u. j+ K) i    表(table)在建立时使用圆括号, 变量能对一个表赋值, 但一个在存取在算子中的未赋值变量会被自动地假定是表, 表的索引可以成为任意Maple表达式. 表中元素的次序不是固定的.
! Q8 K. E/ u7 P, X3 }> A:=array(1..4);
" m3 {( O3 S+ U& \, {( c
( k4 L% f/ K6 ?: {& F) S> for i from 1 to 4 do A[i]:=i: od:
8 N; I0 @5 P! Q" ^- ?> eval(A);0 c6 \7 N* H* \8 Y. b# V( S6 c
" k1 {5 B* |/ T' G. m5 _3 N
> type(A,array);
" [  }9 R  j1 Y 1 G- z7 k( f8 l* ^! K5 Z: }$ N$ S
> type(A,list);' K+ }9 w$ T: o3 [% |
3 u8 B1 W7 S2 ~3 e- I+ \
> T:=table();
; t& c% F- A6 I" ~* D
5 j6 M& E7 [3 p> T[1]:= 1;
8 T6 O3 J5 i+ i9 [8 u* q/ n 4 f. ^: t8 f! ~% x0 H$ w8 i
> T[5]:= 5;
2 q+ e1 Q3 v( P  ~
4 L; m/ Z: v3 n1 m) J* _# _> T[3]:= 3;) B0 }$ X+ X; K

' s: t: ?0 h" o- r3 X% G> T[sam]:=sally;
2 H0 q0 S; o7 u8 v3 _
+ _' t1 |) G- }  A, e> T[Pi]:=exp(1);3 h! w9 B/ O; c, I( ?' ^

7 V5 F! N( G* [: {: \) v) \7 V3 C1 S> x:='x';4 I, `8 Y& i) Z( y

% U7 o5 W3 M/ h& L( S> T[(1+x+x^3)*sin(x)] := 0;9 ]/ W- d2 u$ b0 S* {
* s, f. A. A7 U9 J1 ^! q  g- m+ p
> eval(T);% {; b, a- ?5 B6 \+ z% e
4 Y  c( n2 ]9 A( y' t. S
> T[3]:='T[3]';
( N* U6 |* N6 p0 K# Y
9 ~3 z6 p' A0 Y" {) h- r> eval(T);
6 L! d9 J' y4 c* k2 a
# m  z+ B# u  q2 l4.4 其他数据结构$ P4 n. S6 X9 N& l
串在Maple中是很重要的, 他们主要用于取名字和显示信息. 一个Maple的串可以作为变量名, 它们中的大多数是简单的、不需要加引号的串, 但是如果变量名中包含/. 例如“diff/T”则必须把变量名用引号括起来. + _$ U) i4 U; R) c( X  R
索引名是像Database[1,2,drawer]或A[3]这样的对象, 在使用索引前不需要直接建立表, 如果不得不做, Maple会自动建立表. 索引名通常被用于矩阵和向量. 为了保证Maple建立表的正确次序, 建议在赋值前直接建立.
" G# u& U0 ^; i) `7 e> x:=T[3];7 G& [1 m( F, `& r0 T
5 Y! N5 ^4 ~5 g& E# P7 {% O- P3 j
> eval(T);
8 M: l) w5 K  a* q5 v# o # s( K- v6 f( y0 V
> T[5]:=y;
+ b: s7 z6 I  l/ Q
7 V" F3 k$ r9 j9 R> eval(T);
7 |' k. r3 ?# Q, W ) p, M$ R$ R" ?% P
由此可见, Maple并不直接建立T的表, 直到给T[5]赋了值.     % d7 u; v8 Q0 f2 g+ L" d2 }
数值数据结构(整数、分数、有理数、浮点数、硬件浮点数和复数等)在它们的使用中是大量透明的. 浮点数是有传染性的, 这意味着如果数值结构中有一个是浮点数, 则整个结构自动转换为浮点数. 8 G  W( R8 T+ m7 Y: p+ x( q
4.5 数据类型转换和合并8 u" t. ^8 e! i# r' m) P
convert是一个功能强大的类型转换函数, 它可以实现列表和数组的类型转换:   2 u6 T  U% c' f% ^, }
> L:=[1,2,3,4];
6 f4 T& s; E5 h, S
7 _3 I+ W6 J& K6 i' ^- f7 G> type(L,list);) x7 L' p+ H' y- h7 M, B$ Y
* D% ^: U4 I5 \9 h4 \; @
> A:=convert(L,array);) T( `. T# y: ?3 p2 I
; r1 p* _. L2 G
> type(A,list);
' a/ r% W+ z* S* T
' c! n0 v& w2 x/ H5 o: k> type(A,array);6 X# Q' R2 ]8 E7 t& o
2 ^* h5 d  Z0 V1 s! \
另一个有用的函数zip则可把两个列表或向量合并:   ; b2 }# t9 x+ s( T
>L:=[seq(i,i=1..10)];9 ?+ L7 s4 W6 M+ C# |& c& Q6 B

+ ?( Z; m: U) z  ~  _> Sqr:=(x)->x^2;4 o  a  d, J6 l5 w
2 ?1 S; B$ ~$ F' b# S2 B1 q
> M:=map(sqr,L);
$ r" s& `3 ^& M2 ~  I7 K; Y4 x 8 m/ i2 }# E4 i& ~) @
> LM:=zip((x,y)->[x,y],L,M);5 V0 Q4 S  d; K" T) U; H' H
/ U3 S3 T8 O' G) c/ Q. W. H! S, K
> map(op,LM);( Q- `5 `6 l5 D& V; M$ G
! |( F% r2 g! K* _
5 Maple高级输入与输出操作% `: I# D: s4 c" }* W7 B+ d( B
Maple提供了良好的接口来编辑与计算数学式. 许多时候, 我们可能需要把Maple的运算结果输出到一个文件中, 或者在一个文本编辑器里先编好一个较大的Maple程序, 再将它加载到Maple的环境里. 9 i! l4 @1 |3 l# h
5.1 写入文件1 D1 x3 ?) d$ g
5.1.1 将数值数据写入到一个文件: I8 r" O9 ?, b, S
如果Maple的计算结果是一长串的数值串行或数组, 而想把它写到一个文件时, 用writedata命令.
3 h, @, x5 T4 A! s$ L, U若Maple的计算结果data为集合、矩阵、列表、向量等形式时, 将其写入名为filename的文件时命令格式为: writedata("filename", data);# s. `$ m9 ]: N9 w! G- W! p5 r
> with(linalg):& y1 M; S) B4 P
> M:=matrix(3,3,[1,2,3,4,5,6,7,8,9]);& n1 w/ M0 M% v

& U) H* I  `+ t' g> writedata("e:\\filename.txt",M);0 b+ h$ p- z! r
而将结果附加在一个已存在的文件后时,使用命令: writedata[APPEND]("filename", data);. k" M+ Z, S3 {/ C3 ?6 o
> W:=matrix(2,2,[1,2,3,4]);+ o, X/ d. [7 i
; _7 V& N- ^8 E7 X8 F( t8 |' `
> writedata[APPEND]("e:\\filename.txt",W);+ F, f: }1 r* f6 {% r7 G' ~
需要注意的是, 这里的APPEND是必需的, 否则W结果将会覆盖M结果.
3 n& Y0 d+ ]$ G5 z& h另外, 若想将结果显示在屏幕上时, 用命令: writedata('terminal', data);
( z; `5 V8 M; Y5 X( v> writedata[APPEND]("e:\\filename.txt",W);
5 \# p2 a+ f1 y> writedata('terminal',M);7 E+ N) ?! T, I# O3 ]
1                   2                   3           & }4 Q7 }% O+ v7 [' `7 M' J: c$ {
4                   5                   6           - g6 ]% y0 m5 E& b% H) m6 i, \
7                   8                   9    ; k# c; x8 R) N1 a  a+ f# W
5.1.2 将Maple语句写入一个文件* \9 N: Z" O0 N! v" z
如果所要写入文件的是表达式、函数的定义或者是一个完整的程序, 则使用命令save, 写入一个或多个语句的命令格式分别如下:) I( J* X- V0 M6 B! y6 A
save name, "filename";
& Q3 [/ E5 H0 F% {( w4 Isave name1, name2, …, "filename";% @& x) Y% t& M5 y5 v
若filename的扩展名为.m, 则Maple会以内定的格式储存, 若扩展名为.txt, 则以纯文本文件储存. 以内定的格式储存的文件作纯文本编辑器无法读取, 但在大多数情况下, 它会比纯文本文件的加载速度更快, 且文件容量小.# x' i  {+ X2 j0 x' l. K7 Z
> myfunc:=(k,n)->sum(x^k/k!,x=1..n);
( b6 [  O" ?  F' t  [6 H7 D5 J
3 L/ u& p" i. s, T> myresult:=myfunc(6,8);
  ^  u  ~8 N6 R/ x) `6 Z% f $ l- U+ m" y9 y* t: j6 d! N
> save myfunc,myresult,"e:\\test.m";6 I3 x  ?  Z0 \5 Q
调用已存m文件用命令read. 试看下述实验:7 S5 ~/ |9 @. ]) [, D# j
> restart:" I: Z+ Y3 N; u% S
> myfunc(6,8);; a7 ?0 [# F2 w, t
+ W+ c2 T( a8 d: |$ D8 G6 T
> read "e:\\test.m";
) s+ f# z1 P7 k/ d" F5 L: C' `3 O> myfunc(6,8);
/ u9 j, {5 h$ q ' |! O2 w, i  h3 C4 N
> myresult;
  z, @" k: Q* J0 @/ E0 D9 ` 9 t* k2 o" W4 g. v
    而存为txt文件时则将整个语句存为一个文件:
) I, p- W9 ]' {* Z4 u+ n& Z; C1 O& _> save myfunc,myresult,"e:\\test.txt";
  |8 w' @* Q: u: O> restart: read"e:\\test.txt";
# z7 T, f3 d& {
( q/ z0 G  }$ y( |, r4 v8 Q- W
+ r; U9 G3 l& r5.2 读取文件
  }! O9 ]/ I6 c6 ?1 g' g& y在Maple里最常用的两个读取文件的命令, 一个是读取数值数据, 另一个是是读取Maple的指令.
& ~0 a$ W5 R! B2 {! x4 f9 o5.2.1 读取数值数据; Q& t4 p* C; f! k0 X3 j4 I
如果想把大量的数据导入Maple里进行进一步的运算或者要运用大量的实验数据在Maple环境绘图时, 可以用readdata( )命令完成.
( B9 X& {% O* }& Q! B. ~' a从filename文件里读取n行数据时使用命令: readdata("filename",n);  J' E9 K. T6 x
以指定的格式读取数据时使用命令: readdata("filename",[tyep1,type2,…]);' L2 ?* s  @- }4 A9 {' A8 N
> readdata("e:\\filename.txt",3);) s8 i0 ~, `) _3 L
, i0 @5 k6 ^2 Y$ Z' ^' j9 K
    读取filename的前三列, 第一列为整数形式, 第二、三列为浮点数形式:; p+ P' E" e' `/ N- ?4 B: `
> readdata("e:\\filename.txt",[integer,float,float]);
' X7 L( q# G/ D# U  a ' X  u5 I: D2 K4 m8 \
下面再看一个运用大量的实验数据在Maple环境绘图的实验:
4 P% `9 O+ U4 W/ Q5 P7 T! y2 C9 K> mypts:=[seq([x/1000,cos(x^2/100000)],x=1..1000)]:
% e, E& Z4 y  N- @> writedata("e:\\data.txt",evalf(mypts));
4 }( H# z* M- P1 ^5 @- i> dots:=readdata("e:\\data.txt",100):/ ~7 K7 ]9 f# O" v; i! k
> nops(dots);
! {; ?9 F% \, M2 m, r% q  x
/ [0 x" @/ b7 b4 \: R> dots[1..4];
( W4 E' P4 q% @# T+ |/ s& O2 m+ S- I
$ M: n& m. @6 N! b/ i( O8 {> plot(dots,style=line);- k* {! U! Y+ ]" c& ^& q' X# J
/ i0 m9 s; l3 x( m# u! P
5.2.2 读取Maple的指令
. C. @! \/ \! |6 j; ^8 L1 `- F在编写程序时, 在普通软件中先编好程序再将其读入Maple环境中常常比直接在Maple中编写更为方便. 如果要将程序代码或Maple指令加载用read命令:
( z7 g0 H1 _* \, [read "filename";
$ m9 ]8 j" x( n! Q8 G7 v如下例:; B9 i  L( o5 ~1 U- Q1 u' V/ e. L
> reatart:, C" |( V5 P4 p* e4 ~
> myfunc:=(a::list)->add(i,i=a);
; E' ]9 @. h8 v* z. A
5 M& K/ q' f3 @7 n' Z- k> avg:=(a::list)->myfunc(a)/nops(a);" L5 X7 w4 V( ^- M( w1 e

0 ~/ K0 R4 z& N  s. @% @# V> save myfunc,avg,"e:\\function.m";
& d8 G3 ^9 \8 n> restart:, `$ y* ]$ _: X; _6 d' L  Y
> read "e:\\function.m";
$ h; G4 o% W* k# N% R6 C> myfunc([1,2,3,4,5,6,7,8,9]);& g9 H3 \+ \6 }3 q, i5 \3 w
; q5 }% g/ G- p; {0 o7 X* S# k
> avg([1,2,3,4,5,6,7,8,9]);
9 M! W& f  Q( {/ w( x9 ]  o! \
- l# Y$ f+ x; q5.3 与其它程序语言的连接" P1 o  C6 J8 x. F1 b2 |7 ^9 v( S! I
5.3.1 转换成FORTRAN或C语言& F1 F3 V8 o5 w) G! _
调用codegen程序包中的fortran命令可以把Maple的结果转换成FORTRAN语言:
8 V$ n: z4 N2 G0 S, s. A: t> with(codegen,fortran):: X- T- g) c. o% ]3 J
f:= 1-2*x+3*x^2-2*x^3+x^4;
8 L* J0 k0 _( [) c9 H0 b " c. P1 V* U% d9 P" G: C
> fortran(%);
4 D8 K8 W6 x9 C" k* L      t0 = 1-2*x+3*x**2-2*x**3+x**4
% y( K# Q# q. J5 b > fortran(f,optimized);7 R% F4 }% N5 i8 R
      t2 = x**2
; S7 o1 W) ]" Z/ ]4 O* c      t6 = t2**23 u) \* ^( a6 \5 u
      t7 = 1-2*x+3*t2-2*t2*x+t6, L: v' V# p# }, J9 M, k
> fortran(convert(f,horner,x));
, }& i& D9 u* S0 ?# |5 d      t0 = 1+(-2+(3+(-2+x)*x)*x)*x
* Z- W- {* o% u0 A8 \" l% P8 |0 ]而codegen程序包中的C命令可以把Maple结果转换成C语言格式:, W, w* f1 J+ g& ], \4 p
> with(codegen,C):
) M$ V1 Y4 t* Z1 E9 y3 Wf:=1-x/2+3*x^2-x^3+x^4;
1 o) ^; [( ~1 ? 8 ]* ?0 x1 C% t) V8 A3 d
> C(f);% {8 e( d, A; j
      t0 = 1.0-x/2.0+3.0*x*x-x*x*x+x*x*x*x;8 O7 t6 J: p$ ]! i
> C(f,optimized);
% [. }6 m9 G+ R      t2 = x*x;1 U7 U0 }/ ^7 c6 I3 t0 c
      t5 = t2*t2;9 s# s) k/ |, N3 U
      t6 = 1.0-x/2.0+3.0*t2-t2*x+t5;
! D  O8 j3 M( Z" {$ W, Woptimized命令表示要对转换的表达式进行优化, 如果不加此可选参数, 则直接对表达式进行一一对应的转换.
$ [& ]: s) D" B6 }; A, r2 q4 o5.3.2 生成LATEX
' N5 N& r2 H& L9 YMaple可以把它的表达式转换成LATEX, 使用latex命令即可:
* s+ v, y- x" c8 S) M> latex(x^2+y^2=z^2);
0 l0 L6 ]) N+ f5 R{x}^{2}+{y}^{2}={z}^{2}; r, T- D* [" {. L1 v  }, E1 x
    还可以将转换结果存为一个文件(LatexFile):
( h1 l' E7 X0 B4 _: F> latex(x^2 + y^2 = z^2, LatexFile);  P/ p, L# U5 T4 v. z( _- x
    再如下例:
& L2 |$ k' E# T> latex(Int(1/(x^2+1),x)=int(1/(x^2+1),x));
) O, V3 D  f6 `* \& d\int \! \left( {x}^{2}+1 \right) ^{-1}{dx}=\arctan\left( x \right)
0 t& F. Z/ M7 J/ A6 a4 j7 U6 @* m, K. [& Y9 b* H5 E
zan
已有 1 人评分体力 收起 理由
darker50 + 2 用word发不是很好吗?呵呵!

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

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

107

主题

45

听众

1万

积分

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

    [LV.5]常住居民I

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

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

    回复

    使用道具 举报

    33

    主题

    10

    听众

    1691

    积分

    升级  69.1%

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

    [LV.7]常住居民III

    发帖功臣 新人进步奖

    群组: PLC和单片机

    群组: 2012第三期美赛培训

    群组: MCM优秀论文解析专题

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

    群组: 学术交流B

    回复

    使用道具 举报

    33

    主题

    10

    听众

    1691

    积分

    升级  69.1%

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

    [LV.7]常住居民III

    发帖功臣 新人进步奖

    群组: PLC和单片机

    群组: 2012第三期美赛培训

    群组: MCM优秀论文解析专题

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

    群组: 学术交流B

    回复

    使用道具 举报

    46

    主题

    3

    听众

    1967

    积分

    升级  96.7%

  • TA的每日心情
    怒
    2014-4-15 00:06
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    社区QQ达人 新人进步奖

    群组: 数学建模

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

    群组: LINGO

    听说女人如衣服,兄弟如手足。回想起来,我竟然七手八脚的裸奔了20年!
    + @9 M! t9 o& [- V
    $ j( v1 {4 y7 [/ ]+ |6 v7 k
    ! a- I, c# N  P+ y
    回复

    使用道具 举报

    0

    主题

    2

    听众

    19

    积分

    升级  14.74%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    0

    主题

    4

    听众

    181

    积分

    升级  40.5%

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

    [LV.5]常住居民I

    群组: 学术交流A

    群组: 学术交流B

    回复

    使用道具 举报

    0

    主题

    13

    听众

    27

    积分

    升级  23.16%

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

    [LV.3]偶尔看看II

    社区QQ达人

    群组: 国赛讨论

    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-10-10 10:37 , Processed in 2.911134 second(s), 101 queries .

    回顶部