QQ登录

只需要一步,快速开始

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

maple基础

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

1

主题

5

听众

4

积分

升级  80%

该用户从未签到

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

/ O& z8 C4 q, E! b5 F3 {
+ M9 o) h7 K* L; D' ^9 I! A+ Y# d & O9 V* P; `; Y
6 F" G, y% h9 }! p' h$ c( `
% Q+ F/ e0 g4 K+ C* O

3 J8 E' l3 ?7 @
5 \  X6 F& T4 {+ W4 ^* L2 r$ k, j
" e8 J% I" T7 w+ G - B# A5 e& K# \6 i
6 X% p4 f% X$ q+ J' ^
- ^" ^0 i! F6 T3 E) i$ ]- X$ b$ S
alpha        beta        gamma        delta        epsilon        zeta        eta        theta        iota        kappa        lambda        mu
/ r% A5 k  X: ]3 h/ U% z 9 X$ K" a8 `; J

/ L% A/ p7 l8 f1 W+ s! {
" b+ o7 |3 s( D
# |- q* X9 |" t( z) v
- R# f  a& L" h: W* s$ D* G
7 C$ F3 j7 t$ n' d/ w. g : t& o/ u4 J/ [5 d" P, L1 B& L

! p) l6 J3 {- t: B' H7 ~' N
' n2 _0 L0 U) p
# q2 J4 u* {& ^1 g# P4 y7 ~7 |/ s 7 O* t! \! ?! ~1 F

9 h# X6 s, t. ]' m1 C
4 y: {: V+ f. G1 v7 qnu        xi        omicron        pi        rho        sigma        tau        upsilon        phi        chi        psi        omega
: s0 i7 `1 ^2 G有时候为了美观或特殊需要,可以采用Maple中的函数或程序设计方式控制其输出方式,如下例:
; _/ I5 H! }% g, y0 ?( L! f1 j; l" \> for i to 10 do ' F2 q6 U9 Q- \& c, X1 w
printf("i=%+2d and i^(1/2)=%+6.3f", i, eval(sqrt(i)));, \9 i9 K+ k5 T7 `: b' ?
od;1 q) @/ C  V7 }$ b8 {/ l- @
i=+1 and i^(1/2)=+1.000i=+2 and i^(1/2)=+1.414i=+3 and i^(1/2)=+1.732i=+4 and i^(1/2)=+2.000i=+5 and i^(1/2)=+2.236i=+6 and i^(1/2)=+2.449i=+7 and i^(1/2)=+2.646i=+8 and i^(1/2)=+2.828i=+9 and i^(1/2)=+3.000i=+10 and i^(1/2)=+3.162# ^/ U: x/ {5 d
+2d的含义是带符号的十进位整数,域宽为2. 显然,这种输出方式不是我们想要的,为了得到更美观的输出效果,在语句中加入换行控制符“\n”即可:8 {/ i+ }; U, T( ^
> for i to 10 do & N3 z: w) [( |1 |2 ?& H: H( K9 X
printf("i=%+2d and i^(1/2)=%+6.3f\n", i, eval(sqrt(i)));9 [% X% [3 S+ P5 C
od;
- H+ }+ u! p' R) M4 oi=+1 and i^(1/2)=+1.000& }0 b, l$ k6 _; _' U# a
i=+2 and i^(1/2)=+1.414
( P. u+ T0 I; F# p2 gi=+3 and i^(1/2)=+1.732# X. c' ]1 n7 o  c+ a* w9 i
i=+4 and i^(1/2)=+2.000! v( S6 B. k, _* l8 `9 F
i=+5 and i^(1/2)=+2.236
. b9 C- X& m% |# }( q% o) C  O" Si=+6 and i^(1/2)=+2.449  Y  k# g+ p! n; q: h' Q  T1 f' B6 G
i=+7 and i^(1/2)=+2.646% S2 h( D3 t/ p. w  o/ [
i=+8 and i^(1/2)=+2.828' a; ^/ U9 L( Y* _- F' R
i=+9 and i^(1/2)=+3.0009 Z: V1 h' t1 U* @/ J$ X- D
i=+10 and i^(1/2)=+3.162
$ i" Q1 ]# A0 a* D- M1 p. D再看下例:将输入的两个数字用特殊形式打印:3 c" g& X* m# p* T, B! P! ?2 j
> niceP:=proc(x,y)
$ t" g8 }! U/ C8 i5 gprintf("value of x=%6.4f, value of y=%6.4f",x,y);
1 d0 W' w# p8 ^' Nend proc;$ @/ g* D  o1 C, D+ ]# f
" _, q* x- g1 z- ?' A+ [; r
> niceP(2.4,2002.204);
9 m9 O  `. Z, l5 m9 evalue of x=2.4000, value of y=2002.2040" F  v7 w) o  _: {& k" H
1.4 Maple联机帮助
3 o. g# g! I, j; k学会寻求联机帮助是掌握一个软件的钥匙. Maple有一个非常好的联机帮助系统, 它包含了90%以上命令的使用说明. 要了解Maple的功能可用菜单帮助“Help”, 它给出Maple内容的浏览表, 这是一种树结构的目录表, 跟有…的词条说明其后还有子目录, 点击这样的词条后子目录就会出现(也可以用Tab键和up, down选定). 可以从底栏中看到函数命令全称, 例如, 我们选graphics…, 出现该条的子目录, 从中选2D…, 再选plot就可得到作函数图象的命令plot的完整帮助信息. 一般帮助信息都有实例, 我们可以将实例中的命令部分拷贝到作业面进行计算、演示, 由此可了解该命令的作用.
, F, i1 P+ K, N& \* {在使用过程中, 如果对一个命令把握不准, 可用键盘命令对某个命令进行查询. 例如, 在命令区输入命令“?plot”(或help(plot);), 然后回车将给出plot命令的帮助信息, 或者将鼠标放在选定的要查询的命令的任何位置再点击菜单中的“Help”即可. " l+ K) S9 c! V
2  Maple的基本运算; b4 ]9 a+ k2 Y: C2 E" `
2.1 数值计算问题
$ R' b! Q7 T# B) z; R算术是数学中最古老、最基础和最初等的一个分支, 它研究数的性质及其运算, 主要包括自然数、分数、小数的性质以及他们的加、减、乘、除四则运算. 在应用Maple做算术运算时, 只需将Maple当作一个“计算器”使用, 所不同的是命令结束时需加“;”或“:”.
" U2 `( C/ J: Y" a  {7 b9 m在Maple中, 主要的算术运算符有“+”(加)、“–”(减)、“*”(乘)、“/”(除)以及“^”(乘方或幂,或记为**), 算术运算符与数字或字母一起组成任意表达式, 但其中“+”、“*”是最基本的运算, 其余运算均可归诸于求和或乘积形式. 算述表达式运算的次序为: 从左到右, 圆括号最先, 幂运算优先, 其次是乘除,最后是加减. 值得注意的是, “^”的表达式只能有两个操作数, 换言之,  是错误的, 而“+”或“*”的任意表达式可以有两个或者两个以上的操作数.
; I+ P8 Y5 h( [3 i. j/ z, @Maple有能力精确计算任意位的整数、有理数或者实数、复数的四则运算, 以及模算术、硬件浮点数和任意精度的浮点数甚至于矩阵的计算等等. 总之, Maple可以进行任意数值计算. 0 \" z) x: u2 f7 w* \/ o
但是, 任何软件或程序毕竟只是人们进行科学研究的一种必要的辅助, 即便它有很多优点, 但也有它的局限性, 为了客观地认识数学软件、认识Maple, 下面通过两个简单例子予以说明.
" W7 e6 |+ s# I9 h7 G  K第一个简单的数值计算实例想说明Maple数值计算的答案的正确性:   - I& F- b$ u) Y: s  f5 {
> 3!!!;
/ @8 t) w7 J5 H$ {  N! q( j2601218943565795100204903227081043611191521875016945785727541837850835631156947382240678577958130457082619920575892247259536641565162052015873791984587740832529105244690388811884123764341191951045505346658616243271940197113909845536727278537099345629855586719369774070003700430783758997420676784016967207846280629229032107161669867260548988445514257193985499448939594496064045132362140265986193073249369770477606067680670176491669403034819961881455625195592566918830825514942947596537274845624628824234526597789737740896466553992435928786212515967483220976029505696699927284670563747137533019248313587076125412683415860129447566011455420749589952563543068288634631084965650682771552996256790845235702552186222358130016700834523443236821935793184701956510729781804354173890560727428048583995919729021726612291298420516067579036232337699453964191475175567557695392233803056825308599977441675784352815913461340394604901269542028838347101363733824484506660093348484440711931292537694657354337375724772230181534032647177531984537341478674327048457983786618703257405938924215709695994630557521063203263493209220738320923356309923267504401701760572026010829288042335606643089888710297380797578013056049576342838683057190662205291174822510536697756603029574043387983471518552602805333866357139101046336419769097397432285994219837046979109956303389604675889865795711176566670039156748153115943980043625399399731203066490601325311304719028898491856203766669164468791125249193754425845895000311561682974304641142538074897281723375955380661719801404677935614793635266265683339509760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+ c( ]8 @( {; g  R% i* Z' N- M( p# Z上述运算结果在IBM PC机(1G, 128M)上计算只需要0.01秒, 得到如此复杂的结果(1747位), 一个自然的问题是: 答案正确吗?
1 ]/ s% @+ O: X) C" P+ t为了回答这个问题, 我们借助于数值分析方法, 由Stiring公式
' D: A( H% |3 m: S7 n
2 O: Q, D: `* j; {5 c1 U6 [+ e可得:  , 前三位数字与Maple输出结果相同, 且两者结果均为1747位. 另外, 在720!的计算中, 5的因子的个数为:   
! N) m& z& H" T3 E; o& v$ v1 r
8 d1 H: S9 m1 F这些5与足够多的2相乘将得到178个0, 而Maple的输出结果中最后178位数为零. 由此, 可以相信Maple结果的正确性. 8 f" x5 {, [4 q2 D# K/ a/ h4 W1 D8 ^
另一个例子则想说明Maple计算的局限性:   4 r$ s! X0 S0 o
  
% `9 I8 q, Z& j" dMaple在处理问题时, 为了避免失根, 从不求算术式的近似值, 分数则化简为既约分数. 因此, 在Maple中很容易得到:     g* `' f- F! i8 ?. K4 J

$ e) e% p% @/ b2 [  e' X* s8 x显然这是错误的. 这一点可以从代数的角度予以分析.
2 Z  A. {/ S+ X1 m" D. Z不妨设 , 则 , 即 , 显然 有3个结果, -2是其实数结果. 2 W. T1 `- u$ q/ R, c0 D7 ]6 w6 I
另一方面, 设 , 则 , 即:/ ~$ p! U3 Q' s! ]% N7 k
/ @) l5 X* V4 t! J) ~- v) x
显然 有6个结果, -2、2是其实数结果. 6 x# a; n' g- V; [
这个简单的例子说明了Maple在数值计算方面绝对不是万能的, 其计算结果也不是完全正确的, 但是, 通过更多的实验可以发现: Maple只可能丢失部分结果, 而不会增加或很少给出完全错误的结果(如上例中Maple的浮点数结果皆为 ). 这一点提醒我们, 在利用Maple或其他任何数学软件或应用程序进行科学计算时, 必须运用相关数学基础知识校验结果的正确性.
; E3 M; W4 c" {" F尽管Maple存在缺陷(实际上, 任何一个数学软件或程序都存在缺陷), 但无数的事实说明Maple仍然不失为一个具有强大科学计算功能的计算机代数系统. 事实上, Maple同其他数学软件或程序一样只是科学计算的一个辅助工具, 数学基础才是数学科学中最重要的.
5 o# C0 y. m% D% a2.1.1 有理数运算* h3 \+ j2 x( z' f* Z
作为一个符号代数系统, Maple可以绝对避免算术运算的舍入误差. 与计算器不同, Maple从来不自作主张把算术式近似成浮点数, 而只是把两个有公因数的整数的商作化简处理. 如果要求出两个整数运算的近似值时, 只需在任意一个整数后加“.”(或“.0”), 或者利用“evalf”命令把表达式转换成浮点形式, 默认浮点数位是10 (即: Digits:=10, 据此可任意改变浮点数位, 如Digits:=20). . A  I) I$ G, J. {1 C; I1 ^
> 12!+(7*8^2)-12345/125;
* G! a% U7 U: l5 B2 b * P! y( K% r) ?8 `( T: [' c' j2 l$ b/ U
> 123456789/987654321;3 f' {6 F7 v: i( e

$ u" w! o) `) h$ M> evalf(%);5 a4 b+ I, e& Z

% X" F* u1 c6 {7 f+ H! h( w! V> 10!; 100*100+1000+10+1; (100+100)*100-9;% {7 S- M% V& x! N3 M( S
7 U2 Q, w* e$ c) U9 S$ |

. F9 z9 g5 f8 N6 w  E 3 L# y9 s! s8 ~! ?1 y9 ~
> big_number:=3^(3^3);  S0 U( G$ x& x% w0 d" t* n; a& X
) k# t  U  }  ^0 _0 Z
> length(%);: Y! i4 {5 N" x# q8 J

6 Q7 p+ e. S7 k! h上述实验中使用了一个变量“big_number”并用“:=”对其赋值, 与Pascal语言一样为一个变量赋值用的是“:=”. 而另一个函数“length”作用在整数上时是整数的十进制位数即数字的长度. “%”是一个非常有用的简写形式, 表示最后一次执行结果, 在本例中是上一行输出结果. 再看下面数值计算例子:   
- y& M1 Z4 c: O1 N    1)整数的余(irem)/商(iquo)
. L! Y. @3 u/ _& d3 x! p/ `0 o- H  {命令格式:   
% L4 H1 M9 j" o; Iirem(m,n);        #求m除以n的余数/ a1 @" U; }, a; y
irem(m,n,'q');    #求m除以n的余数, 并将商赋给q& G; C2 x- f3 X' Q7 ^
iquo(m,n);        #求m除以n的商数
, h8 s% r% }5 X* n' f# }+ jiquo(m,n,'r');    #求m除以n的商数, 并将余数赋给r
; s' n2 S$ V& y% L其中, m, n是整数或整数函数, 也可以是代数值, 此时, irem保留为未求值. , ^" r' {. a# O) w
> irem(2002,101,'q'); # 求2002除以101的余数, 将商赋给q
! B1 ?2 n$ O. U2 W5 n' o9 l
& ?' e% k0 n' M( A: u; u. y% m4 j> q; #显示q
% x% j( y/ P% X) U 8 N: p, d4 @  p# X$ Z, S. h
> iquo(2002,101,'r'); # 求2002除以101的商, 将余数赋给r
$ P# w0 a+ S. I9 Z7 V7 v - X/ B6 j8 x; q4 R( p1 z* Y
> r; #显示r- P& k; V) h0 t
5 r- R5 K0 f7 e5 H7 F2 k# y
> irem(x,3);6 K7 V! e1 [3 j" W5 |8 X
9 F. U! f/ y/ U3 s- Y; ^* ]  ^7 F
2)素数判别(isprime)
6 m) [+ m/ e+ r. F; P素数判别一直是初等数论的一个难点, 也是整数分解问题的基础. Maple提供的isprime命令可以判定一个整数n是否为素数. 命令格式: isprime(n); 4 ^9 f  G+ V9 W) z+ s1 W
    如果判定n可分解, 则返回false, 如果返回true, 则n“很可能”是素数.
1 ]6 w7 M& _9 g3 C> isprime(2^(2^4)+1);
) ?# N3 Q4 c1 a4 M. F1 l ' ?% c. C+ p  T! M6 b
> isprime(2^(2^5)+1);
4 c# I8 E2 o; _) ^- F' o* O" y - d7 {1 z3 T. c, w, C' c
上述两个例子是一个有趣的数论难题。形如 的数称为Fermat数, 其中的素数称为Fermat素数, 显然, F0=3、F1=5、F2=17、F3=257、F4=65537都是素数. Fermat曾经猜想所有的Fn都是素数, 但是Euler在1732年证明了F5=641•6700417不是素数. 目前, 这仍是一个未解决的问题, 人们不知道还有没有Fermat素数, 更不知道这样的素数是否有无穷多.
# u# }6 Z; _9 d4 n8 B6 V+ J3) 确定第i个素数(ithprime)
* `$ R+ N$ ?! ?% }若记第1个素数为2,判断第i个素数的命令格式: ithprime(i);    , G# p) n5 j' w9 i
> ithprime(2002);5 a6 X% J- R: _; q6 R4 F- X

8 R* [; P1 V6 L; Z. ]9 |> ithprime(10000);2 b4 P3 Z0 K8 b4 y9 Q

) s( o+ N; Z- x$ L8 `9 z1 v. y4) 确定下一个较大(nextprime)/较小(prevprime)素数
! s* ]) H& n3 M8 v8 g+ q% r当n为整数时,判断比n稍大或稍小的素数的命令格式为:   
3 s) R7 A, A* s! |1 Z% x& q- cnextprime(n);  
$ Z. N- F# j" b5 M; {! gprevprime(n);
5 ?2 j/ K/ e% ~  h% a" j. m" Z> nextprime(2002);) t( Z+ E! {7 \/ J2 f

# S% o6 U" `) m- r) f- V> prevprime(2002);/ y6 z7 r. e+ G/ l' ]

+ X8 \& e5 h6 c% d- [7 ~5) 一组数的最大值(max)/最小值(min)
6 V( X) h, i* t命令格式: max(x1,x2,…,xn);   #求x1,x2,…,xn中的最大值
! ]8 Q5 `* M: A- i7 T8 t  b             min(x1,x2,…,xn);   #求x1,x2,…,xn中的最小值
" v9 v, c0 `% D# O> max(1/5,ln(3),9/17,-infinity);- @3 W- Y) v! P+ h: K

7 f! Q+ ?' C0 E9 Q2 }+ Q( l! A" o> min(x+1,x+2,y);
# x2 I3 \8 I% S' q  j 6 E) N+ ~3 Y: B
6)模运算(mod/modp/mods)
9 {5 m! r4 a7 C, e" U命令格式:  e mod m;    # 表达式e对m的整数的模运算! j8 n0 p: c$ m" ^' c# n
modp(e,m);  # e对正数m的模运算0 x( r; r9 f& G! ^* M, ?, s
mods(e,m);  # e对m负对称数(即 -m)的模运算
% F! M7 z# n2 O0 T: ?1 l5 I5 m6 H5 Y`mod`(e,m);  # 表达式e对m的整数的模运算, 与e mod m等价. u& `5 k. D0 y* k4 b# P, B( ?, K. T; c
值得注意的是, 要计算i^n mod m(其中i是一整数), 使用这种“明显的”语法是不必要的, 因为在计算模m之前, 指数要先在整数(可能导致一个非常大的整数)上计算. 更适合的是使用惰性运算符“&^”即: i &^n mod m, 此时, 指数运算将由mod运算符智能地处理. 另一方面, mod运算符的左面优先比其他运算符低, 而右面优先高于+和-, 但低于*和/. ' E. c( T& X' y  I7 ~& t) E
> 2002 mod 101;% V* Y8 W5 V, n' `* [! v3 Q
& k( {- |1 b. ~7 Z# K
> modp(2002,101);
- h0 f) d6 _' x  \+ q3 c! r & O2 X4 ], i. @  B
> mods(49,100);- R9 P/ u! h. [9 P2 w
4 Z( M! Z# c* ~1 ^& ~/ k1 F9 W% ]
> mods(51,100);
9 N! r+ @. t4 U8 J   k6 t7 i2 P0 ]. p
> 2^101 mod 2002;  # 同 2 &^101 mod 2002;
5 C& X! v2 Q- N4 S4 x7 x + Q' P8 D* g0 e! U
7)随机数生成器(rand)
! R8 H8 A' v5 \  W命令格式:   
1 }3 P! f/ ^% }5 g8 d$ Frand( );    #随机返回一个12位数字的非负整数
1 S9 v# X( F! k% V/ O. O# \. P  |rand(a..b);  #调用rand(a..b)返回一个程序, 它在调用时生成一个在范围[a, b]内的随机数
. O  X6 @: i* G9 k0 v> rand();+ Q* ]4 R7 Z8 W  y

) \# \: L/ s6 b+ v% X8 ^7 W> myproc:=rand(1..2002):
5 _1 ^; z  f, W/ v3 o> myproc();: a" z, n! \5 q1 m! F$ T9 u
5 y  ^1 e' R4 `" z0 h
> myproc();
; N  d: o, c) g2 {% @0 a8 W 1 C8 o$ ?7 ]9 C  {
    注意, rand(n)是rand(0..n-1)的简写形式.
$ q6 F- w# J/ t2 H5 x: q2.1.2 复数运算
* o% u) k( d' v, h- u复数是Maple中的基本数据类型. 虚数单位i在Maple中用I表示. 在运算中, 数值类型转化成复数类型是自动的, 所有的算术运算符对复数类型均适用. 另外还可以用Re( )、Im( )、conjugate( )和argument( )等函数分别计算实数的实部、虚部、共轭复数和幅角主值等运算. 试作如下实验:   
. B3 t- R4 w2 q8 H$ q# i# a> complex_number:=(1+2*I)*(3+4*I);6 N2 P" A  d2 X7 f. a# n

/ ?/ m, z, B8 K> Re(%);Im(%%);conjugate(%%%);argument(complex_number);. M/ x) k! M6 ~' a+ I2 Q
1 N6 o7 H, k1 X" B" d; C

# U4 Z% e. _9 H' G* U5 c* `
& [' x$ N: v) K4 G/ N
  D6 F% D* l# j( {  \2 f5 {) h( V值得注意的是上行命令中均以“;”结束, 因此不能将命令中的2个%或3个%(最多只能用3个%)改为1个%, 因为%表示上一次输出结果, 若上行命令改为“,”结束, 则均可用1个%.
1 J" g- O0 X# H; o) {: o5 j; }8 g为了在符号表达式中进行复数运算, 可以用函数evalc( ), 函数evalc把表达式中所有的符号变量都当成实数, 也就是认为所有的复变量都写成 的形式, 其中a、b都是实变量. 另外还有一些实用命令, 分述如下:   
- b/ @  ]8 F: ^1 `1) 绝对值函数) ^' x* a* i# d" W2 i3 W0 ^8 U
命令格式: abs(expr);  
; D2 h$ o, H' ]0 k当expr为实数时,返回其绝对值,当expr为复数时,返回复数的模.5 i# s6 k+ `5 @* `$ I5 L( S/ o
> abs(-2002);    #常数的绝对值2 P: v2 g5 ]. e9 i0 ^4 [

5 `: P8 {+ z- p( j& Q> abs(1+2*I);   #复数的模
6 z% _+ O0 G" F9 i, M9 v
# R2 B' ]$ R! P2 `> abs(sqrt(3)*I*u^2*v);  #复数表达式的绝对值7 ], U5 _4 v# Z; K3 S4 q

* W0 {% y) C+ h& P3 m> abs(2*x-5);   #函数表达式的绝对值$ Z5 O$ L8 ], n; {, h3 `" |0 o
, R4 B  S8 U& z( y$ ?
2)复数的幅角函数
! t, _8 K; R/ S# j& f, f" H9 V命令格式:   argument(x);  #返回复数x的幅角的主值; o3 `) a) G1 W5 [# H" H: l
> argument(6+11*I);
3 W3 J3 o$ `% N6 o% Y9 I1 n
& p. ^4 j2 e0 M> argument(exp(4*Pi/3*I));) f: G" r* q1 u; `7 W% e& Z  l

/ M9 v9 U2 ~5 {  A! N  T9 v& ?3)共轭复数
) l5 B# Q6 t5 `, q' T* L3 E命令格式:   conjugate(x);  #返回x的共轭复数& |, v8 e: b$ K& z' n- ]
> conjugate(6+8*I);
' i$ l0 ]0 x$ T6 M# [6 o# T+ { % i2 ~7 s$ ?* F: l0 z8 g
> conjugate(exp(4*Pi/3*I));
2 [- m8 m( k0 O! x# p
) |" C% S2 B! j7 j0 ]% T2.1.3 数的进制转换
# \( L( S  ~0 X0 S) `  M数的进制是数值运算中的一个重要问题. 而在Maple中数的进制转换非常容易, 使用convert命令即可. , ?! Q) o9 Q0 Z" O4 m, \
命令格式:   convert(expr, form, arg3, ...);    : G6 \; L! E* O  g
其中, expr为任意表达式, form为一名称, arg3, ... 可选项. 8 `8 s' I" J/ i, c6 Z
下面对其中常用数的转换予以概述. 而convert的其它功能将在后叙章节详述. - Q/ M8 u! W4 s7 X8 s! D+ w
    1)基数之间的转换, n3 T( j: c' f! E
命令格式:   
$ ~6 u; C. v  F+ ^4 q) Zconvert(n, base, beta);      #将基数为10的数n转换为基数为beta的数6 A3 y8 U# W% j+ B* y- [  R3 p
    convert(n, base, alpha, beta);#将基数为alpha的数字n转换为基数为beta的数
& d' G7 i, v7 [+ O$ ?9 z9 Z4 E1 t> convert(2003,base,7); #将10进制数2002转换为7进制数, 结果为: (5561)7
5 H' o; z& ~' z) T. z # u0 L; n2 q$ _
> convert([1,6,5,5],base,7,10); #将7进制数5561转换为10进制数
  w7 E$ i2 f8 b3 y( f
! c. N$ X( D& @- ?2 v0 p( V8 O> convert(2002,base,60);       #将十进制数2002转换为60进制数, 得33(分钟)22(秒)
: @# U& Y( K& D
% r$ u4 U7 {9 ]0 m  ?1 q# {& ]* g    2)转换为二进制形式: P) [, ^, f8 D, g) _! W+ t
命令格式: convert(n, binary);
$ ~9 J3 h! c- U9 i4 C; p1 [' D3 y其功能是将十进制数n转换为2进制数. 值得注意的是, 数可以是正的, 也可以是负的, 或者是整数, 或者是浮点数, 是浮点数时情况较为复杂. 2 ]9 v" \+ v) e, S. m; b" Z
> convert(2002,binary);   9 f5 ]: t- z: y5 I! f2 v" r

# `& c; Z( V6 X0 j0 X# D> convert(-1999,binary); ! a5 x0 z! J6 D7 T4 r$ F9 g; L
) {. ]. n/ |6 V0 ^. x! J# ]
> convert(1999.7,binary); - W1 b: U- i4 `2 R

" l) X+ G2 A% {6 L/ y- W; i3)转换为十进制形式* ~- T: ]9 s0 [! D, [* v# L/ u
其它数值转换为十进制的命令格式为:   4 |4 M% V5 x5 _0 j
convert(n, decimal, binary);   #将一个2进制数n转换为10进制数% E1 D1 E  ~+ S3 ]) B" r3 K
    convert(n, decimal, octal);    #将一个8进制数n转换为10进制数3 S$ {8 a% Q: q" d; ~
    convert(string, decimal, hex);  #将一个16进制字符串string转换为10进制数
" W2 u2 i) K* M% |& o. _> convert(11111010010, decimal, binary);    2 q8 O6 o+ d$ f0 P: t: d( |

6 s* F2 m) U5 w  P: H5 a( s( ?> convert(-1234, decimal, octal);           
+ m/ `  n1 \9 i: k. C0 n6 ~$ i1 }- i
) p2 D% T8 `: \2 g# {2 Z> convert("2A.C", decimal, hex);         
/ q, ^% R2 n3 @. k( p+ Q) ^! l 8 Z) _9 a! u" D! E$ D3 ~$ V
4) 转换为16进制数
: Q0 V) }% X1 a将自然数n转换为16进制数的命令格式为: convert(n, hex);   / \5 z4 b- Z$ Y' ~9 t
> convert(2002,hex);  convert(1999,hex);
. C0 X' k4 {% ~: V; v # x( g- @) x0 }6 P

& p$ L. I( c9 g+ A6 [1 V5)转换为浮点数( ~, Y8 S/ Q- g& C- B1 l3 r
命令格式: convert(expr, float);
7 i9 \* t0 x! F' l/ N0 h6 [注意, convert/float命令将任意表达式转换为精度为全局变量Digits的浮点数, 且仅是对evalf的调用.   J; V9 G1 E, `8 V- W0 r7 n
> convert(1999/2002,float);
2 i3 O' {: w. F6 r3 t. J: t) i' l
- R2 r! I- y( P4 T> convert(Pi,float);
9 d! E' L5 V1 v8 I  u( w% [% Y( j ) ]  _: _5 k( p6 J9 |  Z
2.2 初等数学' n# G& G, g% s1 O' H0 x
    初等数学是数学的基础之一, 也是数学中最有魅力的一部分内容. 通过下面的内容我们可以领略Maple对初等数学的驾驭能力, 也可以通过这些实验对Maple产生一些感性认识.
: s9 n; S) _% U. J0 a# [2.2.1 常用函数6 a; Y$ [% R+ X6 z1 z; u0 ^* f
作为一个数学工具, 基本的数学函数是必不可少的, Maple中的数学函数很多, 现例举一二如下:   0 O2 m$ o- @7 M7 [
指数函数: exp
5 L6 [2 u. J; Q一般对数: log[a]
, [$ g8 ?. n* _& O% \) i* {+ @( S自然函数: ln& m" g/ a* z$ u* b; P8 C0 \& ^
常用对数: log10
- M# c8 `5 e! k平方根: sqrt" ]% n0 R' E# c! f( Z6 ^
绝对值: abs
. `2 q4 v; W- j7 z三角函数: sin、cos、tan、sec、csc、cot6 @6 i) |% E0 \& J
反三角函数: arcsin、arccos、arctan、arcsec、arccsc、arccot
0 U: r/ |! s$ j# k; c( N双曲函数: sinh、cosh、tanh、sech、csch、coth% y7 G" |1 X* P$ G: A1 [
反双曲函数: arcsinh、arccosh、arctanh、arcsech、arccsch、arccoth
7 ~0 O+ R: s/ e/ a- T9 M贝赛尔函数: BesselI、BesselJ、BesselK、BesselY" Z( v  p9 l8 o3 m
Gamma函数: GAMMA
9 r& o1 m6 H6 B. R. F; l误差函数: erf
  ~9 ^& N6 \+ @7 |4 `函数是数学研究与应用的基础之一, 现通过一些实验说明Maple中的函数的用法及功能. 8 b) ]$ d9 f+ a$ G
1) 确定乘积和不确定乘积
, I8 D$ [4 e: d/ u命令格式: product(f,k);  5 S& F% ~9 n  v. {  B
product(f,k=m..n);  
2 j* L2 _' D% lproduct(f,k=alpha); : ]- B3 l3 I% |/ E& F
product(f,k=expr);
( N! o5 {, O, ?7 J. x; ~其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—包含k的任意表达式.
+ ]. X, A: a7 B  I4 p: b> product(k^2,k=1..10);   #计算 关于1..10的连乘* b, Q7 d; _- K6 V* k3 J& f. G
. ~; v) W: ]! G$ k# R) G
> product(k^2,k);         #计算 的不确定乘积' k" f2 n* a  H9 P& B1 `4 ^

% I# N5 }/ E. ]. q> product(a[k],k=0..5);    #计算ai(i=0..5)的连乘3 w: ~! t! `* }1 l) o
8 M5 Q6 C# Y; D' ^
> product(a[k],k=0..n);    #计算ai(i=0..n)的连乘
" D& Y9 A- N) l' c6 [: d ( ^- G/ @+ f: @+ _$ ~
> Product(n+k,k=0..m)=product(n+k,k=0..m);   #计算(n+k)的连乘, 并写出其惰性表达式2 {8 v3 ~, y1 J8 E
, y! i4 L" G6 g+ {
> product(k,k=RootOf(x^3-2));     #计算 的三个根的乘积1 f5 p" X0 a8 Q) e, Q

4 M7 N4 l7 G0 K" K    product命令计算符号乘积, 常常用来计算一个公式的确实或不确实的乘积. 如果这个公式不能求值计算, Maple返回 函数. 典型的例子是:   : v" v0 S3 m, s: T2 K& e3 i
> product(x+k,k=0..n-1);* T' O  y0 X" @9 K3 i

( P; T5 b, o8 [7 j; p如果求一个有限序列值的乘积而不是计算一个公式, 则用mul命令. 如:   
; y  ^" d, K# o9 L2 h- |: v, q/ I> mul(x+k,k=0..3);
& Z/ X) Y$ [7 ~1 r
4 g7 G9 a6 @, J+ O2)指数函数) M3 U6 W& U1 v' S- i9 ^& m- Z4 B
计算指数函数exp关于x的表达式的命令格式为: exp(x); 0 e: g* P2 i: Z2 }: ~. d
> exp(1);. w$ b* B( |, P# M5 y5 y4 w  z+ ?+ B

! ?  C( M  [" A) @8 H6 k1 N> evalf(%);% S& \" x+ O5 r5 Y7 |6 |* c
; {* l: e* Q+ T+ n9 ~( w9 d
> exp(1.29+2*I);
2 I2 r/ a" t8 p9 W 6 Z: M& F* K" i2 B5 y
> evalc(exp(x+I*y));2 N; r. S5 O5 R" U& @/ D  ]

4 d+ a! r: L7 y3 a& r& z/ a. Z$ g+ {3)确定求和与不确定求和sum, H/ O* F0 W0 p) `" T  f
命令格式: sum(f,k);    A- ?1 K$ J; |' k
sum(f,k=m..n);  
7 F2 Y; w* T4 E- E  p% L  jsum(f,k=alpha);
2 g$ w! g4 n, s% a; tsum(f,k=expr);
" u8 Z/ N+ d. Y1 w; H" r0 t: x其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—不含k的表达式. , e% N4 Q8 O2 q$ f
> Sum(k^2,k=1..n)=sum(k^2,k=1..n);( G; _1 L' {; r" A! b  q

9 H0 H8 r* D# O. [2 Q> Sum(k^3,k=1..n)=sum(k^3,k=1..n);
- t3 G" i2 o; j. }- I6 W, E* H- K ) F3 e& B. S5 H* {' u. O# J
> Sum(k^4,k=1..n)=sum(k^4,k=1..n);6 B1 G2 o2 Z3 |$ l3 L+ Z
( m* D. }  |1 K9 r( k! \8 n" F
> Sum(1/k!,k=0..infinity)=sum(1/k!,k=0..infinity);8 {9 ^- c9 ?: }, s1 y
; E! z" G% X  [  I- w- K
> sum(a[k]*x[k],k=0..n);
6 l" a: z5 b7 L$ U
9 |1 d( b& v$ O5 K( q2 T2 c> Sum(k/(k+1),k)=sum(k/(k+1),k);. v  k+ W0 t3 c  x. G

) y. e! K1 }2 K' ]. @: a! X9 A> sum(k/(k+1),k=RootOf(x^2-3));
% C, c' `, D3 T$ Z9 \( [  {+ M
) t2 `( ~. [" F& Q, V% X% i/ asum函数可计算一个公式的确定和与不确定和, 如果Maple无法计算封闭形式, 则返回未求值的结果. 值得注意的是, 在sum命令中将f和k用单引号括起来, 可避免过早求值. 这一点在某些情况下是必需的. , e2 l# p; V! y. R
> Sum('k','k'=0..n)=sum('k','k'=0..n);
5 }9 {" B( F* d$ D
+ [4 |$ [1 z$ ~6 I1 `如果计算一个有限序列的值, 而不是计算一个公式, 可用add命令. 如:   3 w) ?& B+ \$ L7 A' O( S' R
> add(k,k=1..100);
3 u) O' f# s% y8 h, k0 J8 H ; R7 s# m: M! w- B
尽管sum命令常常用于计算显式求和, 但在程序设计中计算一个显式和应该使用add命令.
( s+ V0 W" }: G7 g9 w( z% S另外, sum知道各种求和方法, 并会对各类发散的求和给出正确的结果, 如果要将求和限制为收敛求和, 就必须检查显式的收敛性. 6 I* Z- s0 `$ J! B/ H6 q+ M8 @
3)三角函数/双曲函数7 I6 t* `9 T3 V1 T$ @5 Q/ Q
命令格式:   sin(x);   cos(x);   tan(x);   cot(x);   sec(x);   csc(x);% u0 V1 b% _6 R! J! |6 D" x' N
          sinh(x);  cosh(x);  tanh(x);  coth(x);  sech(x);  csch(x);# O5 g; E% |, d' Y( l  U- x
其中, x为任意表达式. . d- d* K& J- l8 b4 u
值得注意的是三角函数/双曲函数的参数以弧度为单位. Maple提供了利用常见三角函数/双曲函数恒等式进行化简和展开的程序, 也有将其转化为其它函数的命令convert.
& L5 W& w4 }2 ]0 |# G# [0 O3 g> Sin(Pi)=sin(Pi);) N* e" m: @, l, X/ j
9 v* V1 m, ?! d4 h) H7 I1 ~
> coth(1.9+2.1*I);
$ O0 t; u; [* V9 t/ f
+ U  ~3 s# D& o9 g( b- F$ T! n3 u> expand(sin(x+y));     #展开表达式" d/ Y5 N% @0 Y/ v1 R* G+ f

4 Z& o6 y/ I+ D4 D  t" B( N, D: t> combine(%);        #合并表达式5 v% ?/ J3 @% V% q0 R& \
6 O: x; `6 \8 j, D% K4 M, U  P+ [
> convert(sin(7*Pi/60),'radical');
3 Q1 [2 r6 h) l) Y8 E0 `3 {
" Q. r, @- a1 ?5 p3 r* E> evalf(%);' c# C- c0 P2 I8 l; @% ~" ^) J

) Y9 O& Z* `& _4 ^8 `  e但有趣的是, combine只对sin, cos有效, 对tan, cot竟无能为力.
$ @, u; ~6 C1 k# m1 ?4)反三角函数/反双曲函数
1 W; X0 V% @$ _! U) W8 b命令格式: arcsin(x);   arccos(x);   arctan(x);   arccot(x);   arcsec(x);   arccsc(x);
' W- u; k4 M1 Q     arcsinh(x);  arccosh(x);  arctanh(x);  arccoth(x);  arcsech(x);  arccsch(x);   1 b" p. w; ]/ ]2 \+ U
arctan(y,x);
/ w: y) b0 j; d$ r3 ]其中, x, y为表达式. 反三角函数/反双曲函数的参数必须按弧度计算.
6 I  ?3 @3 \6 b" i; g  S算子记法可用于对于反三角函数和反双曲函数. 例如, sin@@(-1)求值为arcsin.
$ H: P# o/ a( H$ e  f# |) g- Y> arcsinh(1);
% j+ A  ^- f. j6 T1 G6 ?4 j0 ?# \ / L: g; z: X" E* z
> cos(arcsin(x));6 e3 ?( O* D+ H8 r% b* ~

. I% L' ~# N1 n( O2 Z, Y> arcsin(1.9+2.1*I);1 i8 n6 _9 t) J1 K; O

; x/ E4 U+ T: }9 z7 Z& C: C* n5)对数函数( g9 L; g5 K  G6 f, ~) E
命令格式: ln(x);           #自然对数
2 @, B7 a, u! R+ E/ Tlog[a](x);        #一般对数- O! Q8 s; M- _9 W& [
log10(x);        #常用对数
5 N. q' Y  ~9 v+ Z$ Z2 ~一般地, 在ln(x)中要求x>0. 但对于复数型表达式x, 有:   . j8 {' m9 g) \& g5 B+ I
  (其中,  )
& t6 K1 L4 n! C> ln(2002.0);
1 K! I! f4 I: ~9 c$ m- Q+ L# l
: o! m0 l9 _6 b> ln(3+4*I);0 `" Y5 a8 ~$ F" R) r+ l2 J% e

3 a$ d; R6 m( v4 A> evalc(%);    # 求出上式的实部、虚部
: \6 W+ c9 H+ e# O2 j+ h6 E) {
: z0 b6 C1 W3 j- E6 z> log10(1000000);
& n! @# u: T, @' h* Y( K2 V
  H+ `. X" f3 ?, U7 q> simplify(%);   #化简上式* f( ?" T% j5 L! ]* S8 J

( e# Q/ n/ w4 Z0 a2.2.2 函数的定义
$ r, _4 t/ c7 b% L& `7 U3 lMaple是一个计算机代数系统, 带未知或者已知字母变量的表达式是它的基本数据形式. 一个简单的问题是, 既然表达式中可以包含未知变量, 那么它是不是函数呢?试看下面一个例子:   # E5 ?) z6 e: z% ]1 P5 E# M
> f(x):=a*x^2+b*x+c;% V4 N8 v: ~" `

9 d! v1 v7 e, r& O: f: |可以看出, Maple接受了这样的赋值语句, 但f(x)是不是一个函数呢?要回答这个问题,一个简单的方法是求函数值:   ( l# \3 v! F; Q
> f(x),f(0),f(1/a);9 C6 R" ]# D0 _7 n' y. M$ N/ e
: j% r" n3 \; a6 \5 ]
由上述结果可以看出, 用赋值方法定义的f(x)是一个表达式而不是一个函数, 因为f(x)不能把所定义的“自变量”或者“参数”转换成别的变量或表达式. 但从赋值“过程”可以看出, f(x)虽然也算是一个“函数”, 但却是一个没有具体定义的函数:   ! J5 p1 w8 O: y2 h
> print(f);% W) U7 v& k8 H! h5 x1 R! n% G7 y
9 d0 f7 Y# l& S8 a
事实上, 我们所做的赋值运算, 只不过是在函数f的记忆表(remember table)中加入了f(x)在x上的值, 当我们把自变量换作0或1/a时, f(x)的记忆表中没有对应的表项, 所以输出结果就是抽象的表达式. ! E  A/ |5 ]; P' R& Z' J& l
在Maple中, 要真正完成一个函数的定义, 需要用算子(也称箭头操作符):   9 B$ a/ \5 O/ ~$ u
> f:=x->a*x^2+b*x+c;
9 U6 j- H) k: `9 z 1 p5 X9 l+ X4 C" R; p- B
> f(x),f(0),f(1/a);
" `# n8 p: Y; F# X  n
! R' ?" M; U- e' q多变量的函数也可以用同样的方法予以定义, 只不过要把所有的自变量定成一个序列, 并用一个括号“()”将它们括起来(这个括号是必须的, 因为括号运算优先于分隔符“,”). " x( P; G7 z: c( z
> f:=(x,y)->x^2+y^2;
& j4 N5 L) k/ L% Y1 |  p& H" F
9 k5 S* s5 ~- s' o2 }2 n- V9 s> f(1,2);: y% j2 X# g6 s- ]( V4 i
7 o4 ]) l* j$ \
> f:=(x,y)->a*x*y*exp(x^2+y^2);
( D3 W3 O4 M+ P( B% M2 b' a6 z# p" h
( i) [+ ~5 O) U' U综上所述, 箭头操作符定义函数的方式一般为:   + w4 N: i6 D0 c- f% ~
一元函数: 参数->函数表达式: t' S! G3 Y6 N, C' Q5 H
多多函数: (参数序列)->函数表达式
/ _4 X' N$ X% V5 C$ r无参数函数也许不好理解, 但可以用来定义常函数:   
: ^+ H, t4 H8 x( l> E:=()->exp(1);. F3 g( E/ A/ r% S: O+ W

' K4 S8 ?& I% }! ^> E();" y7 B6 o/ U/ [& _3 ]6 P

4 M3 d' o9 Y6 z2 A- |> E(x);
1 M* k! S. W1 y
8 X# F7 G0 H) S6 L! o# b另一个定义函数的命令是unapply,其作用是从一个表达式建立一个算子或函数. 7 V# G1 d5 T/ t( e, a4 {. U
定义一个表达式为expr的关于x的函数f的命令格式为:  f:=unapply(expr, x);          5 H4 h0 _4 u% U, S3 x4 O: W$ J
定义一个表达式为expr的关于x,y,…的多元函数f的命令格式为:  f:=unapply(expr, x, y, …);       f! N! w. w* ]4 q4 [7 n
> f:=unapply(x^4+x^3+x^2+x+1,x);8 j4 q  i# w) z" o; G+ t
/ j  O$ S! E# j' v& _. M6 M) I
> f(4);
: ^+ p6 p0 P8 x 1 Q* N; L7 J0 N+ B
> f:=unapply(x*y/(x^2+y^2),x,y);
; @% b& j2 M: t5 F* h7 O+ v. G / x9 p6 F4 E0 n: C! b1 t6 R0 s; V
> f(1,1);+ w6 e' j" E% p+ ^+ J
8 a+ @6 L7 o3 U* _2 q
借助函数piecewise可以生成简单分段函数:
- O; P, d7 Q! H# u5 M$ s" Z$ e> abs(x)=piecewise(x>0,x,x=0,0,x<0,-x);; x7 P* d( o& L' P$ d6 b# s( Y! U
( y; F2 V* D+ H8 b2 L3 R" Z
清除函数的定义用命令unassign.
, T4 G# v' \# }! C, ~) p> unassign(f);! k' U4 g+ g& p- W( c1 |0 v! r, p
> f(1,1);
4 f! I# n" A& e6 p  r6 B ' H9 O- z$ f4 C; V- i4 K
除此之外, 还可以通过程序设计方式定义函数(参见第6章).
8 Q+ Z" H; H& [: J, E定义了一个函数后, 就可以使用op或nops指令查看有关函数中操作数的信息. nops(expr)返回操作数的个数, 函数op的主要功能是获取表达式的操作数,其命令格式为:
, H) m; ~( I5 d, Dop(expr);         
0 u% J6 R& c, c/ J  ^! @op(i, expr);         3 D  O6 w3 P) I% Q! w
op(i .. j, expr);      
% j- j& `' a9 K& }nops(expr);
% \  N4 Q3 D; o- l7 F如果函数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的类型. 0 ?, x. }+ q& D/ e4 [% l- J
命令op(i .. j, expr); 执行的结果是expr的第i到第j个操作数, i..j中含负整数时的情形同上.- D6 x/ V  b5 c1 p& [3 i
命令op(expr); 等价于op(1..nops(expr), expr); 8 |' ]5 r5 h! b' z" o6 [% B- j9 _
特别地, 当op函数中i为列表[a1, a2, ..., an], 则op([a1, a2, ..., an], expr); 等价于op(an, op(..., op(a2, op(a1, e))...));
# J; w# k# n, A而当expr为一般表达式时,nops(expr)命令返回的是表达式的项数, 当expr是级数时返回级数每一项的系数和指数的总和.
6 v. @/ c9 w! [2 q> expr:=6+cos(x)+sin(x)*cos(x)^2;. O9 X/ s2 J9 r$ p0 n* G5 @5 ~+ a

* `; Z7 D4 O: v& p> op(expr);
& Q2 Q  D) n: n+ l. C 6 C0 a$ W. C& h7 N, [
> nops(expr);! Q# |) I) P/ n0 ^: E
$ D2 ~" A2 i( P( X
> p:=x^2*y+3*x^3*z+2;  w0 m: H) n: e3 `$ I. J# J
1 f7 S% g8 z* I
> op(1,p);
( d# [; W9 }' i: \( a' T9 N: B$ F$ ~
# x" w+ c& _" n8 q/ B> op(1..nops(p),p);: m9 [0 w( f% j

9 A2 C+ \8 _" k: P, {7 e; V> op(op(2,p));
( ^) S3 W) F1 @- K# O7 k- p
6 f$ _0 T. M6 w> u:=[1,4,9];
( N6 D/ [& Y; k5 }
) S' E6 D! P! I8 x) Z> op(0,u);- m* U  ]2 `$ R3 k, D- b+ @

- p* W0 E, a. N> s:=series(sin(x),x=1,3);
; r1 ~, z) w( w3 F0 i. F/ n0 A 6 }4 G: i, U  F0 A
> op(0,s);0 F* F7 ?1 B4 ]! `; [
       
% V6 Y( U9 b: V' V> nops(s);2 w  F" N* n* {
. M! R. u1 T7 {
下面一个有趣的例子说明了Maple在处理算术运算时的“个性”:
5 J7 V8 l7 l8 ]9 o' [9 F, ~> op(x*y*z);3 u' d1 Y" w% z! T9 c+ n2 i  l& z

( L* ~. A) H$ e* R+ c> op(x*y*z+1);' J) Y) Z. r' g4 S. o" P) a
6 f5 I) i' R# Z
2.2.3 Maple中的常量与变量名
1 s+ S' A9 `3 ^) g8 `为了解决数学问题, 一些常用的数学常数是必要的. Maple系统中已经存储了一些数学常数在表达式序列constants中:   1 d) z% Z* @& t( ~; g1 s/ T
> constants;/ ?/ o: X- K2 U
8 |0 {% Z- D: l# Z4 l8 j
为了方便使用, 现将上述常数的具体含义列示如下:   8 \' p/ t" f& ]% w" I' C5 l
常    数        名 称        近似值
: ?0 I. h; {+ _" q1 w0 I圆周率 0 o+ t: v7 ?. |1 }3 r* ^: J  s9 R7 j
Pi        3.1415926535: W5 L  y) |) A- |  w1 L- E+ @
Catalan常数   A  V4 P/ t2 X( n
Catalan        0.9159655942! ^. W9 p3 b8 P/ c* l/ F6 Z
Euler-Mascheroni常数 : ?: }# \- j! F
gamma        0.5772156649
* ~# U- r, d9 T  `, b( S " J8 U8 m& _- g: {8 J: {
infinity       
6 c1 G5 f: U0 W, d5 I- x9 o% Y) w! G
需要注意的是, 自然对数的底数e未作为一个常数出现, 但这个常数是存在的, 可以通过exp(1)来获取.
2 F6 j$ o4 _# H0 l3 p( P在Maple中, 最简单的变量名是字符串, 变量名是由字母、数码或下划线组成的序列, 其中第一个字符必须是字母或是下划线. 名字的长度限制是499个字符. 在定义变量名时常用连接符“.”将两个字符串连接成一个名. 主要有三种形式: “名.自然数”、“名.字符串”、“名.表达式”.
; a: R2 W' b3 ]  z3 S* |7 p值得注意的是, 在Maple中是区分字母大小写的. 在使用变量、常量和函数时应记住这一点. 数学常量 用Pi表示, 而pi则仅为符号 无任何意义. 如g, G, new_term, New_Team, x13a, x13A都是不同的变量名. 4 f9 B/ N6 q9 x/ q: Q
在Maple中有一些保留字不可以被用作变量名:   + J; I4 G7 M( M1 g& D- n
by      do      done     elif     else     end        fi        for      
+ @8 F) i3 O; F5 D. R$ p+ n0 Cfrom    if       in       local     od     option    options     proc         
) S; g! f: _4 Hquit    read     save     stop     then     to        while      D5 @8 S4 a9 Q) `5 X! x
Maple中的内部函数如sin, cos, exp, sqrt, ……等也不可以作变量名.
$ X- }8 o& V* I6 q4 j8 H, |另外一个值得注意的是在Maple中三种类型引号的不同作用:   8 p. ?3 c: t7 H! ], \
`  `:   界定一个包含特殊字符的符号, 是为了输入特殊字符串用的;   
+ M$ }2 x' P) s. q# F'  ':   界定一个暂时不求值的表达式;   
4 B1 ]* e+ b2 M"  ":   界定一个字符串, 它不能被赋值. 4 t, k/ y4 E* y) u/ ?  x2 ^6 U
2.2.4 函数类型转换           
: h7 f8 Y3 I! V. B, O3 Y3 t: ?函数类型转换是数学应用中一个重要问题, 譬如, 将三角函数转换成指数函数, 双曲函数转换成指数函数, 等等. 在Maple中, 实现函数类型转换的命令是convert. 命令格式:  / ~8 m# @8 n+ R5 N
    convert(expr, form);        #把数学式expr转换成form的形式
" J% a1 R$ H4 ]" {9 K! f# Rconvert(expr, form, x);      #指定变量x, 此时form只适于exp、sin、cos5 m  a, L! l$ ]9 p# }0 }! ]
convert指令所提供的三角函数、指数与函数的转换共有exp等7种:   
6 i( u' @3 [; Z' R" F(1) exp: 将三角函数转换成指数
( v% C" i: e( P, _, l* d: V(2) expln: 把数学式转换成指数与对数
( i; T" z. c- i/ W(3) expsincos: 分别把三角函数与双曲函数转换成sin、cos与指数的形式& B6 z$ ^% J/ V* P. |# ^& j% S
(4) ln: 将反三角函数转换成对数& ~3 p$ B# Q# ~* [' ~8 G$ [9 q, p
(5) sincos: 将三角函数转换成sin与cos的形式, 而把双曲函数转换成sinh与cosh的形式5 l: r" Z. V: \: L( g* \6 o
(6) tan: 将三角函数转换成tan的形式
  d/ D& r' s1 m: u8 w(7) trig: 将指数函数转换成三角函数与对数函数
8 {2 I7 X; y& o) ?4 N8 }> convert(sinh(x),exp);   #将sinh(x)转换成exp类型% E; M5 t2 K. A% e
+ w5 G+ y$ _" B& Y
> convert(cos(x)*sinh(y),exp);
! ^0 K0 m2 ?. B4 o$ c. K* i" g
* q9 c6 X0 E" B, w' {> convert(cos(x)*sinh(y),exp,y);% [9 d5 M# w) Y, V6 ~% m
+ R% l$ d& g* Q, {0 y: |
> convert(exp(x)*exp(x^(-2)),trig);' X, a: l  N% z3 c
" {. W) N* J4 b# T, A' r: u+ N# E
> convert(arcsinh(x)*cos(x),expln);
4 ~2 G+ Q# H; u; l0 p% Z ; s: ]0 ~9 [4 f3 x6 P$ m" ^* r
> convert(cot(x)+sinh(x),expsincos);, T1 q; M) E: m4 ?. H! E9 L4 O

& S, }+ J  O7 r' B% F# I> convert(arctanh(x),ln);
( ~( v" W! Z) S - {1 G9 x& ]# s
convert在有理式的转换中也起着重要的作用. 在有关多项式运算的过程中, 利用秦九韶算法可以减少多项式求值的计算量. 在Maple中, 可以用函数convert将多项式转换为这种形式, 而cost则可以获取求值所需的计算量. 注意: cost命令是一个库函数, 第一次调用时需要使用with(codegen)加载. 例举如下:   $ Q4 r( @- G# C# w' F0 Z
> with(codegen):2 \5 r( y( P6 E, S) `' v. M+ t* g
> p:=4*x^4+3*x^3+2*x^2-x;
, d! \" E( @9 p7 g ' }; L3 T$ w" a& |  s# L
> cost(p);
1 ^3 d) l2 t* }  I. q * f, `% |6 w! i4 P  ?- z9 P: R6 ^; V
> convert(p,'horner');  #将展开的表达式转换成嵌套形式. r# j2 {; q9 i3 h! x/ j+ u: ]
' K. D7 A) M( r$ H+ B
> cost(%);
& }5 D* i- A, q' W
4 u7 a5 g1 O8 ^/ y! z! A同样, 把分式化成连分式(continued fraction)形式也可以降低求值所需的计算量.
& Z) }" }- o/ x% _! Z1 A. W1 k> (1+x+x^2+x^3)/p;3 I' u4 o9 Y2 o" {( u
8 z* F6 O6 H, t/ ^
> cost(%);
% t' G! n" v3 j# ~# ^3 |) L
% Z& f3 {. w8 G  d> convert(%%,'confrac',x);/ k' o% s# g7 e& B7 O
1 i# [7 _& ?" Y* d9 A
> cost(%);- ]) |. I) X$ h6 ^& G9 _3 T/ l

6 i" ]9 F! n, I" M1 _$ x在某些场合下(比如求微分、积分时), 把分式化成部分分式(partial fraction)也就是几个最简分式的和式的形式也可以简化运算, 但简化程度不及连分数形式. * ]8 K) S; I- G! ~6 T: Q! F: W
> convert(%%, 'parfrac',x);
% }' A( e4 O* y& w3 v
9 `1 S0 w/ O9 |> cost(%);7 r' D2 ?2 P! O
/ p: t' K$ u3 f0 C* C
而把分数转换成连分数的方法为:. {0 _! @  g: R" G; N* k
> with(numtheory):
; d" ]+ v4 t' D! z* J4 f> cfrac(339/284);; U, c: R* Y, C* ~4 o
& n, o7 j* _/ }1 A+ o
2.2.5 函数的映射—map指令: R1 D3 h% O2 {- ^; T( h
在符号运算的世界里, 映射指令map可以说是相当重要的一个指令, 它可以把函数或指令映射到这些结构里的元素, 而不破坏整个结构的完整性. 命令格式为:
7 A. B  x# l7 ]" K! Wmap(f, expr);      #将函数f映射到expr的每个操作数
$ J# w7 B6 [- ^$ M1 p+ {" P9 Tmap(f, expr, a);    #将函数f映射到expr的每个操作数, 并取出a为f的第2个自变量
2 o: k* f7 }# I( {map(f, expr, a1, a2,…, an); #将函数f映射到expr的每个操作数, 并取a1~an为f的第2~n+1个自变量/ E4 s4 [) A, Y; ~8 e
map2(f, a1, expr, a2, …, an);    #以a1为第1个自变量, expr的操作数为第2个自变量, a2为5 ?$ v; n$ [' K- O2 S0 o. d& O5 k
第3个自变量…, an为第n+1个自变量来映射函数f
- [6 L7 t/ L& M. A> map(f,x1+x2+x3+x4,a1,a2,a3,a4);5 @, _6 `/ \# y# m. O' y3 S
$ x5 [" o* N4 p  T, v% d! y
> f:=x->sqrt(x)+x^2;" `8 ]2 [* m% `5 I
' f4 v. l, i. L; O3 C$ ]
> map(f,[a,b,c]);
& N9 V. _0 F2 R" x6 o* e& p& f - ^; B* [; Q- N$ i$ y
> map(h, [a,b,c],x,y);
1 U7 D& [$ G3 U9 s9 ? 8 M' R! J! z4 Z* r: P7 b( n- j  `
> map(convert,[arcsinh(x/2),arccosh(x/2)],ln);6 o9 l- `5 z# v: |" k
, F0 T; S5 v; e9 J+ k5 V% }  m/ U
> map(x->convert(x,exp),[sin(x),cos(x)]);
( |) |1 ~7 ]" W, s " q) X$ b2 [5 `" ?6 f
上式的映射关系可通过下式理解:6 `4 @" ^2 D+ h: @
> [convert(sin(x),exp),convert(cos(x),exp)];
2 T% K0 g; S0 v , l. F9 C7 l( l' o  K( B# y
> restart: 0 Q$ o) T" u+ Q( c! o; U/ F  o
map2(f,a1,x1+x2+x3+x4,a2,a3,a4);* K1 H  Q+ G; D7 A  B6 P* z* W+ ?$ Y

5 n( W5 ]% u% u; N& J> map2(max,k,[a,b,c,d]); ( l5 P- e. b2 S2 ?2 ^
( L6 S0 M2 T8 [4 d2 f
再看下面示例:   
9 K5 F2 s& z  s4 v> L:=[seq(i,i=1..10)];
6 k: }1 b. v) g8 V ; C/ K1 j  j0 K
> nops(L);; B* C5 G' G0 `

- S+ f) m( v! s) I0 L6 M> sqr:=(x)->x^2;6 u. o2 [+ G( ]9 L9 Y# X
% w% u, j- H7 M- H1 i
> map(sqr,L);
; n4 J0 o! T  d" Q
5 m; s& U- W$ e" y/ E7 M. F% F+ i, b6 k> map((x)->x+1,L);
1 t' P5 E3 N- S. m
" e' q% [# p  F1 \  ]3 X# e0 L( `> map(f,L);6 m1 E/ u; {: R
: s; t! {+ p2 o% N0 o% z1 E) V
> map(f,{a,b,c});
" k7 E: l3 E+ z5 r 8 b: i. a4 p1 z5 x% a4 K; Y. N; a* D' i
> map(sqr,x+y*z);
9 ?% u6 a$ t# N. o " C4 t% w6 Y8 p! p
> M:=linalg[matrix](3,3,(i,j)->i+j);
% X/ E. X% N# u9 K/ z# q, A
+ ]$ B) K; U' m0 w3 b> map((x)->1/x,M);
  h/ V8 d( J7 A ! e. n+ [0 o7 L4 H$ Q
3 求 值9 J% l$ j# ]6 d- j
3.1 赋值
$ h; f. C9 r" D9 ^; L在Maple中, 不需要申明变量的类型, 甚至在使用变量前不需要将它赋值, 这是Maple与其它高级程序设计语言不同的一点, 也正是Maple符号演算的魅力所在, 这个特性是由Maple与众不同的赋值方法决定的. 为了理解其赋值机制, 先看下面的例子.
( Q  u. J2 C6 v: r$ s* T> p:=9*x^3-37*x^2+47*x-19;
. o7 [& e) h) ~: T# M 3 a' b) ~$ ]  w
> roots(p);
5 @7 {  Q0 ~5 `9 l . |- u; _5 g- {0 P8 q6 ~
> subs(x=19/9,p);: h& s3 T3 F' q

0 I# f4 l$ ^- P在这个例子中, 第一条语句是一个赋值语句, 它的作用是把变量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;”这样的简单语句即可验证.
. q/ T1 o  e* Y/ N: |: N$ ]3.2 变量代换& z* [4 J4 i/ N  |
在表达式化简中, 变量代换是一个得力工具. 我们可以利用函数subs根据自己的意愿进行变量代换, 最简单的调用这个函数的形式是这样的:   
0 f$ S: M: B7 O5 \7 [) b* w0 Fsubs ( var = repacedment, expression);
3 c" t) z* J3 U# ^调用的结果是将表达式expression中所有变量var出现的地方替换成 replacement.
  s- `1 C8 W% k( U> f:=x^2+exp(x^3)-8;
& h0 F$ `: k2 q: }* ~( n & @# K4 n3 g$ {
> subs(x=1,f);' I( v6 d3 {# ^. V

2 }" C5 n; n0 i9 G3 d> subs(x=0,cos(x)*(sin(x)+x^2+5));
, i  P( T( H8 x/ F. ?2 |
' ], T6 \# M4 D& v$ j    由此可见, 变量替换只得到替换后的结果, 而不改变表达式的内容, 而且Maple只对替换的结果进行化简而不求值计算, 如果需要计算, 必须调用求值函数evalf. 如:   
9 ?2 R) [. z0 ]( ^8 q) m, W+ [> evalf(%);
0 z. u+ V9 d( k' v, Z# p  [' D , o- a; s: @/ D# `0 d) E
变量替换函数subs也可以进行多重的变量替换, 以两重代换为例:   + d4 u; p2 P( [4 l2 g* l% a: T' }
subs (var1 = repacedment1, var2 = repacedment2, expression)
% ?& ^7 Y6 I( A: D$ @. I3 ~调用的结果和按从左到右的顺序连续两次调用是一样的, 也就是先将expression中的var1替换成replacement1, 再将其结果中的var2替换成replacement2, 把这种替换称作顺序替换;    与此相对, 还可以进行同步替换, 即同时将expression中的var1替换成replacement1, 而var2替换成replacement2. 同步替换的调用形式为:   9 N0 L8 t* V" Z: @, b( }+ {4 j
subs ( {var1 = repacedment1, var2 = repacedment2 }, expression)
1 @: H% t' C, l- h1 @; ?下面通过例子说明这几种形式的替换. ! q5 R0 a' V& _
> subs(x=y,y=z,x^2*y);              (顺序替换)- f+ ^/ _8 o8 g8 p3 O5 k9 X
3 k0 w$ j( g  G
> subs({x=y,y=z},x^2*y);            (同步替换)
! M8 I1 x7 D+ V9 R0 X3 D
8 N% k5 {2 J5 r> subs((a=b,b=c,c=a),a+2*b+3*c);   (顺序替换), |( ~/ X, L) p! J$ C
( a* x( I6 `6 @0 v( P
> subs({a=b,b=c,c=a},a+2*b+3*c);    (轮  换)2 N$ W# j1 ]/ s
" {) O6 v  H+ ^% A3 t) L
> subs({p=q,q=p},f(p,q));             (互  换)! s+ V+ M( Y* T4 N

$ p0 `: N4 Z# l3.3 假设机制4 l8 l7 M% o. V
Maple是一种计算机代数语言, 显然, 很多人会尝试用Maple(或其他计算机代数语言)解决分析问题. 但由于分析问题与处理问题的考虑方法不同, 使得问题的解决存在某些困难. 例如考虑方程 的解. 如果k是实数, 结果显然是x=1, 但如果k是 的复根, 为了保证解x=1的正确性, 必需添加附带条件: 也就是当 时x=1. 这是一个对结果进行正确分析的例子. 然而从代数的角度考虑这个问题时就会把k当作不定元, 此时k没有值, 从方程两端去除k的多项式是合法的, 只要这个多项式不是零多项式即可(这一点是可以保证的, 因为其所有系数不全为0). 在此情况下x=1就不需要任何附加条件. 计算机代数系统经常采用这种分析的观点. " b& D- z0 ~" F$ m
在Maple中, 采用分析观点解决这类带有一定附加条件的实用工具是函数assume, 其命令格式为: assume(x, prop);
9 N+ X9 z: p$ B! 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);”也不会产生矛盾. / Y1 s) s- ]5 U! a: \4 J
> Int(exp(-s*t),t=0..infinity);3 m( v0 N) m3 Z* r
. X4 u6 y5 K7 Q: U$ I9 P& g
> value(%);
% N! c* `" z' l: q. n2 |7 o1 H! VDefinite integration: Can't determine if the integral is convergent.% q9 P! G- b/ u) ^: j
Need to know the sign of --> s" a6 {9 X+ w2 H5 c' `6 H/ H9 i2 ^
Will now try indefinite integration and then take limits.; Z: v  A! Q% o8 x7 w: m; A1 v& }7 g1 x
# n% A$ H7 t! W8 D) s* W  P! k
> assume(s>0);9 ^2 a3 h8 l) q3 v
> Int(exp(-s*t),t=0..infinity);
% T2 h2 q4 s0 k1 m3 b3 V + H6 o; V5 ^) j$ p* H
> value(%);# O$ o& R: {; \/ g, O, ?
% y/ c; M+ k0 V
3.4 求值规则
1 t) Q+ B0 [8 I2 @6 s1 G' y+ U+ b! N在多数情况下, Maple的求值规则设计为做用户期望的事情, 但要做到这一点很困难,因为不同的人在相同的情形下会有不同的期望. 在大多数情况下, 全局变量被完全求值, 局部变量被一层求值. 而由符号' '界定一个暂时不求值的表达式, 单步求值仅去掉引号, 不作计算, 这也是允许取消指定名字或清除变量的原因. 如下例:   
, a6 j0 ^" K' R> x:=y;9 g/ N2 g! `) L$ o( r
  d$ T4 k5 ?4 e
> y:=z;
+ k2 P( p7 U1 Y2 `& V7 q
& F  P" l3 c6 v- N- D, Z> z:=3;4 C" j" d$ z! }. T4 H
5 b- r6 Y. U& Q: g' O8 ~
> x;& ?. J4 z3 c2 m4 v0 R

6 T6 q$ a" p4 C# C; {> y;
/ |. ~; M0 k+ v. J8 ]. r7 G
3 _+ |2 W* a. R% u> x:='x';/ K# a4 r2 r$ S9 V5 \$ M7 ?
. L/ S' ?* e% |; y* @* o% _
> x;: x0 t3 L& w# Z( k& z

0 F! q% H; v: s2 E% I  S> y;* f: S2 |: d9 W8 d* u5 f- ~

  ]( y: D9 Z1 ?1 f对于不同的问题, Maple设计了不同的求值命令. 现分述如下:   
+ s. g- P0 R' x1) 对表达式求值. Q' q) B$ h4 Y. |: V0 S* D
命令格式: eval(e, x=a);  #求表达式e在x=a处的值
; G! @5 G0 u; D% n  r. w: \             eval(e, eqns); #对方程或方程组eqns求值3 W. [2 w) ^' j
             eval(e);      #表达式e求值到上面两层" u8 m! K2 H1 i( A# S0 d
             eval(x,n);    #给出求值名称的第n层求值+ Z- J+ ?5 [% Y. o& U$ _3 o8 M
> p:=x^5+x^4+x^3+x^2+x+73;
/ O4 I* p  R% o! t* i
. Y+ w) \5 \0 T5 t> eval(p,x=7);
& u- Q8 p& g, O: ]/ b6 X8 h8 k 2 b7 a, b8 U" Y- O0 p2 _# `8 k
> P:=exp(y)+x*y+exp(x);- _1 R  c0 j! b+ L
9 z" {1 V3 o! h& J$ A
> eval(P,[x=2,y=3]);2 M* S# }" y0 i0 h8 D
1 l( e! C% v: K$ A$ ?0 d8 i& H
    当表达式在异常点处求值时, eval会给一个错误消息. 如下:   
' m& u$ z6 U6 J5 Y- h- ^/ O> eval(sin(x)/x,x=0);
8 r) x$ K* C4 M# W3 BError, numeric exception: division by zero
! }$ K+ E. \# H    下面再看使用eval进行全层求值或者对名称几层求值的示例:   
! `$ A) w% C; B> a:=b: b:=c: c:=x+1:
& ~- N, \( `7 O% w> a;              #默认的全层递归求值
# U' v$ l5 i$ l% z" I8 \1 b; h ! W5 s- ^0 I3 E3 B7 S' p% \
> eval(a);        #强制全层递归求值! }+ H% S( K9 z7 t7 H& Q- Q

" s0 {; ?2 {# U2 `/ j- ?> eval(a,1);       #对a一层求值
( y1 z4 T  d% V  C1 A
: n! W6 g8 p5 w> eval(a,2);       #对a二层求值
8 K8 ^* E0 O* j % ?+ y1 x0 W3 z9 A( \6 n$ \3 c0 z
> eval(a,3);       #对a三层求值  x% T- X& ^6 a  q$ `5 w% f! x8 K
- V- L, O3 _6 W  Q8 l3 V
> eval(a,4);       #对a四层求值! `, h$ d  L. K( w

8 b  V/ X3 Q2 e9 }$ U; U% o    2) 在代数数(或者函数)域求值
5 P3 m, y" [; ]8 S# K命令格式: evala(expr);       # 对表达式或者未求值函数求值( K: Y. \6 \8 n7 ^2 k
             evala(expr,opts);   #求值时可加选项(opts)- L2 F7 K, R+ N+ L2 A
所谓代数数(Algebraic number)就是整系数单变量多项式的根, 其范围比有理数大, 真包含于实数域, 也就是说任意实数都是整系数多项式的根(如 就不是任何整系数多项式的根). 另一方面, 代数数也不是都可以表示成为根式的, 如多项式 的根就不能表示成为根式的形式.
1 d0 l; v2 @; J7 ?" v代数数的计算, 算法复杂, 而且相当费时. 在Maple中, 代数数用函数RootOf()来表示. 如 作为一个代数数, 可以表示为:   
, T3 U- _# Y. t* l% Z> alpha:=RootOf(x^2-3,x);
+ u6 F& r6 V, R, _+ \
; ~8 |8 N1 ~+ Q9 C) j( s> simplify(alpha^2);" T* m! _$ x6 R
; k' }. r  i2 t3 f
在Maple内部, 代数数 不再表示为根式, 而在化简时, 仅仅利用到 这样的事实. 这里, Maple用到一个内部变量_Z. 再看下面一个例子,其中alias是缩写的定义函数,而参数lenstra指lenstra椭圆曲线方法:
( R/ }1 R( g# x> alias(alpha=RootOf(x^2-2)):
& [# q( C. a- ~5 R; L1 i  H3 t> evala(factor(x^2-2,alpha),lenstra);+ b  T. {3 V5 \0 l) D
/ G7 ~. p% n, |
> evala(quo(x^2-x+3,x-alpha,x,'r'));
- z) l! V! O/ M  n  x2 p! v1 T % R5 b& F/ A& W& J6 g
> r;
  l# |+ G' _+ ]2 X' E $ R, r' J( {: `$ f
> simplify(%);
2 ^8 \. V5 r! {6 T
, j1 c* F' \- T) U5 S# B6 f* k: a, \" z3) 在复数域上符号求值
1 F6 \) M9 J6 W1 K' o操纵复数型表达式并将其分离给出expr的实部和虚部的函数为evalc, 命令格式为:: K* N) O# U- ~! T) ^2 E5 b  b' g
evalc(expr);   
& |6 n2 `; D6 W/ U% hevalc假定所有变量表示数值, 且实数变量的函数是实数类型. 其输出规范形式为: expr1+I*expr2. ) R# a* C  ]" i& A$ @8 F. l2 }1 p
> evalc(sin(6+8*I));( f! j7 B, b: J8 U+ x8 _0 j- t1 V
; ?4 H+ h& V- D  i- v
> evalc(f(exp(alpha+x*I)));( i) y0 M0 ~5 @
  i8 N- r4 }, P2 W# I/ M# K4 {
> evalc(abs(x+y*I)=cos(u(x)+I*v(y)));% D4 `3 k5 b9 w. h* S% g

" {7 H9 m4 X3 ^2 h8 B9 K5 Q4) 使用浮点算法求值
4 W2 n* }" `$ E+ B# \9 `浮点算法是数值计算的一种基本方法,在任何情况下均可以对表达式expr使用evalf命令计算精度为n的浮点数(n=Digits), 如果n缺省, 则取系统默认值, 命令格式为: evalf(expr, n);     
0 }9 E7 K' n5 k7 Z: q4 j> evalf(Pi,50);   
% [# C) p- U4 }3 _% g
* L; _! f5 t" {" C> evalf(sin(3+4*I));   $ |% m# M+ s% W( A$ U

# N6 W4 C$ a* d2 A- g> evalf(int(sin(x)/x,x=0..1),20);" S) o5 Y# O& D  s( `5 F9 L

5 r  i$ O0 F8 Q9 r5) 对惰性函数求值
+ y, K* I& u3 W5 A把只用表达式表示而暂不求值的函数称为惰性函数, 除了第一个字母大写外, Maple中的惰性函数和活性函数的名字是相同的. 惰性函数调用的典型用法是预防对问题的符号求值, 这样可以节省对输入进行符号处理的时间, 而value函数强制对其求值. 对任意代数表达式f求值的命令格式为: value(f);   
2 v- j- Z. Q' }/ A7 L& r1 v9 e> F:=Int(exp(x),x);
9 ^4 V5 Q" l' c. R( r6 Z* S ) S* n7 |+ w7 k, ?; B' C
> value(%);; w: M6 ?8 ^1 x5 @- Q' E

, Y+ R# A. f  `- p/ o1 R0 [  W> f:=Limit(sin(x)/x,x=0);
' }3 g3 S5 @  G$ S: ] * X& w" f+ b0 T8 \- X
> value(%);2 g- A, x2 K' a8 v  ^$ R/ K- _- c

  V. z! G. ]! W9 m1 v' q另外, 将惰性函数的大写字母改为小写字母亦即可求值. 如下例:   + T% {& N2 O, ~( |- s. `  h6 n
> Limit(sin(x)/x,x=0)=limit(sin(x)/x,x=0);
( U/ d: j1 u* s4 y8 B8 r
! P8 Z% k3 Z5 c' o$ `9 J2 m! n4 数据结构3 P0 |8 s* F' ^+ l4 J. \  a8 `
Maple中有许多内建的与FORTRAN、C或Pascal不同的数据结构. 主要的数据结构有序列(sequence)、列表(list)、集合(set)、代数数( algebraic number)、未求值或惰性函数调用、表(table)、级数(series)、串(string)、索引名(index)、关系(relation)、过程体(process)以及整数(integer)、分数(fraction)、浮点数(float)、复数(complex number)等数据结构, 而矩阵(matrix)在Maple中表示为阵列, 是一种特殊的表. ! A7 \9 }+ f( x* ~
4.1 数据类型查询1 ]6 S$ x: N5 _! d& u
在Maple中, 用whattype指令来查询某个变量的数据类型或特定类型, 命令格式为: # G5 a. y# c1 j0 m5 s+ M, u
whattype(expr)        # 查询expr的数据类型
- b  p9 G- H9 [2 F- utype(expr, t)           # 查询expr是否为t类型, 若是则返回true, 否则返回false4 Y4 S# T3 F) G5 U) e( D
> whattype(12);" ?: n" E6 o4 Z2 f: Q3 ?2 P  ]! E

# W; C8 ?7 n$ \. c8 H5 _' h- c. B> whattype(Pi);# c( m) J) v: F( D; w+ ~( y
, g. x. F* |9 F" Q9 Z8 A: q, B9 j, a
> type(1.1,fraction);
; k+ N. P& _; z0 z3 t " [+ `0 M5 r9 @/ ^
> whattype(1.1);. `1 E% X2 j# p, E. A4 R
; z8 d6 e! e; z6 o  [
4.2 序列, 列表和集合% B" M* y% ]% r" @4 |1 i
4.2.1 序列8 R. w7 S% b2 P5 I. q1 G/ X
所谓序列(Sequence), 就是一组用逗号隔开的表达式列. 如:   
0 ^6 W( o2 V0 p0 u/ _. N5 F> s:=1,4,9,16,25;
+ g; ?* [8 }+ S% \4 i
9 U" O' D* `8 o# n' x0 e> t:=sin,com,tan,cot;5 \6 n  Z0 T) ?) ?

1 q  }8 m" y+ I; _一个序列也可以由若干个序列复合而成, 如:   * b6 B) Y, M0 v* L( c# c
> s:=1,(4,9,16),25;+ B' f9 o" k1 N+ F
+ A3 M  |2 M5 L5 v
> s,s;- \) s- _5 Q1 g6 C$ b7 w! d+ @

' Z3 A& f) Z' T6 o6 @, F而符号NULL表示一个空序列. 序列有很多用途, 如构成列表、集合等. 事实上, 有些函数命令也是由序列构成. 例如:   ' }% k% S) V' y3 @% f, W: X/ a
> max(s);
; k4 [) m; Z$ | & n; x8 L" e8 ]8 K( W
> min(s,0,s);5 J0 z. a/ J+ O9 K4 W4 Z

. J% f  g0 R7 o0 e8 n% {0 O值得注意的是, op和nops函数命令不适用于序列, 如op(s)或nops(s)都是错误的, 如果要使用op(s)或nops(s)前应先把序列s置于列表中.   C& J9 A. H$ @1 `- _  i
> s:=1, 2, abc, x^2+1, `hi world`, Pi, x -> x^2, 1/2, 1;
- A" [! s9 l% U1 A3 w 9 I% {5 u  b+ a: X% k! G  b
> op(s);
' e4 G! h. Y# U% {Error, wrong number (or type) of parameters in function op' N1 f" A, N& D
> nops(s);
8 V$ o2 ]  T& w: \5 ~Error, wrong number (or type) of parameters in function nops
* D+ j. r( n9 J7 B6 {8 w) D> op([s]);
. I4 z4 D, i8 ]+ f. s+ M$ K + j! _) y+ _, s$ P3 j9 b
> nops([stuff]);4 B& N" h6 l; C

$ R0 k4 [, p* I# U5 e' }% ^' ^函数seq是最有用的生成序列的命令, 通常用于写出具有一定规律的序列的通项, 命令格式为:   ' N: z3 e: R( |& f5 I# S6 e; c: b
seq(f(i), i=m..n);  # 生成序列f(m), f(m+1), …, f(n) (m,n为任意有理数)0 `, a. d3 x+ O; G
seq(f(i), i=expr);  # 生成一个f映射expr操作数的序列
- C( [- P& ]8 ?! `seq(f(op(i,expr)), i=1..nops(expr));  # 生成nops(expr)个元素组成的序列5 d0 v4 x. d$ x+ R
> seq(i^2,i=1..10);
! a; L& Q2 B  D9 Y6 t: g, R+ X. T , g% d/ w+ G$ n2 b+ x# }
> seq(ithprime(i),i=1..20);( J" I* f/ }" c! `) Q, k7 o" V
1 p0 I, W! s0 b' c
> seq(i^3,i=x+y+z);- x- {# y/ b8 M. J0 u

& Z+ E0 b$ `* }$ Y> seq(D(f),f=[sin,cos,tan,cot]);/ r. g$ j6 V4 y, {# Q, x  e' @
% _" ]! X7 a' S) d8 R- E- u/ \
> seq(f(op(i,x1+x2+x3+x4)),i=1..nops(x1+x2+x3+x4));% k5 s& _% q  r. D9 h- c

, R) ]3 z; G7 H' @- L+ p获得一个序列中的特定元素选用操作符[  ], 如:   
& O/ x/ {8 _( n# `2 V  V1 O; ~> seq(ithprime(i),i=1..20);2 J$ Z4 `3 Z% P# x

7 Z/ A  w" ~9 w( c> %[6],%[17];+ Z4 s+ S" D- k

/ V& I0 T! A. v6 h: M% N  M4.2.2 列表, b4 T; V( B& W1 \0 B1 l) n
列表(list), 就是把对象(元素)放在一起的一种数据结构, 一般地, 用方括号[  ]表示列表. 如下例:   4 n# k* P# |- N$ Q# ?
> l:=[x,1,1-z,x];
$ m( ]+ P/ A' z$ ]9 V' P' m. L& X0 f
( l" E4 t( ?9 r1 c' I> whattype(%);
8 I/ _! K6 Y4 L9 ?# H' `+ I $ C" o$ k4 S9 ^  F0 y1 r
空列表定义为[ ].
# X/ M0 ^+ z5 R+ q/ C但下述两个列表是不一样的, 因为对于列表而言, 次序是重要的:   ! Z, {- a0 C0 w! a0 H
> L:=[1,2,3,4];
$ p8 }0 e0 G+ W+ Q" R; a% W , [) u% j" W7 d2 }( |; H$ C
> M:=[2,3,4,1];
7 R: ]1 m, W4 @. ?+ t9 m3 k* R$ B , N- j. X! \0 J9 u
4.2.3 集合/ j( j; }1 l! d  H/ W. R$ Y2 e
集合(set)也是把对象(元素)放在一起的数据结构, 与列表不同的是集合中不可以有相同的元素(如果有, Maple也会自动将其当作同一个元素), 另外, 集合中的元素不管次序. 一般地, 用花括号表示集合.
; h3 k' m& q$ S# S( c3 @1 o" u6 H> s:={x,1,1-z,x};
% [% B1 }7 H+ |5 K! X: n" j6 f
/ `- ]0 G" H/ C. q# |> whattype(%);; R5 t; k! i$ A" Q% L

% p% S9 s+ F9 a/ Y( J7 o' ]% Q空集定义为{ }.
* L2 K. [% U; N0 j* T* G函数nop返回列表或集合的元素数, 而op则可返回其第I个元素.
9 W* ~* w/ W6 t% ~> op(1,s);
3 P6 U2 u' P- ]. Y ( [9 s- A$ m# L. i) e6 q
> s[1];
) N7 u1 v& c) C' M & L/ x8 d! ^: c3 X8 U
> op(1..3,s);8 S( l" e+ r3 [$ u( n2 v

& s% v( E/ F" Z8 j; ~  V; @> s[1..3];0 y, E7 h, X9 R# s- _; q1 g% C

( u0 o' E; f9 W/ m0 s函数member可以判定元素是否属于一个列表或集合, 如果属于, 返回true, 否则返回false. ' P: E+ Z5 @4 |) t* b1 W
> member(1+x,s);6 `* P, z# Y3 X6 Y
2 P) a8 G( i9 x2 P. `
可以通过下述方法在列表中增减元素:   
6 X& _3 ]- \; i1 F. t) \> t:=[op(s),x];1 q6 J$ f( O9 H7 T

4 U  r; |# s5 G& ^" h0 z( u% X> u:=[s[1..5],s[7..nops(s)]];
  a+ f' {  J& w1 j+ _8 q8 L * S2 r9 h/ F6 r' y' H2 f  f$ B, H7 C
Maple中集合的基本运算有交(intersect)、并(union)、差(minus):   , X0 G) y5 S, n) [1 A
> A:={seq(i^3,i=1..10)};B:={seq(i^2,i=1..10)};
2 k* |" E6 q2 F! K
- n; c; ^0 j7 D$ ]
/ |4 ~3 m4 d8 v" I1 V& _/ j% {2 w> A intersect B; 1 h- r" d+ K' g2 L8 X7 Q

9 ?, g. @; l+ t> A union B; - N# _+ X4 F6 X4 J; I8 \

% g4 G" @# P/ X3 P> A minus B;
2 \3 o: V4 Z$ u8 S2 y& M& q
2 U  K. a3 ^) `: {9 n. ?+ c" O4.3 数组和表$ w/ I; M' ?# _& e
在Maple中, 数组(array)由命令array产生, 其下标变量(index)可以自由指定. 下标由1开始的一维数组称为向量(vector), 二维以上的数组称为矩阵(matrix). 数组的元素按顺序排列, 任意存取一数组的元素要比列表或序列快的多. 区分一个数据结构是数组还是列表要用“type”命令.
" k! l# P) Q1 n% g    表(table)在建立时使用圆括号, 变量能对一个表赋值, 但一个在存取在算子中的未赋值变量会被自动地假定是表, 表的索引可以成为任意Maple表达式. 表中元素的次序不是固定的.
1 v7 f7 u  b- Q" U# S# U> A:=array(1..4);
! Y& V$ _* t. m" l# n/ w
0 L0 Z" x) m3 o8 x  L( x. F> for i from 1 to 4 do A[i]:=i: od:
6 K. J  i# t; `0 \9 ?  {9 c> eval(A);# l+ l. I* X3 w

- b( ]: ?$ M9 z1 a" k8 d5 Q> type(A,array);) ~: L2 \5 B. }
) f2 I+ j6 m/ k" f" V8 q
> type(A,list);
7 @- d3 A9 J4 s. |  I4 I8 R
: Y( X. N- ~9 w. Q> T:=table();
. |4 @$ p3 w0 P- Z) }* T6 E ! k% ~/ n' z6 k, A; l
> T[1]:= 1;( r- b0 |+ O/ Y1 L" U9 R

/ D; l6 g- @- f1 |5 _6 V/ f2 `" Z> T[5]:= 5;) W! X1 }0 N3 k3 M
& X1 t8 r% d% r0 x# D  {; Q) V
> T[3]:= 3;# @  e& N2 `4 r7 _' |2 g5 c- z6 n2 Y

, D& {* Z' i  t$ B  ~> T[sam]:=sally;
' c. I8 J/ u8 W3 } $ ^" S! r7 f$ d. Q' h" N
> T[Pi]:=exp(1);
  k, {. w7 J8 b/ o$ Y9 C & Y. r% ^- O" O2 p" _! D
> x:='x';+ e# t6 n' _4 e" F- t

& H* [' r2 ~5 B0 {* Z> T[(1+x+x^3)*sin(x)] := 0;
5 u# T4 e7 ?0 A% O
$ [. a$ b" w6 ]$ v. A3 P6 m7 b> eval(T);
6 Y0 ~5 s, |: q: V 4 F0 @6 j7 V% S; B
> T[3]:='T[3]';
1 o* T9 F) M9 t - G- R- p. X0 o! N! Y. U  Z" j
> eval(T);/ z2 @# J9 T+ O' x0 i1 m

' Y5 Y2 w& [) h5 n4.4 其他数据结构
8 p8 t! w+ A! Y  N5 [串在Maple中是很重要的, 他们主要用于取名字和显示信息. 一个Maple的串可以作为变量名, 它们中的大多数是简单的、不需要加引号的串, 但是如果变量名中包含/. 例如“diff/T”则必须把变量名用引号括起来. ' b7 Z9 }/ o# z7 p
索引名是像Database[1,2,drawer]或A[3]这样的对象, 在使用索引前不需要直接建立表, 如果不得不做, Maple会自动建立表. 索引名通常被用于矩阵和向量. 为了保证Maple建立表的正确次序, 建议在赋值前直接建立.
4 y* _6 I) {: {- H( N9 n2 C# ^% L> x:=T[3];
) W6 H3 k7 S, _
: e2 _- f! U0 G# L1 T! B8 y# x> eval(T);
1 e7 t2 H! p9 {' P5 @4 _
' j( ~" F$ G; y4 M0 d5 r+ X' E6 O> T[5]:=y;) _) F) ^$ E# {0 U2 P$ h( o

4 z0 P0 ~4 l* _> eval(T);$ o! V9 N1 N5 o- c! e% s
  I+ C6 n- K6 S" [5 m
由此可见, Maple并不直接建立T的表, 直到给T[5]赋了值.     
( C6 e' Z- _% i数值数据结构(整数、分数、有理数、浮点数、硬件浮点数和复数等)在它们的使用中是大量透明的. 浮点数是有传染性的, 这意味着如果数值结构中有一个是浮点数, 则整个结构自动转换为浮点数. # R( C2 f: k/ ]% a. [7 \: W
4.5 数据类型转换和合并
- ]) M# x7 L! rconvert是一个功能强大的类型转换函数, 它可以实现列表和数组的类型转换:     R) e: N# t5 h4 Y  C# r4 q
> L:=[1,2,3,4];
, e5 }  z! \0 e' j- }$ B0 b ( u2 `  k# ]5 k! `
> type(L,list);, X) Z2 u0 ]2 S
; A( I$ ]6 A4 G' V1 ]* p
> A:=convert(L,array);
& M) m" y! S  L1 n' |: Q  ^8 q
; G6 ]' I! @- Z6 V8 O: t9 o% R1 Z> type(A,list);
! r9 s- F' R2 O/ `  ~8 e5 p' ~
( Q& S( Z+ I' @7 D8 }> type(A,array);
  M5 h4 Y0 A1 P3 u4 O / y, u/ M' F, g5 m- u' i
另一个有用的函数zip则可把两个列表或向量合并:   
( M, K' C3 c4 T+ Y1 [>L:=[seq(i,i=1..10)];
8 p7 p& ^6 ^* t/ I6 I/ O  [8 f
. x# B6 X3 S, v> Sqr:=(x)->x^2;
; X1 T" V3 x( o+ D. D% i* s2 c$ [ $ M' U- ]8 z8 j1 Q: f! T8 x
> M:=map(sqr,L);
2 W6 J1 I6 J) I; Z) P3 {/ ?2 W
" J- {8 T5 ]* k  q* {/ G0 A+ G8 H  i% k0 n> LM:=zip((x,y)->[x,y],L,M);' O* B8 g6 t$ j6 T& F! F" g
% a, A' J' e" e. ]% f, F
> map(op,LM);7 p, K. n. i) l

+ r/ S+ O: N) i2 u6 g$ O% y, o5 Maple高级输入与输出操作: G( t* S  U% n, ~4 B# R
Maple提供了良好的接口来编辑与计算数学式. 许多时候, 我们可能需要把Maple的运算结果输出到一个文件中, 或者在一个文本编辑器里先编好一个较大的Maple程序, 再将它加载到Maple的环境里.
& A8 J. P7 }2 p: c- \0 X4 n) \4 x+ T5.1 写入文件% I2 g% `' t) i" M2 |' ]6 j+ {
5.1.1 将数值数据写入到一个文件
4 k9 ^* q" x5 {7 C5 M3 y& J2 ~  I如果Maple的计算结果是一长串的数值串行或数组, 而想把它写到一个文件时, 用writedata命令.
2 p  {4 F' V8 Z! L" ?若Maple的计算结果data为集合、矩阵、列表、向量等形式时, 将其写入名为filename的文件时命令格式为: writedata("filename", data);; F  Y* J8 K& I
> with(linalg):
4 h+ H0 ]+ g" F> M:=matrix(3,3,[1,2,3,4,5,6,7,8,9]);% y% V: {5 b% F, w
; s- p1 d( J3 n+ b8 O; z, d' X1 g
> writedata("e:\\filename.txt",M);# E* ~/ F1 U9 l  |1 ]+ D. x
而将结果附加在一个已存在的文件后时,使用命令: writedata[APPEND]("filename", data);; A& W; B: ]" k& q% X
> W:=matrix(2,2,[1,2,3,4]);
/ S* @6 q/ J* n0 X & y% P* }9 I: ]3 f. Y% u4 b5 }
> writedata[APPEND]("e:\\filename.txt",W);& M' R, ^6 n% Z3 r4 M
需要注意的是, 这里的APPEND是必需的, 否则W结果将会覆盖M结果.$ g. j! {2 B# \  t
另外, 若想将结果显示在屏幕上时, 用命令: writedata('terminal', data);
$ f" J4 U& B. B% q9 X> writedata[APPEND]("e:\\filename.txt",W); 0 ~! {5 `" r0 |/ }
> writedata('terminal',M);
9 J6 Z* x0 p/ W4 p1                   2                   3           % ^+ Z3 c# b. E
4                   5                   6           
" u- v" R5 b. \( b! [7                   8                   9    ' l% |1 G$ Q4 @) E9 Y
5.1.2 将Maple语句写入一个文件8 J. f/ A4 u: m6 r1 m' l
如果所要写入文件的是表达式、函数的定义或者是一个完整的程序, 则使用命令save, 写入一个或多个语句的命令格式分别如下:+ x6 B# {! X- m# D" b7 G
save name, "filename";
2 a, D$ a$ P" I& ?+ B7 `! isave name1, name2, …, "filename";3 n, ]6 B7 g7 Q" i9 M5 t
若filename的扩展名为.m, 则Maple会以内定的格式储存, 若扩展名为.txt, 则以纯文本文件储存. 以内定的格式储存的文件作纯文本编辑器无法读取, 但在大多数情况下, 它会比纯文本文件的加载速度更快, 且文件容量小.5 D1 Y+ K# G1 S! Q6 ^, A" e
> myfunc:=(k,n)->sum(x^k/k!,x=1..n);
. k& j3 p% m5 ^$ b" K% d: `! |
, O( T* ?5 e9 {; \& d> myresult:=myfunc(6,8);
( e, c7 r4 X) J" n* {* t ! p7 n  i+ t$ V. G
> save myfunc,myresult,"e:\\test.m";& @- A' h2 t9 i$ z/ r2 ~/ f" D
调用已存m文件用命令read. 试看下述实验:; f6 s5 M# b* ], b! s% @- H
> restart:
: Z5 f- j* e9 J> myfunc(6,8);
8 S6 m& Q1 L' [+ t% F+ C 0 C$ k6 N( {: q* @3 s' ]
> read "e:\\test.m";- d7 A* x1 J. |
> myfunc(6,8);& C5 O  ?1 _9 J  J: u( F
! I* G4 Q1 P+ R+ f" t
> myresult;
' I5 P8 g3 l8 Q. o# I# j) ~3 X* i
3 B+ J- f" I$ {8 _    而存为txt文件时则将整个语句存为一个文件:
3 |# ~! H, O$ ?2 E3 Y5 l8 Q. a2 x> save myfunc,myresult,"e:\\test.txt";
4 J0 Z( M4 \- d# L8 k; z> restart: read"e:\\test.txt";
/ G% H  j+ F" \6 Y, L
7 f- Q2 {" Y2 U- }0 `; g0 ]
7 Y9 P- A2 \; W4 T5.2 读取文件" u+ o' t1 E" l0 g5 ^0 P" p
在Maple里最常用的两个读取文件的命令, 一个是读取数值数据, 另一个是是读取Maple的指令.
& c9 z3 y$ b& T3 L4 r& u: S2 V5.2.1 读取数值数据' J6 h$ |" \) L
如果想把大量的数据导入Maple里进行进一步的运算或者要运用大量的实验数据在Maple环境绘图时, 可以用readdata( )命令完成.
: b) ?5 ]2 R" R从filename文件里读取n行数据时使用命令: readdata("filename",n);
2 N$ x7 i2 _; v: F2 H" b( f以指定的格式读取数据时使用命令: readdata("filename",[tyep1,type2,…]);
; R7 Z3 n+ B- ]* z. \' B> readdata("e:\\filename.txt",3);; h; G$ R" U3 X5 F
3 t1 b1 q1 P1 k$ Z1 h7 T
    读取filename的前三列, 第一列为整数形式, 第二、三列为浮点数形式:
/ l- E5 b) {2 L> readdata("e:\\filename.txt",[integer,float,float]);4 E3 l/ F" o2 p
$ |6 O5 [# G/ g
下面再看一个运用大量的实验数据在Maple环境绘图的实验:
! e4 ]8 ^$ V8 e" P7 ^> mypts:=[seq([x/1000,cos(x^2/100000)],x=1..1000)]:! a# f, z1 [8 o( t: X
> writedata("e:\\data.txt",evalf(mypts));/ }2 \/ p! C+ p0 b6 D
> dots:=readdata("e:\\data.txt",100):
$ Z6 _4 ^# q  P  G3 F> nops(dots);0 a% F! D0 ]0 }5 p& H

3 S) a" k2 Z( ]8 o& d+ D> dots[1..4];
( Q# I7 P6 M7 J5 }' d! t - [, E9 K9 d$ `
> plot(dots,style=line);
7 F8 K7 }! i0 \8 _ 8 |+ S5 q) P# E% i  k
5.2.2 读取Maple的指令
% H4 H8 A3 _3 w/ o* M# [在编写程序时, 在普通软件中先编好程序再将其读入Maple环境中常常比直接在Maple中编写更为方便. 如果要将程序代码或Maple指令加载用read命令:
; b1 j7 K8 t& W6 Wread "filename";4 \5 V: Q% D! K' [7 x
如下例:
% X3 Z- Z6 @5 \! ^* g> reatart:
- X; s/ Q( g4 v* j5 l> myfunc:=(a::list)->add(i,i=a);" |* l" j% v6 O2 `7 L( \: M
* r0 \/ L2 K" Q* @2 L. d5 h1 a% j# V
> avg:=(a::list)->myfunc(a)/nops(a);+ [7 o) l- Z: {' f
1 [6 `6 s6 Q/ C9 ?- K
> save myfunc,avg,"e:\\function.m";
  ^4 ?% p5 ?% G: g/ A> restart:, T+ x! c) R; ]" a  D
> read "e:\\function.m";
. N% w8 R( r7 n9 x& h( q  l3 v, f> myfunc([1,2,3,4,5,6,7,8,9]);2 b% K$ S. J% K. Z% q

/ g# k9 U  T9 G/ d5 A> avg([1,2,3,4,5,6,7,8,9]);; U7 l( ^1 g' p; t
- J4 y, i) A: ?- `: M
5.3 与其它程序语言的连接5 n  S/ p' x! |0 ^; I. e: x" R& D% D
5.3.1 转换成FORTRAN或C语言% C9 P; B2 l% P" U
调用codegen程序包中的fortran命令可以把Maple的结果转换成FORTRAN语言:! v  n# n" m: `. ]4 Q6 }3 S( R3 P
> with(codegen,fortran):0 _4 O5 {2 z' G% v2 m) S
f:= 1-2*x+3*x^2-2*x^3+x^4;
& f- O' c5 z8 p0 Y
+ L2 ^! s" z' i4 v. s' ?> fortran(%);0 J& Q& e9 e1 f" V
      t0 = 1-2*x+3*x**2-2*x**3+x**4& E6 g0 L. D, h
> fortran(f,optimized);  a) b2 I: B, L& v# F" X
      t2 = x**2
! J) `  o2 |9 k' i* m; D6 I      t6 = t2**2
( f$ Z: {5 W7 @/ k7 L8 h7 ~      t7 = 1-2*x+3*t2-2*t2*x+t6
2 U; c, {" c+ E& G  p" Q> fortran(convert(f,horner,x));
) A$ W+ c8 V/ `( M& J+ C+ n      t0 = 1+(-2+(3+(-2+x)*x)*x)*x9 |5 n7 F4 A$ Y) y; w  U7 y
而codegen程序包中的C命令可以把Maple结果转换成C语言格式:) M" C5 E1 K% Q' c4 U6 O
> with(codegen,C):( T: t: i8 _/ u  q6 a& s
f:=1-x/2+3*x^2-x^3+x^4;9 ~9 x* w7 M/ j6 H. H

5 T. N, x( t0 p> C(f);6 z* n+ Z- ^& b# O! t! W3 W
      t0 = 1.0-x/2.0+3.0*x*x-x*x*x+x*x*x*x;
1 ?3 @. Q# G0 W( K. e; S> C(f,optimized);
# h# f; E; Z- t* E0 Q+ l8 V      t2 = x*x;8 N4 d7 {/ V0 c; j% t
      t5 = t2*t2;
0 O$ y# A& x  P8 j      t6 = 1.0-x/2.0+3.0*t2-t2*x+t5;/ N" r6 T* c6 k2 S9 m) k: y
optimized命令表示要对转换的表达式进行优化, 如果不加此可选参数, 则直接对表达式进行一一对应的转换.% U& R. c. n6 u8 g7 ]
5.3.2 生成LATEX
9 o  a' l9 p& W+ e9 VMaple可以把它的表达式转换成LATEX, 使用latex命令即可:
! O6 I, q+ S6 B8 f> latex(x^2+y^2=z^2);
* I% V3 u! |4 P+ d3 Y- p{x}^{2}+{y}^{2}={z}^{2}
, m& h2 a* h) o; F' h2 j3 Q! Z. `8 T    还可以将转换结果存为一个文件(LatexFile):, J$ d. `7 {8 \  ?6 L' t0 U
> latex(x^2 + y^2 = z^2, LatexFile);4 w/ H" I! H- t% K+ }1 M
    再如下例:5 }8 P& W" H$ V
> latex(Int(1/(x^2+1),x)=int(1/(x^2+1),x));
/ T, [* O7 e: E) v4 w4 g\int \! \left( {x}^{2}+1 \right) ^{-1}{dx}=\arctan\left( x \right), U5 k* Z$ t5 ]  t- T, Y7 C' N
' r/ ~' E$ T1 [* G$ U: H& E0 _6 t
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年!
    6 C, ?+ N8 w5 I' H0 G# c9 T
    4 Y& W$ v% Q& e7 M& G5 G! b* b
    : g# F" _' i1 P; T9 E& x2 v; q( I
    回复

    使用道具 举报

    0

    主题

    2

    听众

    19

    积分

    升级  14.74%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    0

    主题

    4

    听众

    181

    积分

    升级  40.5%

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

    [LV.5]常住居民I

    群组学术交流A

    群组学术交流B

    回复

    使用道具 举报

    0

    主题

    13

    听众

    27

    积分

    升级  23.16%

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

    [LV.3]偶尔看看II

    社区QQ达人

    群组国赛讨论

    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-8-23 15:34 , Processed in 0.435972 second(s), 103 queries .

    回顶部