搜索
您的当前位置:首页正文

Maple基础教程(修订稿).

来源:哗拓教育
Maple基础

一Maple的基本运算

1 数值计算问题

在应用Maple做算术运算时, 只需将Maple当作一个“计算器”使用, 所不同的是命令结束时需加“;”或“:”.

在Maple中, 主要的算术运算符有“+”(加)、“–”(减)、“*”(乘)、“/”(除)以及“^”(乘方或幂,或记为**),值得注意的是, “^”的表达式只能有两个操作数, 换言之, a^b^c是错误的, 而“+”或“*”的任意表达式可以有两个或者两个以上的操作数. 2.1.1 有理数运算

作为一个符号代数系统, Maple可以绝对避免算术运算的舍入误差.如果要求出两个整数运算的近似值时, 只需在任意一个整数后加“.”(或“.0”), 或者利用“evalf”命令把表达式转换成浮点形式, 默认浮点数位是10 (即: Digits:=10, 据此可任意改变浮点数位, 如Digits:=20). > 123456789/987654321;

> evalf(%);

13717421109739369 .1249999989

> big_number:=3^(3^3);

big_number := 7625597484987

> length(%);

13

函数“length”作用在整数上时是整数的十进制位数即数字的长度. “%”是一个非常有用的简写形式, 表示最后一次执行结果 1)整数的余(irem)/商(iquo)

命令格式:

irem(m,n); #求m除以n的余数

irem(m,n,'q'); #求m除以n的余数, 并将商赋给q iquo(m,n); #求m除以n的商数

iquo(m,n,'r'); #求m除以n的商数, 并将余数赋给r

其中, m, n是整数或整数函数, 也可以是代数值, 此时, irem保留为未求值.

2)素数判别(isprime) 命令格式: isprime(n);

如果判定n可分解, 则返回false, 如果返回true, 则n“很可能”是素数. > isprime(2^(2^4)+1);

true

3) 确定第i个素数(ithprime)

若记第1个素数为2,判断第i个素数的命令格式: ithprime(i);

4) 一组数的最大值(max)/最小值(min)

命令格式: max(x1,x2,…,xn); #求x1,x2,…,xn中的最大值 min(x1,x2,…,xn); #求x1,x2,…,xn中的最小值

- 1 -

5)随机数生成器(rand) 命令格式:

rand( ); #随机返回一个12位数字的非负整数

rand(a..b); #调用rand(a..b)返回一个程序, 它在调用时生成一个在范围[a, b]内的随机数 > rand();

427419669081

> myproc:=rand(1..2002):

> myproc(); > myproc();

19161204

注意, rand(n)是rand(0..n-1)的简写形式. 2.1.2 复数运算

复数是Maple中的基本数据类型. 虚数单位i在Maple中用I表示可以用Re( )、Im( )、conjugate( )和argument( )等函数分别计算实数的实部、虚部、共轭复数和幅角主值等运算. 试作如下实验: > complex_number:=(1+2*I)*(3+4*I);

complex_number := -510I

> Re(%);Im(%%);conjugate(%%%);argument(complex_number);

-5 10 -510I arctan(2)

1) 绝对值函数

命令格式: abs(expr);

当expr为实数时,返回其绝对值,当expr为复数时,返回复数的模. 2)复数的幅角函数

命令格式: argument(x); #返回复数x的幅角的主值 3)共轭复数

命令格式: conjugate(x); #返回x的共轭复数

2.2 初等数学

2.2.1 常用函数

1) 确定乘积和不确定乘积 命令格式: product(f,k);

product(f,k=m..n); product(f,k=alpha); product(f,k=expr);

其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf, expr—包含k的任意表达式.

> product(k^2,k=1..10); #计算k关于1..10的连乘

213168189440000

> product(k^2,k); #计算k的不确定乘积

- 2 -

2(k)2

> product(a[k],k=0..5); #计算ai(i=0..5)的连乘

a0a1a2a3a4a5

> Product(n+k,k=0..m)=product(n+k,k=0..m); #计算(n+k)的连乘, 并写出其惰性表达式

mnk)(nm1)k(0(n)

> product(k,k=RootOf(x^3-2)); #计算x32的三个根的乘积

2

2)指数函数

计算指数函数exp关于x的表达式的命令格式为: exp(x); 3)确定求和与不确定求和sum 命令格式: sum(f,k);

sum(f,k=m..n); sum(f,k=alpha); sum(f,k=expr);

其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf, 含k的表达式.

> Sum(k^2,k=1..n)=sum(k^2,k=1..n);

nk21(n1)31(n1)21n1 k13266> Sum(1/k!,k=0..infinity)=sum(1/k!,k=0..infinity);

1k0k!e > sum(a[k]*x[k],k=0..n);

xkna0kk

> sum(k/(k+1),k=RootOf(x^2-3));

3

3)三角函数/双曲函数

命令格式: sin(x); cos(x); tan(x); cot(x); sec(x); csc(x); sinh(x); cosh(x); tanh(x); coth(x); sech(x); csch(x); 其中, x为任意表达式. > Sin(Pi)=sin(Pi);

Sin()0

4)反三角函数/反双曲函数

命令格式: arcsin(x); arccos(x); arctan(x); arccot(x); arcsec(x); arccsc(x);

arcsinh(x); arccosh(x); arctanh(x); arccoth(x); arcsech(x); arccsch(x); arctan(y,x);

- 3 -

expr—不

其中, x, y为表达式. 反三角函数/反双曲函数的参数必须按弧度计算. > arcsinh(1);

ln(12)

> cos(arcsin(x));

1x2

5)对数函数

命令格式: ln(x); #自然对数

log[a](x); #一般对数 log10(x); #常用对数

一般地, 在ln(x)中要求x>0. 但对于复数型表达式x, 有:

ln(x)ln(abs(x))I*argument(x) (其中, argument(x))

> log10(1000000);

ln(1000000)

ln(10)> simplify(%); #化简上式

6

2.2.2 函数的定义

试看下面一个例子:

> f(x):=a*x^2+b*x+c;---并不是函数,而是一个表达式

f(x) := ax2bxc

> f(x),f(0),f(1/a);

1ax2bxc,f(0),fa

由上述结果可以看出, 用赋值方法定义的f(x)是一个表达式而不是一个函数 在Maple中, 要真正完成一个函数的定义, 需要用算子(也称箭头操作符): > f:=x->a*x^2+b*x+c;

f := xax2bxc

> f(x),f(0),f(1/a);

ax2bxc,c,> f:=(x,y)->x^2+y^2;

1bc aaf := (x,y)x2y2

> f(1,2);

5

> f:=(x,y)->a*x*y*exp(x^2+y^2);

22(xy)f := (x,y)axye- 4 -

另一个定义函数的命令是unapply,其作用是从一个表达式建立一个算子或函数. 命令格式为: f:=unapply(expr, x); 命令格式为: f:=unapply(expr, x, y, …); > f:=unapply(x^4+x^3+x^2+x+1,x);

f := xx4x3x2x1

借助函数piecewise可以生成简单分段函数:

> abs(x)=piecewise(x>0,x,x=0,0,x<0,-x);

xx0x清除函数的定义用命令unassign. > unassign(f); > f(1,1);

0xx0 x0f(1,1)

定义了一个函数后, 就可以使用op或nops指令查看有关函数中操作数的信息. nops(expr), 函数op的主要功能是,其命令格式为:

op(expr); #获取表达式的操作数

op(i, expr); #取出expr里第i个操作数, op(i .. j, expr); #expr的第i到第j个操作数 nops(expr); #返回操作数的个数

> expr:=6+cos(x)+sin(x)*cos(x)^2;

expr := 6cos(x)sin(x)cos(x)2

> op(expr);

6,cos(x),sin(x)cos(x)2

> nops(expr);

3

2.2.3 Maple中的常量与变量名

为了解决数学问题, 一些常用的数学常数是必要的. Maple系统中已经存储了一些数学常数在表达式序列constants中: > constants;

false,,,true,Catalan,FAIL,

为了方便使用, 现将上述常数的具体含义列示如下:

常 数 圆周率 名 称 Pi 近似值 3.1415926535 0.9159655942 (1)nCatalan常数C 2n0(2n1)Catalan n1Euler-Mascheroni常数lim lnnnk1kgamma infinity 0.5772156649  - 5 -

2.2.4 函数类型转换

实现函数类型转换的命令是convert. 命令格式:

convert(expr, form); #把数学式expr转换成form的形式

convert(expr, form, x); #指定变量x, 此时form只适于exp、sin、cos convert指令所提供的三角函数、指数与函数的转换共有exp等7种: (1) exp: 将三角函数转换成指数

(2) expln: 把数学式转换成指数与对数

(3) expsincos: 分别把三角函数与双曲函数转换成sin、cos与指数的形式 (4) ln: 将反三角函数转换成对数

(5) sincos: 将三角函数转换成sin与cos的形式, 而把双曲函数转换成sinh与cosh的形式 (6) tan: 将三角函数转换成tan的形式

(7) trig: 将指数函数转换成三角函数与对数函数 > convert(sinh(x),exp); #将sinh(x)转换成exp类型

1x11ex 22e2.2.5 函数的映射—map指令

在符号运算的世界里, 映射指令map可以说是相当重要的一个指令, 它可以把函数或指令映射到这些结构里的元素, 而不破坏整个结构的完整性. 命令格式为:

map(f, expr); #将函数f映射到expr的每个操作数

map(f, expr, a); #将函数f映射到expr的每个操作数, 并取出a为f的第2个自变量

map(f, expr, a1, a2,…, an); #将函数f映射到expr的每个操作数, 并取a1~an为f的第2~n+1个自变量 map2(f, a1, expr, a2, …, an); #以a1为第1个自变量, expr的操作数为第2个自变量, a2为

第3个自变量…, an为第n+1个自变量来映射函数f

> f:=x->sqrt(x)+x^2;

f := xxx2

> map(f,[a,b,c]);

[aa2,bb2,cc2]

> map(h, [a,b,c],x,y);

[h(a,x,y),h(b,x,y),h(c,x,y)]

3 求 值

3.1 赋值

在Maple中, 不需要申明变量的类型, 甚至在使用变量前不需要将它赋值, 这是Maple与其它高级程序设计语言不同的一点, 也正是Maple符号演算的魅力所在, 这个特性是由Maple与众不同的赋值方法决定的. 为了理解其赋值机制, 先看下面的例子. > p:=9*x^3-37*x^2+47*x-19;

p := 9x337x247x19

> roots(p);

[1,2],19,1 9- 6 -

> subs(x=19/9,p);

0

3.2 变量代换

subs ( var = repacedment, expression);

调用的结果是将表达式expression中所有变量var出现的地方替换成 replacement. > f:=x^2+exp(x^3)-8;

f := xe> subs(x=1,f);

23(x)8

7e

如果需要计算, 必须调用求值函数evalf. 如: > evalf(%);

5.

> subs(x=y,y=z,x^2*y); (顺序替换)

z3

> subs({x=y,y=z},x^2*y); (同步替换)

y2z

> subs((a=b,b=c,c=a),a+2*b+3*c); (顺序替换)

6a

> subs({a=b,b=c,c=a},a+2*b+3*c); (轮 换)

b2c3a

> subs({p=q,q=p},f(p,q)); (互 换)

f(q,p)

3.3 求值规则

1) 对表达式求值

命令格式: eval(e, x=a); #求表达式e在x=a处的值 eval(e, eqns); #对方程或方程组eqns求值 eval(e); #表达式e求值到上面两层 eval(x,n); #给出求值名称的第n层求值 > p:=x^5+x^4+x^3+x^2+x+73;

p := x5x4x3x2x73

> eval(p,x=7);

19680

当表达式在异常点处求值时, eval会给一个错误消息. 如下: > eval(sin(x)/x,x=0);

Error, numeric exception: division by zero

2) 在代数数(或者函数)域求值

命令格式: evala(expr); # 对表达式或者未求值函数求值 evala(expr,opts); #求值时可加选项(opts)

在Maple中, 代数数用函数RootOf()来表示. 如3作为一个代数数, 可以表示为:

- 7 -

> alpha:=RootOf(x^2-3,x);

 := RootOf(_Z23)

> simplify(alpha^2);

3

在Maple内部, 代数数不再表示为根式, 而在化简时, 仅仅利用到3这样的事实. 这里, Maple用到一个内部变量_Z. 再看下面一个例子,其中alias是缩写的定义函数,而参数lenstra指lenstra椭圆曲线方法:

> alias(alpha=RootOf(x^2-2)):

> evala(factor(x^2-2,alpha),lenstra);

2(x)(x)

> evala(quo(x^2-x+3,x-alpha,x,'r'));

1x

> r;

32

> simplify(%);

5

3) 在复数域上符号求值

操纵复数型表达式并将其分离给出expr的实部和虚部的函数为evalc, 命令格式为: evalc(expr);

evalc假定所有变量表示数值, 且实数变量的函数是实数类型. 其输出规范形式为: expr1+I*expr2. > evalc(sin(6+8*I));

sin(6)cosh(8)Icos(6)sinh(8)

> evalc(f(exp(alpha+x*I)));

f(ecos(x)Iesin(x))

4) 使用浮点算法求值

命令格式为: evalf(expr, n); > evalf(Pi,50);

3.1415926535897932384626433832795028841971693993751> evalf(sin(3+4*I));

3.85373803827.01681326I

5) 对惰性函数求值

把只用表达式表示而暂不求值的函数称为惰性函数,对任意代数表达式f求值的命令格式为: value(f); > F:=Int(exp(x),x);

xF := edx

> value(%);

ex

> f:=Limit(sin(x)/x,x=0);

- 8 -

f := lim> value(%);

x0sin(x) x1

另外, 将惰性函数的大写字母改为小写字母亦即可求值. 如下例: > Limit(sin(x)/x,x=0)=limit(sin(x)/x,x=0);

x0limsin(x)1 x4 数据结构

Maple中有许多内建的与FORTRAN、C或Pascal不同的数据结构. 主要的数据结构有序列(sequence)、列表(list)、集合(set)、代数数( algebraic number)、未求值或惰性函数调用、表(table)、级数(series)、串(string)、索引名(index)、关系(relation)、过程体(process)以及整数(integer)、分数(fraction)、浮点数(float)、复数(complex number)等数据结构, 而矩阵(matrix)在Maple中表示为阵列, 是一种特殊的表.

4.1 数据类型查询

在Maple中, 用whattype指令来查询某个变量的数据类型或特定类型, 命令格式为: whattype(expr) # 查询expr的数据类型

type(expr, t) # 查询expr是否为t类型, 若是则返回true, 否则返回false

4.2 序列, 列表和集合

4.2.1 序列

所谓序列(Sequence), 就是一组用逗号隔开的表达式列. 如: > s:=1,4,9,16,25;

s := 1,4,9,16,25

> t:=sin,com,tan,cot;

t := sin,com,tan,cot

一个序列也可以由若干个序列复合而成, 如: > s:=1,(4,9,16),25;

s := 1,4,9,16,25

> s,s;

1,4,9,16,25,1,4,9,16,25

而符号NULL表示一个空序列. 序列有很多用途, 如构成列表、集合等. 事实上, 有些函数命令也是由序列构成. 例如: > max(s);

25

> min(s,0,s);

0

函数seq是最有用的生成序列的命令, 通常用于写出具有一定规律的序列的通项, 命令格式为: seq(f(i), i=m..n); # 生成序列f(m), f(m+1), …, f(n) (m,n为任意有理数) seq(f(i), i=expr); # 生成一个f映射expr操作数的序列

- 9 -

seq(f(op(i,expr)), i=1..nops(expr)); # 生成nops(expr)个元素组成的序列 > seq(i^2,i=1..10);

1,4,9,16,25,36,49,64,81,100

> seq(i^3,i=x+y+z);

x3,y3,z3

获得一个序列中的特定元素选用操作符[ ], 如: > seq(ithprime(i),i=1..20);

2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71

> %[6],%[17];

13,59

4.2.2 列表

列表(list), 就是把对象(元素)放在一起的一种数据结构, 一般地, 用方括号[ ]表示列表. 如下例: > l:=[x,1,1-z,x];

l := [x,1,1z,x]

> whattype(%);

list

4.2.3 集合

集合(set)也是把对象(元素)放在一起的数据结构,一般地, 用花括号表示集合. > s:={x,1,1-z,x};

s := {1,x,1z}

> whattype(%);

set

空集定义为{ }.

Maple中集合的基本运算有交(intersect)、并(union)、差(minus): > A:={seq(i^3,i=1..10)};B:={seq(i^2,i=1..10)};

A := {1,8,27,64,125,216,343,512,729,1000}

B := {1,4,9,16,25,36,49,64,81,100}

> A intersect B;

{1,64}

4.3 数组和表

在Maple中, 数组(array)由命令array产生, 其下标变量(index)可以自由指定. 下标由1开始的一维数组称为向量(vector), 二维以上的数组称为矩阵(matrix). 数组的元素按顺序排列, 任意存取一数组的元素要比列表或序列快的多. 区分一个数据结构是数组还是列表要用“type”命令.

表(table)在建立时使用圆括号, 变量能对一个表赋值, 但一个在存取在算子中的未赋值变量会被自动地假定是表, 表的索引可以成为任意Maple表达式. 表中元素的次序不是固定的.

- 10 -

5 Maple高级输入与输出操作

生成LATEX

Maple可以把它的表达式转换成LATEX, 使用latex命令即可: > latex(x^2+y^2=z^2);

{x}^{2}+{y}^{2}={z}^{2}

还可以将转换结果存为一个文件(LatexFile):

> latex(x^2 + y^2 = z^2, LatexFile);

再如下例:

> latex(Int(1/(x^2+1),x)=int(1/(x^2+1),x));

\\int \\! \\left( {x}^{2}+1 \\right) ^{-1}{dx}=\\arctan\\left( x \\right)

二 微积分运算

1 函数的极限和连续

1.1 函数和表达式的极限

limf(x)命令格式为: limit(f,x=a);求limf(x)时的命令格式为limit(f, x=a, right); 求limf(x)时

xaxaxa的命令格式为limit(f, x=a, left); 请看下述例子:

> Limit((1+1/x)^x,x=infinity)=limit((1+1/x)^x,x=infinity);

x1lim1e xx> Limit((x^n-1)/(x-1),x=1)=limit((x^n-1)/(x-1),x=1);

xn1limn x1x1> Limit(x^x,x=0,right)=limit(x^x,x=0,right);

x0+limxx1

> limit(a*x*y-b/(x*y),{x=1,y=1});

ab

> limit(x^2*(1+x)-y^2*((1-y))/(x^2+y^2),{x=0,y=0});

undefined

下例就是化二重极限为二次极限而得正确结果:

- 11 -

> limit((sin(x+y)/(sin(x)*sin(y)),{x=Pi/4,y=Pi/4}));

sin(xy)11limit,{x,y}sin(x)sin(y) 44> limit(limit(sin(x+y)/(sin(x)*sin(y)),x=Pi/4),y=Pi/4);

2

1.2 函数的连续性

1.2.1 连续

在Maple中可以用函数iscont来判断一个函数或者表达式在区间上的连续性. 命令格式为: iscont(expr, x=a..b, 'colsed'/'opened');

其中, closed表示闭区间, 而opened表示开区间(此为系统默认状态).

如果表达式在区间上连续, iscont返回true, 否则返回false, 当iscont无法确定连续性时返回FAIL. 另外, iscont函数假定表达式中的所有符号都是实数型. 颇为有趣的是, 当给定区间[a,b] (a>b)时, iscont会自动按[b,a]处理.

> iscont(1/x,x=1..2);

true

> iscont(1/x,x=-1..1,closed);

false

> iscont(1/(x+a),x=0..1);

FAIL

> iscont(ln(x),x=10..1);

true

1.2.2 间断

函数discont可以寻找函数或表达式在实数域的间断点, 当间断点周期或成对出现时, Maple会利用一些辅助变量予以表达, 比如, _Zn~(任意整数)、_NZn~(任意自然数)和Bn~(一个二进制数, 0或者1), 其中n是序号. 判定f(x)间断点的命令为:

discont(f, x);

> discont(ln(x^2-4),x);

{-2,2}

> discont(arctan(1/2*tan(2*x))/(x^2-1),x);

11{-1,1,_Z1~}24

> discont(round(3*x-1/2),x);

11{_Z1} 33函数round为“四舍五入”函数,上例并非一目了然,对其进一步理解可借助于函数plot或下面给出的fdiscont例子。

另一个寻找间断点的函数fdiscont是用数值法寻找在实数域上的间断点. 命令格式为: fdiscont(f, domain, res, ivar, eqns);

其中, f表示表达式或者, domain表示要求的区域, res表示要求的分辨率, ivar表示独立变量名称, eqns表示可选方程.

- 12 -

2 导数和微分

2.1 符号表达式求导

利用Maple中的求导函数diff可以计算任何一个表达式的导数或偏导数, 其惰性形式Diff可以给出求导表达式, $表示多重导数. 求expr关于变量x1, x2, …, xn的(偏)导数的命令格式为:

diff(expr, x1, x2, …, xn); diff(expr, [x1, x2, …, xn]);

其中, expr为函数或表达式, x1, x2, …, xn为变量名称.

有趣的是, 当n大于1时, diff是以递归方式调用的:

diff(f(x), x, y)=diff(diff(f(x), x), y)

> Diff(ln(ln(ln(x))),x)=diff(ln(ln(ln(x))),x);

1ln(ln(ln(x))) xxln(x)ln(ln(x))> Diff(exp(x^2),x$3)=diff(exp(x^2),x$3);

22(x)3(x2)3(x)e12xe8xe 3x> diff(x^2*y+x*y^2,x,y);

2x2y

> f(x,y):=piecewise(x^2+y^2<>0,x*y/(x^2+y^2));

xy22f(x,y) := xy0> diff(f(x,y),x);

x2y20otherwise

y2x2y22xy222(xy)0> diff(f(x,y),x,y);

x2y20otherwise

12y22x28x2y22223xy2222222(xy)(xy)(xy)0> normal(%);

4224x6xyy322(xy)0x2y20otherwise

x2y20otherwise

函数diff求得的结果总是一个表达式, 如果要得到一个函数形式的结果, 也就是求导函数, 可以用

D算子. D算子作用于一个函数上, 得到的结果也是一个函数. 求f的导数的命令格式为: D(f);

值得注意的是, f必须是一个可以处理为函数的代数表达式, 它可以包含常数、已知函数名称、未知函数名称、箭头操作符、算术和函数运算符.

复合函数表示为f@g, 而不是f(g), 因此D(sin(y))是错误的, 正确的应该是D(sin@y).

- 13 -

D运算符也可以求高阶导数, 但此时不用$, 而用两个@@.

D运算符并不局限于单变量函数, 一个带指标的D运算符D[i](f)可以用来求偏导函数, D[i](f)表示函数f对第i个变量的导函数, 而高阶导数D[i,j](f)等价于D[i](D[j](f)). > g:=x->x^n*exp(sin(x));

g := xxne> D(g);

sin(x)sin(x)

xnnexx> Diff(g,x)(Pi/6)=D(g)(Pi/6);

xncos(x)esin(x)

1ne(1/2)n6111g63e(1/2) x662> D(D(sin));

nsin

> (D@@2)(sin);

sin

> f:=(x,y,z)->(x/y)^(1/z);

1zxf := (x,y,z) y> Diff(f,y)(1,1,1)=D[2](f)(1,1,1);

f(1,1,1)-1 yD运算符和函数diff的差别:

1) D运算符计算运算符的导数, 而diff计算表达式的导数;

2) D的参数和结果是函数型运算符, 而diff的参数和结果是表达式; 3) 将含有导数的表达式转换为D运算符表达式的函数为: convert(expr,D); > f:=diff(y(x),x$2):

2f := 2y(x)

x> convert(f,D);

(D> f:=D(y)(x)-a*D(z)(x);

(2))(y)(x)

4) 将D(f)(x)表达式转换为diff(f(x),x)形式的命令: convert(expr,diff,x);

f := D(y)(x)aD(z)(x)

> convert(f,diff,x);

y(x)az(x) xxD运算符可以计算定义为程序的偏导数, 此即Maple自动求导功能(详细内容参看第6章).

下面我们讨论在积分学当中的一个微妙的漏洞,在大多数计算机代数系统中都会出现这个问题,甚

- 14 -

至于在许多教科书和积分表中这种情况也是长期存在。

在对多元函数f(x,y)求混合偏导数时,Maple总自以为是下当然正确,但不连续时不正确。

ff,这一点在f(x,y)连续的情况xyyx2.2 隐函数求导

隐函数或由方程(组)确定的函数的求导, 使用命令implicitdiff. 假定f, f1,…,fm为代数表达式或者方程组, y, y1,…,yn为变量名称或者独立变量的函数, 且m个方程f1,…,fm隐式地定义了n个函数y1,…,yn, 而u, u1,…,ur为独立变量的名称, x, x1,…,xk为导数变量的名称. 则:

(1) 求由f确定的y对x的导数:

implicitdiff(f,y,x);

(2) 求由f确定的y对x1,…,xk的偏导数:

implicitdiff(f,y,x1,…,xk);

(3) 计算u对x的导数, 其中u必须是给定的y函数中的某一个

implicitdiff({f1,…,fm},{y1,…,yn},u,x);

(4) 计算u对x1,…,xk的偏导数

implicitdiff({f1,…,fm},{y1,…,yn},u,{x1,…xk}); (5) 计算u的高阶导数

implicitdiff({f1,…,fm},{y1,…,yn},{u1,…,ur}, x1,…,xk);

implicitdiff(f,y,x)命令的主要功能是求隐函数方程f确定的y对x的导数, 因此, 输入的f必须是x和y或者代数表达式的方程(其中代数表达式为0). 第二个参数y指定了非独立变量、独立变量或常数, 如果y是名称, 就意味着非独立变量, 而所有其他出现在输入的f和求导变量x中名称以及不看作是常数类型的变量, 统统视作独立变量处理. 如果方程f1,…,fm是超定的, implicitdiff返回FAIL. 例如: > f:=exp(y)-x*y^2=x;

f := eyxy2x

> implicitdiff(f,y,x);

y21 ey2xy> g:=x^2+y^3=1;

g := x2y31

> implicitdiff(g,z,x);

FAIL

如果是对多元函数求多个偏导数, 结果将用偏微分形式给出. 可以给定最后一个可选参数来确定结果的表达形式, 默认情况下或者给定notation=D, 这时结果中的微分用D运算符表示, 否则可以给定notation=Diff, 这样给出的结果中的微分运算符和使用Diff时相同, 即用来表示. 试作以下实验:

xcosucosv2zycosusinv 求2

xzsinu> f:=x=cos(u)*cos(v);

f := xcos(u)cos(v)

- 15 -

> g:=y=cos(u)*sin(v);

g := ycos(u)sin(v)

> h:=z=sin(u);

h := zsin(u)

> implicitdiff ({f,g,h}, {z(x,y), u(x,y), v(x,y)}, {z}, x, x, notation=Diff);

2sin(v)2sin(u)21sin(v)22z 3xsin(u)y2.3 函数的极值

2.3.1 函数的极值

极值包含两种情形:极大值和极小值。在Maple中, 有两个求函数极值的命令: minimize, maximize, 命令格式如下:

minimize (expr, vars, range); maximize (expr, vars, range); > expr1:=x^3-6*x+3:

minimize(expr1,x=-3..3);

-6

maximize(expr1,x=-3..3);

12

> minimize(tanh(x),x,`infinite`);

-1

maximize(tanh(x),x,`infinite`);

1

虽然, minimize和maximize这两个命令很好用, 但对于一些特殊的函数而言, 这两个指令不但有可能无法求得极值, 还有可能给我们错误的解. 因此, 在Maple下求极值最好的方法是先作图(鼠标右键点击函数解析式选择plots命令即可), 由图上找出极值的大概位置, 然后再由Maple提供的各种指令来求解. 下面一个例子是关于函数极大极小值的求解问题,此处,图形提供了做题的部分思路,尤其是求驻点时:

> f:=(x+2)/(3+(x^2+1)^3);

f := > plot(f,x=-10..10);

x23(x21)3

从上图可以看出,f(x)函数从区域-2到4之间有极值出现,且极大值小于1. 为了更清楚的了解函数图像性质,我们在plot命令中加入因变量y的变化范围。由此可看出f(x)与x轴有交点,且在-2附近有一极小值:

> plot(f,x=-10..10,y=-0.005..0.005);

- 16 -

进一步应用导数性质求解该问题: > d:=diff(f,x);

d := > simplify(d);

13(x21)36(x2)(x21)x(3(x1))2322

45x69x43x212x524x312x(4x63x43x2)2

由图形可见,极值“可能”出现在x=-2和x=0附近,可用下述语句求出确切极点,然后使用eval命令求出相应的极值:

> xmin:=fsolve(d=0,{x=-2});

xmin := {x-2.485165927}

> xmax:=fsolve(d=0,{x=0});

xmax := {x.2700964050}

> Digits:=4:

> Xmin:=eval(f,xmin);

Xmin := -.001302

> Xmax:=eval(f,xmax);

Xmax := .5360

2.3.2 条件极值

有时候, 我们还会遇到在条件q(x,y)0下计算函数f(x,y)的极大值和极小值, 这就是条件极值. 在求解时需要先构造一个函数g(x,y)f(x,y)q(x,y)(称为拉格朗日乘子), 然后将g(x,y)分别对x和y求导,得到联立方程组, 求解方程组即可得到函数f(x,y)的极大值和极小值.

下面求解f(x,y)xy在条件q(x,y)xy2x2y1下的极大值和极小值. > f:=x^2+y^2:

> q:=x^2+y^2+2*x-2*y+1: > g:=f+mu*q;

2222g := x2y2(x2y22x2y1)

- 17 -

> exp1:=diff(g,x); exp2:=diff(g,y);

exp1 := 2x(2x2) exp2 := 2y(2y2)

> exp3:=solve({q=0,exp1,exp2},{x,y,mu});

exp3 := {yRootOf(2_Z24_Z1),xRootOf(2_Z24_Z1),12RootOf(2_Z24_Z1)}

> allvalues(exp3);

{y111112,12,x12},{12,y12,x12}2222

> subs({x=-1-1/2*2^(1/2),y=1+1/2*2^(1/2)},f):

> fmax:=evalf(%);

fmax := 5.828427124

> subs({x=-1+1/2*2^(1/2),y=1-1/2*2^(1/2)},f): > fmin:=evalf(%);

fmin := .1715728755

3 积分运算

3.1 不定积分

Maple有许多内建的积分算法, 一般地, 用int求不定积分. 命令格式为: int(expr,x);

> Int(x^2*arctan(x)/(1+x^2),x)=int(x^2*arctan(x)/(1+x^2),x);

x2arctan(x)111ln(1Ix)1ln(1Ix)21Ixln(1Ix)1ln(1x2)dxln(1Ix)2Ix2Iln(1Ix)1x282822

> int(x/(x^3-1),x);

1111ln(x1)ln(1xx2)3arctan(2x1)3 3633> int(exp(-x^2),x);

1erf(x) 2> Int(ln(x+sqrt(1+x^2)),x);

ln(x1x2)dx > value(%)+c;

ln(x1x2)x1x2c

> int(exp(-x^2)*ln(x),x);

(x2)eln(x)dx 可以看出, Maple求不定积分的结果中没有积分常数, 这一点需要注意. 但是, 这有一定好处的, 尤其当对结果作进一步处理时, 由于Maple符号计算的特点, 引入积分常数相当于引入一个变量, 对于计算极为不便. Maple中不定积分的计算过程为:

- 18 -

(i) 首先, Maple用传统方法处理一些特殊的形式, 如多项式、有理式、形如

abxcx和

2nQ(x)abxcx2P(x)P(x)的根式, 以及形如Pn(x)lnx或Q·ln 的表达式;

(x)Q(x)n1212(ii) 如果传统方法难以奏效, Maple将应用Risch-Norman算法, 以避免在包含三角函数和双曲函数

的积分中引入复指数和对数;

(iii) 如果仍然无法得到答案, Maple将采用Risch算法, 这将无法避免地在结果表达式中引入有关积分变量的RootOf的表达式;

(iv) 如果最终还是没有找到解析表达式, Maple会把积分式作为结果返回.

3.2 定积分

定积分与不定积分的计算几乎一样, 只是多了一个表示积分区域的参数. 在[a,b]上求f的定积分的命令格式为:

int(f, x=a..b);

> Int(1/(1+x^2),x=-1..1)=int(1/(1+x^2),x=-1..1);

11dx 221x-1 抛物线y2px与x2py所围图形的面积计算过程如下: > assume(p>0);

> int(sqrt(2*p*x)-x^2/(2*p),x=0..2*p);

22142p 33.3 其它积分方法

换元积分法和分部积分法

换元积分法是积分计算中一种重要而实用的方法. 在Maple中, 对被积函数施行变量代换的命令是changevar, 该命令在工具包student中, 须先调用student工具包. 命令格式为:

changevar(s, f); changevar(s, f, u); changevar(t, g ,v);

其中, s是形式为h(x)=g(u)的一个将x定义为u的函数的表达式, f为积分表达式(如Int(F(x),x=a..b);), u为新的积分变量名称, t为定义的多元变量代换的方程组, g为二重或者三重积分, v为新变量的列表.

Changevar函数对积分、求和或者极限实现变量代换. 第1个参数s是用旧变量定义新变量的一个方程, 如果包含了两个以上的变量, 新变量必须放置在第3个参数位置, 而第2个参数是一个要被替换的表达式, 一般包含Int, Sum或者Limit等非求值形式(应尽量使用这种形式以便最后用value求值).

当问题为二重或三重积分时, 定义多元变量代换的方程由一个集合给出, 而新变量由一个列表给出. > with(student):

> changevar(cos(x)+1=u,Int((cos(x)+1)^3*sin(x),x),u);

u3du > changevar(x=sin(u),Int(sqrt(1-x^2),x=a..b),u);

- 19 -

21sin(u)cos(u)du arcsin(a)arcsin(b)> changevar({x=r*cos(t),y=r*sin(t)},Doubleint(1,x,y),[t,r]);

rdtdr

分部积分法(integration by parts)通过调用student工具包中的intparts来完成: > with(student):

> int(x*exp(-a^2*x^2)*erf(b*x),x);

(a2x2)xeerf(bx)dx > intparts(%,erf(b*x));

22(ax)2222(bx)(ax)ebedx 2a> value(%);

1erf(bx)e2a21erf(bx)e2a222(ax)1berf(b2a2x)2 a2b2a23.4 重积分和线积分

在Maple中, 重积分的形式函数有Doubleint(二重)和Trippleint(三重), 均在student工具包中, 应用前需调用student工具包, 它们适用于定积分和不定积分, 可用value来获得积分结果的解析表达式. 命令格式为:

Doubleint(g, x, y);

Doubleint(g, x, y, Domain); Doubleint(g, x = a..b , y = c..d ); Tripleint(g, x, y, z)

Tripleint(g, x, y, z, Domain)

Tripleint(g, x = a..b, z = e..f, y = c..d )

其中, g为积分表达式, x, y, z为积分变量, Domain为积分区域. > with(student):

> Doubleint(f(x,y),x,y);

f(x,y)dxdy 比较以下两个实验:

> Doubleint(x+y,x=0..1,y=1..exp(x)): %=value(%);

2xydxdy1ex11(ex)2210ex1

> Doubleint(x+y,y=1..exp(x),x=0..1):

%=value(%);

- 20 -

xydydx11(e)2 44013.5 利用辅助手段积分

机器终归是机器, 再聪明的机器也无法彻底代替人脑, Maple也一样, 它只能作为我们数学计算、推

证的助手. 下面通过例子来体会Maple的真正用处.

例: 求广义积分

1ex0ecx2dx, 其中c>0.

按照常规, 我们会通过下面的语句进行计算:

> Int(exp(-c*x^2), x=0..infinity) = int(exp(-c*x^2), x=0..infinity);

但Maple告诉我们, 由于无法确定常数c的正负号, 因而无法确定积分是否收敛. 解决这一问题的办法是, 通过assume设定c的取值范围: > assume(c>0);

> Int(exp(-c*x^2),x=0..infinity)=int(exp(-c*x^2),x=0..infinity);

1(c~x2)edx20 c~解决这一问题的另一方法是假设c是另一个参数p的绝对值(c:=abs(p)), 这样c就自然是一个非负的参数了.

> with(student):

> int(x*exp(-a^2*x^2)*erf(b*x),x);

(a2x2)xeerf(bx)dx > intparts(%,erf(b*x));

22(ax)2222(bx)(ax)ebedx 2a> value(%);

1erf(bx)e2a21erf(bx)e2a222(ax)1berf(b2a2x)2 a2b2a22其中, erf(x)为误差函数(error function), 定义为: erf(x)x0edt.

t24 级 数

4.1 数值级数和函数项级数求和以及审敛法

我们可以用Maple中的函数sum方便地求得级数的和, 无论是有限项还是无穷项, 常数项级数还是函数项级数. 相应地, 和式的形式函数是Sum. 求连乘积使用命令product. > Sum(1/(4*k^2-1), k=1..infinity)= sum(1/(4*k^2-1), k=1..infinity);

- 21 -

k111

4k212> Sum(i^2,i=1..n)=sum(i^2,i=1..n);

1111232i(n1)(n1)n 3266i1> Product(1/k^2,k=1..n)=product(1/k^2,k=1..n);

nnk111 22k(n1)Maple对级数求和的方法如下: (i) 多项式级数求和用贝努利级数公式:

mkmk0n11km1k, 其中, 贝努利数Bk由以下隐Cm1Bknm1式递推公式定义: B01,Ck0km1Bk0

(ii) 有理函数级数求和是用Moenck方法, 得到的结果是一个有理函数加伽玛函数(Polygamma function)及其导数的项;

(iii) Gosper 算法是Risch算法的离散形式, 它被用到求包含级乘和乘幂的级数和上; (iv) 计算无穷项级数的和有时会用到超比级数.

收敛或发散是级数的重要性质, 在这里主要以绝对收敛的比值审敛法(ratio test for absolute convergence)为例说明Maple的使用, 其余类推.

绝对收敛的比值审敛法的数学原理是:

ak为不含0的交错级数, 并令limkak1ak, 则:

1) 若<0, 级数绝对收敛;

2) 若>0或=, 级数发散; 3) 若=1, 待定

(1)k2k例: 判定级数是否绝对收敛.

k!k1> f:=k->(-1)^k*12^k/(k!);

(-1)k12kf := k k!> r:=simplify(abs(f(k+1))/abs(f(k)));

r := 12> Limit(r,k=infinity);

k1 k11 k1lim12> value(%);

- 22 -

0

4.2 幂级数

幂级数的有关计算在专门的工具包powseries中, 这个工具包含有生成和处理幂级数的各种常用工具. 如果我们已知一个幂级数的系数, 就可以用函数powcreate来生成它, 其参数是系数所满足的方程或方程组, 格式为:

> with(powseries);

> powcreate(t(n)=3^sqrt(n));

没有任何结果显示出来, 事实上, 此时, Maple已经按照要求把该幂级数的系数函数赋给了t(n), 用下述命令即可看出:

> t(2); 3(2)

显然, 这样的级数很不直观, 更多的时候我们需要幂级数的截断表达式(truncated power series form), 此时可以通过该工具包中的tpsform命令完成,这是一个很有用的Maple函数: > tpsform(t,x,8);

13x3(2)x23(3)x33(4)x43(5)x53(6)x63(7)x7O(x8)

但是, 大多数情况下, 我们并不知道幂级数的系数, 而只知道幂级数的和的解析表达式, 需要把它展开成和式. 对于一些常用的函数, powseries工具包中有一些函数可以生成对应的幂级数, 比如sin(p)、cos(p)、exp(p)、ln(p)、sqrt(p)的幂级数可以分别通过powsin(p)、powcos(p)、powexp(p)、powlog(p)、powsqrt(p)来得到, 其中, p可以是单变量函数或表达式甚至级数. > t:=powlog(1+x+x^2): tpsform(t,x,6);

1211xx2x3x4x5O(x6)

2345对于多项式, 可以用powpoly(expr, x) 得到对应的幂级数, 其中expr是多项式, x是变量. 而任意函

数的表达式可以通过函数evalpow来获得其幂级数形式. > t:=evalpow(1/(1-3*x+2*x^2)): > tpsform(t,x,6);

13x7x215x331x463x5O(x6)

掌握了级数的有关生成后, 可以对这些级数进行运算了, powseries工具包中具有对幂级数的各种运算: 加(powadd)、减(subtract)、乘(multiply)、除(quotient)、求负(negative)、求倒数(inverse)、复合(compose)、求逆(reversion)、求导(powdiff)、积分(powint)等. 下面通过实例学习这些运算. > restart:with(powseries):

powcreate(t(n)=t(n-1)/n,t(0)=1): powcreate(v(n)=v(n-1)/2,v(0)=1):

s:= powadd(t, v): tpsform(s, x, 7);

33751954962xx2x3x4xxO(x7)

2424484802880> p:=multiply(t,v): tpsform(p,x,7);

35197109533161xx2x3x4xxO(x7)

24241648028804.3 泰勒级数和劳朗级数

在Maple中, 可以用命令taylor方便快捷地得到一个函数或表达式在一点的任意阶Tayloe展开式,

而一般级数展开命令为series. 命令格式为:

- 23 -

taylor(expr,eqn/nm,n); series(expr, eqn, n);

其中, expr表示表达式, eqn/nm表示方程(如x=a)或名称(如x), n(非负整数)表示展开阶数.

在调用taylor或series级数时, 只需要指定有待展开的表达式、展开点、展开的阶数就可以了. 如果不给定展开点, 默认为0点, 如果不指定展开阶数时默认为6阶(命令order可获取截断级数的展开阶数). 另外, series函数可以展开更一般的截断函数, 比如laurent级数等, 它会根据情况决定展开成什么类型级数.

> taylor(sin(tan(x))-tan(sin(x)),x=0,19);

1299191311951331114886915x7xxxxO(x17) 3075675600739254486432000> series(GAMMA(x),x=0,3);

12121(3)1213x2O(x3) x-1x1232126> order(%);

3

5 积分变换

无论在数学理论研究还是在数学应用中,积分变换都是一种非常有用的工具. 积分变换就是将一个函数通过参变量积分变为另一个函数. 常用的积分变换包括拉普拉斯变换(Laplace transforms)、傅里叶变换(Fourier transforms)、梅林变换(Melin transforms)以及汉克尔变换(Hankel transforms)等. 函数f的积分变换的定义如下:

T(f)(s)f(t)K(s,t)dt

ab其中K为变换核. 具体如下: 变换名称 拉普拉斯 傅 里 叶 梅 林 定 义 变换命令 laplace(f(t), t, s) fourier(f(t), t,s) melin(f(t), t,s) 逆变换命令 invlaplace(f(t), t, s) invfourier(f(t), t,s) invmelin(f(t), t,s) 0f(t)estdt f(t)eistdt f(t)es1dt 0

这些函数都在inttrans工具包中, 使用时用with引入.

三 线性代数

1多项式

1.1 多项式生成及类型测试

> p2:=3*x*y^2*z^3+2*sqrt(-1)*x^2*y*z+2002;

p2 := 3xy2z32Ix2yz2002

- 24 -

函数randpoly生成随机多项式, 生成一个关于vars的随机多项式的格式如下: randpoly(vars, opts);

其中, vars表示变量或者变量列表或集合, opts为可选项方程或者指定属性的名称. 如: > randpoly(x); #随机生成关于x的5次(默认)多项式

42x588x476x365x225x28

用type命令可以测试多项式的类型:

> type(p1, polynom(integer, x)); #测试p1是否是一个关于x的整系数多项式

true

1.2 提取多项式系数

coeff函数用来提取一元多项式的系数, 而多元多项式所有系数的提取用命令coeffs, 指定系数的提取用命令coftayl.

(1) 提取多项式p中x^n的系数使用命令:coeff(p, x^n);或coeff(p, x, n);

(2) 提取多项式p中变量x的所有系数并将相应的x幂存于变量t中:coeffs(p, x, ’t’); (3) 返回expr在x=a处的Taylor展式中(x-a)^k的系数: coeftayl(expr, x=a, k); > p:=2*x^2+3*y^3*x-5*x+68;

p := 2x23y3x5x68

> coeff(p, x);

3y35

> coeff(x^4-5*x^2-sin(a)*(x+1)^2, x^2);

5sin(a)

1.3 多项式的约数和根

1.3.1多项式的最大公约因式(gcd)/最小公倍因式(lcm)

求多项式的最大公约因式/最小公倍因式的命令与求两个整数最大公约数/最小公倍数命令一样, 都是gcd/lcm. 命令格式分别为:

gcd(p1, p2, 't', 's'); lcm(p1, p2, 't', 's');

其中, 第3个参数t赋值为余因子p1/gcd(p1, p2), 第4个参数s赋值为余因子p2/gcd(p1, p2). 1.3.2多项式的平方根(psqrt)和第n次方根(proot)

求多项式p的平方根, 若不是完全平方, 则返回_NOSQRT:psqrt(p);

求多项式p的n次方根, 若不是完全n次方, 则返回_NOROOT:proot(p, n); > p:=x^4+4*x^3+6*x^2+4*x+1;

p := x44x36x24x1

> psqrt(p);

x22x1

> proot(p, 8);

_NOROOT

1.3.3 多项式相除的余式(rem)/商式(quo)

计算p1除以p2的余式, 将商式赋值给q的命令格式为:rem(p1, p2, x, 'q');

- 25 -

计算p1除以p2的商式, 将余式赋值给r的命令格式为:quo(p1, p2, x, 'r');

余式和商式满足:p1=p2*q+r, 其中degree(r, x) rem(x^5+x^3+x, x+1, x, 'q');

-3

> q;

x4x32x22x3

> quo(x^3+x^2+x+1, x-1, x, 'r');

x22x3

> r;

4

1.4 多项式转换及整理

1.4.1 将多项式转换成Horner形式

将多项式poly转换成关于变量var的Horner形式或者嵌套形式的命令格式如下:

convert(poly, horner, var); 1.4.2 将级数转换成多项式形式

将级数(series)转换成多项式(polynom)事实上就是忽略函数的级数展开式中的余项, 其命令格式为: convert(series, polynom);

1.4.3 将级数转换成有理多项式(有理函数)

将级数series(laurent级数或Chebyshev类型级数)转换成有理多项式(有理函数)ratpoly的命令格式为:

convert(series, ratpoly);

1.4.4合并多项式系数(合并同类项)

将多项式具有相同次幂的项的系数合并在一起(包括正的、负的或者分数次幂), 即合并同类项(称为多项式的典范形式), 用命令collect:

collect(p, x);

collect(p, x, form, func); collect(p, x, func);

其中x是表示单变量x或多变量x1, x2, …, xn的一个列表或集合. >collect(x*(x+1)+y*(x+1), x);

x2(1y)xy

> collect(x*(x+1)+y*(x+1), y);

x(x1)y(x1)

1.4.5 将多项式(或者值的列表)排序

将多项式(或者值的列表)按升(或降)序次方排序时作命令sort. 命令格式: sort(L); sort(L, F); sort(A); sort(A, V);

其中, L—表示要排序的列表; F(可选项)—带两个参数的布尔函数; A—代数表达式; V(可选项)—变量

- 26 -

1.4.6 多项式的因式分解

一般情况下, 计算带有整数、有理数、复数或代数数系数的多项式的因式分解使用命令factor, 命令格式为:

factor(expr, K);

其中, expr为多项式, K为因式分解所在的区域 > factor(x^3+y^3);

(xy)(x2xyy2)

> factor(t^6-1, (-3)^(1/2));

1(2t1-3)(2t1-3)(2t1-3)(2t1-3)(t1)(t1) 161.5 多项式运算

1.5.1 多项式的判别式

多项式判别式在多项式求根中具有重要作用, 例如二次多项式的判别式. 求多项式p关于变量x的判别式的命令格式为:

discrim(p, x); > p1:=a*x^2+b*x+c;

p1 := ax2bxc

> discrim(p1, x);

4acb2

1.5.2 多项式的范数

计算关于变元v的多项式p的第n阶范数用命令norm, 格式如下: norm(p, n, v);

其中p是展开的多项式, n为实常数或无穷大. 对于n≥1, 范数norm定义为norm(p, n, v)=sum(abs(c)^n), c=[coeffs(p, v)]^(1/n). > norm(x^3+x^2+x+1, 1);

4

1.5.3 bernoulli数及多项式

bernoulli函数计算第n阶bernoulli数和关于表达式x的第n阶bernoulli多项式bernoulli(n, x), bernoulli(n, x)通过指数生成函数定义为:

textbernoulli(n,x)nt te1n0n!第n阶bernoulli数定义为:bernoulli(n)= bernoulli(n, 0)

1.5.4 用Bernstein多项式近似一个函数

在Maple中, 在[0, 1]区间上近似等于函数f(x)的关于x的n次方的Bernstein多项的操作命令是: bernstein(n, f, x);

其中, f必须是用一个程序或者操作符指定的单变量函数.

1.6 有理式

所谓有理式, 是指可以表示成f/g形式的式子, 其中f与g均为多项式, 且g0. 1.6.1获取表达式的分子/分母

对于一个有理式x, 可以用numer(x)和denom(x)来获得它的分子(numerator)和分母(denumirator):

- 27 -

> f:=x^2+3*x+2: g:=x^2+5*x+6: h:=f/g;

x23x2h := 2

x5x61.6.2 有理表达式的标准化

需要调用函数normal( ) (也称正则化). > normal(f/g);

x1 x31.6.3 将有理式转换为多项式与真分式和的形式

convert/parfrac可将有理函数 f 分解为多项式与真分式和的形式,这是有理函数积分的基础. 命令格式如下:

convert(f, parfrac, x, K);

其中, f为x的有理函数, x为主变量名称, K为可选参数(实数—real, 复数—complex, 扩展域—a field extended, 真—true, 假—false, 无平方项—sqrfree)等.

2 矩阵基本运算

2.1 数组和向量

在Maple中, 数组(array)由命令array产生, 其下标变量(index)可以自由指定. 下标由1开始的一维数组称为向量(vector), 二维以上的数组称为矩阵(matrix), 因此, 可以说向量与矩阵是数组的特殊形式. 生成数组与向量的命令分别列示如下:

array (m, n); #产生一个下标变量为m到n的一维数组 array (m, n, [a1, a2 .. ak]); #产生一维数组, 并依次填入初值

array ([a1, a2 ..ak]); #产生下标变量为1到k的一维数组, 并依次填入初值 vector(n, [v1, v2, …, vn]); #产生n维向量(n可省略) > A:=array(-1..2);

A := array(-1 .. 2,[])

> A[0]:=12;

A0 := 12

> A[1]:=2*x^2+x+4;

A1 := 2x2x4

> A;

A

2.2 矩阵的建立

在使用Maple进行线性代数运算时, 需要先载入线性代数工具包—linalg, 绝大部分线性代数运算函数都存于该工具包中.

在Maple中, 建立矩阵用matrix命令. 如建立一个m行n列的矩阵的命令格式为: matrix(m,n);

- 28 -

matrix(m,n,init);

其中,init可以有很多种选择,如程序、数组、列表、方程组、代数表达式或者矩阵的初值等。 > with(linalg):

> A:=array([[1,2,3],[4,5,6],[7,8,9]]);

1A := 47> f:=(i,j)->i^2+j^3;

25836 9f := (i,j)i2j3

> B:=matrix(4,5,f);

25B := 101791217242831364365687380126129 134141 而函数diag可以生成块对角阵, band函数可以建立以常数对角元素的带状矩阵:

内建于linalg的另一个有用的命令是从线性方程组中提取系数矩阵或增广矩阵, 实现这一功能的函数是genmatrix, 其命令格式为:

genmatrix(eqns, vars, flag);

> eqns:={x+2*z=a,3*x-5*y=6-z};

eqns := {x2za,3x5y6z}

> A:=genmatrix(eqns,[x,y,z],'flag');

102A := 3-51> B:=genmatrix(eqns,[x,y,z]);

10B := 3-5a 62 1由此例可以看出, 若加参数'flag'则提取增广矩阵, 否则提取系数矩阵, 这一点对于求解线性方程组

很重要.

还有一个有用的命令是随机生成矩阵的函数randmatrix: 同样, 随机生成向量的函数为randvector.

2.3 矩阵的基本运算

矩阵的基本运算命令列于下表, 而矩阵的代数运算最直观的方法莫过于使用函数evalm了, 只要把矩阵的代数计算表达式作为它的参数, 就可以得到结果.

运算 加法 数乘 乘法 逆运算 函数调用 matadd(A, B) scalarmul(A, expr) multiply(A, B, …) inverse(A) - 29 -

等效的运算符运算 evalm(A+B) evalm(A*expr) evalm(A &*B &* …) evalm(1/A)或evalm(A^(-1)) 转置 行列式 秩 迹 > A:=randmatrix(2,2); transpose(A) det(A) rank(A) trace(A) 无 无 无 无 7266A := -29-91

> B:=randmatrix(2,2);

-53-19B := -4768

> matadd(A,B); evalm(A+B);

1947-76-23 值得注意的是, 矩阵乘法运算符“&*”有着和数乘“*”、除法“/”相同的优先级, 在输入表达式时需要注意, 必要时要使用括号, 请看下面实验: > evalm(A&*1/A);

Error, (in evalm/amperstar) &* is reserved for matrix multiplication

> evalm(A&*(1/A));

&*()

上面最后的输出结果表示单位阵.

2.4 矩阵的求值

数组和单个的表达式不同, 具有数组类型的变量不会自动求值, 而需要用eval等函数的显式调用来强制地求值. 作为数组的特例, 矩阵和向量也是一样, 但要让矩阵最终完成求值还需使用函数map, map函数的主要功能是, 对于任意一元函数, 不加任何说明, 就可以作用在整个数组上, 得到的结果是每一个元素分别调用函数所得结果所组成的数组.

> with(linalg):

> Q:=matrix([[cos(alpha), sin(alpha)], [-sin(alpha), cos(alpha)]]);

cos()Q := sin()> alpha:=0;

sin() cos() := 0

> eval(Q);

cos()sin()> map(eval, Q);

sin() cos()01

10 另一个对矩阵中元素变量代换的命令是subs函数(但只能进行一层求值), 例如: > P:=matrix(2, 2, [1, 2, x, x^3]);

- 30 -

1P := x> subs(x=8, eval(P));

2 x3182 5122.5 矩阵分解

矩阵分解在矩阵运算中的作用最明显的一点是可以大幅度提高运算效率. 矩阵分解算法较多,主要有LU分解、QR分解等。 2.5.1 LU分解

LUdecomp(A, P='p', L='l', U='u' , U1='u1', R='r', rank='ran', det='d');

其中, A为矩阵(长方形), P='p'—主元素因子, L='l'—单位下三角因子, U='u'—上三角因子, U1='u1'—修改的U因子, R='r'—行减少因子, rank='ran'—A的秩, det='d'—U1的行列式. 当然, 此命令的简写形式为:LUdecomp(A); 2.5.2 QR分解

在QR分解中, 矩阵A被看作乘积Q•R, 此处, Q为正交或归一化矩阵, R为上三角阵. 该分解是对一系列线性无关向量作Gram-Schmidt正交化, 因此, Q包含了正交的向量, R的列记录了产生原向量的线性组合. 命令格式为:

QRdecomp(A, Q='q', rank='r', fullspan=value);

其中, A为矩阵(长方形), Q='q'—A的Q因子, rank='ran'—A的秩, fullspan=value—在Q中包含空格(true或false).

3 矩阵的初等变换和线性方程组求解

3.1 矩阵的初等变换

行变换 列变换 函数调用 mulrow(A, r, expr) addrow(Ar1, r2, m) swaprow(A, r1, r2) mulcol(A, c, expr) addcol(A, c1, c2) swapcol(A, c1, c2) 对应的初等变换 用标量expr乘以矩阵A的第r行 将矩阵A的第r1行的m倍加到第r2行上 互换矩阵A的第r1行和第r2行 用标量expr乘以矩阵A的第c列 将矩阵A的第c1列的m倍加到第c2列上 互换矩阵A的第c1列和第c2列 矩阵的形状变换, 可以在利用初等变换解决问题时起到辅助作用

函数调用 contat(A, B, …); stackmatrix(A, B, …) row(A, i) col(A, i) row(A, i .. k) 所作的变换或操作 将矩阵A, B, …在水平方向上合并成一个矩阵 将矩阵A, B, …在竖直方向上合并成一个矩阵 取矩阵A的第i行 取矩阵A的第i列 取矩阵A的第i到k行 - 31 -

col(A, i .. k) delrows(A, i .. k) delcols(A, i .. k) extend(A, m, n, x) submatrix(A, m .. n, r .. s) 取矩阵A的第i到k列 删除矩阵A中i到k行剩下的子矩阵 删除矩阵A中i到k列剩下的子矩阵 扩展矩阵m行n列并用x填充 取矩阵A的m到n行、r到s列组成的子矩阵 3.2 线性方程组的解

线性方程组求解常常转化为与其等价的矩阵问题来解决的. Maple中可借助函数genematrix及高斯消去法函数gausselim联合完成:

> eqns:={x+2*y+3*z=a,8*x+9*y+4*z=b,7*x+6*y+5*z=c};

eqns := {x2y3za,8x9y4zb,7x6y5zc}

> A:=genmatrix(eqns,[x,y,z],'flag');

1A := 87> gausselim(%);

296345ab c100> ffgausselim(%%);

2-703-20487ab8a 158cab77无分式高斯消去法(fraction-free Gaussian elimination), 相应的命令为ffgausselim:

1002-703a -20b8a-487c15a8b 在把系数矩阵转化成相应的上三角阵后, 就可以用回代(back substitution)的方法求出各个未知数的

值—backsub: > backsub(%);

7a1b19c,1b1a5c,7c5a1b 16648341248166Maple提供了一个非常好的函数linsolve, 这个函数不仅可以用来求解具有唯一解的线性方程组, 而且可以求解有无穷多解的方程组并给出通解. 试看下面的实验:

x13x23x32x41例:求解线性方程组:2x16x29x35x44

x3x3x13231> A:=matrix([[1, 3, 3, 2], [2, 6, 9, 5], [-1, -3, 3, 0]]);

- 32 -

1A := 2-1> B:=vector([-1, 4, 13]);

36-339325 0B := [-1,4,13]

> linsolve(A, B);

[133_t23_t1,_t2,_t1,63_t1]

可以看到, Maple用辅助变量_t1, _t2给出了方程组的通解.

3.3 最小二乘法求解线性方程解

在实际问题中, 由于误差或者其他各方面的原因, 很容易出现无解的方程组. 这样问题的解决则变成求出一个“最优”的近似解. 在线性代数中, 通常采用最小二乘解(least-squares solution). linalg中对应的函数是leastsqrs, 它有两种调用格式:

leastsqrs(A, b); leastsqrs(S, v);

其中,A为矩阵, b为向量,S为线性方程组, v为变量名。 > with(linalg):

> S:={c[0]+c[1]+c[2]-3, c[0]+2*c[1]+4*c[2]-10, c[0]-9/10, c[0]-c[1]+c[2]-3};

9S := {c0c1c23,c02c14c210,c0c1c23,c0}

10> leastsqrs(S,{c[0],c[1],c[2]});

715991{c1,c0,c2}

200200403.4 正定矩阵

在Maple中, 判断一个矩阵是否是正(负)定矩阵非常简单, 只需要使用命令definite即可, 而且还可求出符号矩阵的正(负)定条件: > with(linalg):

> A := matrix(2, 2, [2,1,1,3]);

2A := 1> definite(A, 'positive_def');

1 3true

> B:=array(1..2, 1..2, 'symmetric'):

definite(B, 'negative_semidef');

B1,10 and B1,1B2,2B1,20 and B2,20

由上述实验可以看出, definite的第1个参数是需要判定的矩阵, 第2个参数是矩阵的正定性, 共有4种情况:'positive_def'(正定)、'positive_semidef'(半正定)、'negative_def'(负定)、'negative_semidef'(半负定). 当判定数值矩阵时, 返回布尔值true/ false; 判定符号矩阵时, 它返回一个布尔表达式, 表示正负定的条件.

- 33 -

24 特征值、特征向量和矩阵的相似

4.1 矩阵的相似

在Maple中可以利用linalg中的issimilar判断两个矩阵是否相似. 命令格式如下: issimilar(A, B, 'P');

其中A, B为方阵, P为转换矩阵(可选). 如果A, B相似, 则返回true, 否则返回false. > with(linalg): > A:=matrix(2, 2);

A := array(1 .. 2,1 .. 2,[])

> B:=matrix(2, 2);

B := array(1 .. 2,1 .. 2,[])

> issimilar(A&*B, B&*A);

true

4.2 特征值和特征向量

在Maple中求解特征矩阵(characteristic matrix)和特征多项式(characteristic polynomial)的函数分别是charmat和charpoly, 求解相应的特征值和特征向量的函数分别是eigenvalues(eigenvals)和eigenvectors. 命令格式如下:

charmat(A, lambda); charpoly(A, lambda); eigenvalues(A); eigenvectors(A);

下面通过几个实例学习上述4个函数的用法: > charmat(A, lambda);

1-2-2> charpoly(A, lambda);

-21-2-2-2

133295

> eigenvals(A);

5,-1,-1

> eigenvectors(A);

[-1,2,{[-1,1,0],[-1,0,1]}],[5,1,{[1,1,1]}]

可以看到, 特征向量函数eigenvectors在给出特征向量的时候, 还给出了特征值及特征值重数. 一般

情况下, 如果同时需要得到特征值和特征向量用eigenvectors函数即可. 另外, 这个函数还可处理符号矩阵, 此时, 通常以根式的形式给出结果, 如果加上可选参数'implicit', 结果就以RootOf的形式给出.

- 34 -

四 方程求解

1 代数方程(组)求解

1.1 常用求解工具—solve

求解代数方程或代数方程组, 使用Maple中的solve函数. 求解关于x的方程eqn=0的命令格式为: solve(eqn, x);

求解关于变量组vars的方程组eqns的命令为: solve(eqns, vars);

> eqn:=(x^2+x+2)*(x-1);

eqn := (x2x2)(x1)

> solve(eqn,x);

11111,I7,I7

2222当然, solve也可以求解含有未知参数的方程:

> eqn:=2*x^2-5*a*x=1;

eqn := 2x25ax1

> solve(eqn,x);

5151a25a28,a25a28 4444很多情况下, 我们知道一类方程或方程组有解, 但却没有解决这类方程的一般解法, 或者说没有解

析解. 比如, 一般的五次或五次以上的多项式, 其解不能写成解析表达式. Maple具备用所有一般算法尝试所遇到的问题, 在找不到解的时候, Maple会用RootOf给出形式解. > x^7-2*x^6-4*x^5-x^3+x^2+6*x+4;

x72x64x5x3x26x4

> solve(%);

15,15,RootOf(_Z5_Z1,index1),RootOf(_Z5_Z1,index2),RootOf(_Z5_Z1,index3),RootOf(_Z5_Z1,index4),RootOf(_Z5_Z1,index5)

> solve(cos(x)=x,x);

RootOf(_Zcos(_Z))

对于方程组解的个数可用nops命令获得, 如: > eqns:={seq(x[i]^2=x[i],i=1..7)};

eqns := {x1x1,x2x2,x3x3,x4x4,x5x5,x6x6,x7x7}

> nops({solve(eqns)});

2222222128

但是, 有时候, Maple甚至对一些“显而易见”的结果置之不理, 如: > solve(sin(x)=3*x/Pi,x);

RootOf(3_Zsin(_Z))

- 35 -

此方程的解为, 0, 但Maple却对这个超越方程无能为力, 即便使用allvalues求解也只有下述6结果:

> allvalues(%);

RootOf(3_Zsin(_Z),0.)

另外一个问题是, Maple在求解方程之前,会对所有的方程或表达式进行化简, 而不管表达式的类型, 由此而产生一些低级的错误: > (x-1)^2/(x^2-1);

(x1)2 2x1> solve(%);

1

但是, 大量实验表明, solve的确是一个实用的方程求解工具, 但是也不可盲目相信它给出的一切结果, 特别是对于非线性方程而言, 对于给出的结果需要加以验证.

下面通过几个例子说明在Maple中非线性方程组的求解问题.

x2y225例:求解方程组:2

x9y> eqns:={x^2+y^2=25,y=x^2-5};

eqns := {yx25,x2y225}

> vars:={x,y};

vars := {x,y}

> solve(eqns,vars);

{x0,y-5},{x0,y-5},{y4,x3},{y4,x-3}

也可用下面的语句一步求出:

> solve({x^2+y^2=25,y=x^2-5},{x,y});

{x0,y-5},{x0,y-5},{y4,x3},{y4,x-3}

这个问题非常简单, 但通常遇到的非线性问题却不是这么简单, 例如要求解方程组:

x2y21,xyxy

> eqns:={x^2+y^2=1,sqrt(x+y)=x-y}; vars:={x,y};

eqns := {x2y21,xyxy}

vars := {x,y}

> sols:=solve(eqns,vars);

sols := {yRootOf(2_Z24_Z3,-1.000000000.7071067812I),xRootOf(2_Z24_Z3,-1.000000000.7071067812I)2},{x1,y0}

可以看出, 方程解的形式是以集合的序列给出的, 序列中的每一个集合是方程的一组解, 这样就很

利于我们用subs把解代入原方程组进行检验:

- 36 -

> subs(sols[2],eqns);

{11}

> sols2:=allvalues(sols[1]);

11sols2 := {x1I2,y1I2}

22> simplify(subs(sols2,eqns));

{I2I2,11}

1.2 其他求解工具

1.2.1 数值求解

对于求代数方程的数值解问题, Maple提供了函数fsolve, fsolve的使用方法和solve很相似: fsolve(eqns, vars, options);

其中, eqns表示一个方程、方程组或者一个程序, vars表示一个未知量或者未知量集合, options控制解的参数(诸如:complex: 复根; maxsols=n:只找到n阶最小根; intervals:在给定闭区间内求根, 等). > fsolve(x^5-x+1,x);

-1.167303978

> fsolve(x^5-x+1,x,complex);

-1.167303978,-.18123244451.083954101I,-.18123244451.083954101I,.7648844336.3524715460I,.7648844336.3524715460I

> fsolve(x^3-3*x+1,x,0..1);

.3472963553

对于多项式方程, fsolve在默认情况下以给出所有的实数解, 如果附加参数complex, 就可以给出所有的解. 但对于更一般的其他形式的方程, fsolve却往往只满足于得到一个解: > eqn:=sin(x)=x/2;

1eqn := sin(x)x

2> fsolve(eqn);

0.

> fsolve(eqn,x,0.1..infinity);

1.895494267

> fsolve(eqn,x,-infinity..-0.1);

-1.895494267

1.2.2 整数环中的方程(组)求解

利用Maple中的函数msolve(eqns, vars, n), 可以在模n的整数环中求解方程(组)eqns.

例:在Z7中求解Pell方程yx28 > msolve(y^7=x^3-28,7);

73{x3,y6},{x4,y1},{y0,x0},{x1,y1},{y6,x6}, {x2,y1},{y6,x5}1.2.3 递归方程的求解

在Maple中, 可以求解有限差分方程(也称递归方程), 所需调用的函数是rsolve, 该函数使用的是一些比较通用的方法, 例如产生函数法、z变换法以及一些基于变量替换和特征方程的方法. 作为例子, 求

- 37 -

解Fibonacci多项式:

> eq:=f(n)=f(n-1)+2*f(n-2);

eq := f(n)f(n1)2f(n2)

> rsolve({eq,f(0)=1,f(1)=1},f(n));

12(-1)n2n 331.2.4 不等式(组)求解

求解一元不等式方程(组)使用命令solve: > solve((x-1)*(x-2)*(x-3)<0,x);

RealRange(,Open(1)),RealRange(Open(2),Open(3))

> solve((x-1+a)*(x-2+a)*(x-3+a) < 0, {x});

{x1a},{2ax,x3a}

> solve(exp(x)>x+1);

RealRange(,Open(0)),RealRange(Open(0),)

> solve({x^2*y^2=0,x-y=1,x<>0});

{y0,x1},{y0,x1}

对于由不等式方程组约束的最优问题的求解使用“线性规则”工具包simplex: > with(simplex):

> cnsts:={3*x+4*y-3*z<=23, 5*x-4*y-3*z<=10,7*x+4*y+11*z<=30};

cnsts := {3x4y3z23,5x4y3z10,7x4y11z30}

> obj:=-x+y+2*z;

obj := xy2z

> maximize(obj,cnsts union {x>=0,y>=0,z>=0});

149{z,y,x0}

282 常微分方程求解

帮助处理常微分方程(组)的各类函数存于Detools软件包

2.1 常微分方程的解析解

求解常微分方程最简单的方法是利用求解函数dsolve. 命令格式为:

dsolve(ODE);

dsolve(ODE, y(x), extra_args);

dsolve({ODE, ICs}, y(x), extra_args);

dsolve({sysODE, ICs}, {funcs}, extra_args);

其中, ODE—常微分方程, y(x)—单变量的任意变量函数, Ics—初始条件, {sysODE}—ODE方程组的集合, {funcs}—变量函数的集合, extra_args—依赖于要求解的问题类型.

例如, 对于一阶常微分方程xyyln(xy)y可用dsolve直接求得解析解: > ODE:=x*diff(y(x),x)=y(x)*ln(x*y(x))-y(x);

- 38 -

y(x)ln(xy(x))y(x) ODE := xy(x)x> dsolve(ODE,y(x));

y(x)ex_C1x

可以看出, dsolve的第一个参数是待求的微分方程, 第二个参数是未知函数. 需要注意的是, 无论在

方程中还是作为第二个参数, 未知函数必须用函数的形式给出(即:必须加括号, 并在其中明确自变量), 这一规定是必须的, 否则Maple将无法区分方程中的函数、自变量和参变量, 这一点和我们平时的书写习惯不一致. 为了使其与我们的习惯一致, 可用alias将函数用别称表示: > alias(y=y(x));

> ODE:=x*diff(y,x)=y*ln(x*y)-y;

ODE := xxyyln(xy)y

> dsolve(ODE,y);

x_C1yex

函数dsolve给出的是微分方程的通解, 其中的任意常数是用下划线起始的内部变量表示的.

在Maple中, 微分方程的解是很容易验证的, 只需要将解代入到原方程并化简就可以了. > subs(%,ODE);

_C1_C1_C1_C1eelneex xxxx> assume(x,real): assume(_C1,real): > simplify(%);

xxxx> evalb(%);

ex~_C1~(x~_C1~)ex~_C1~true

x~_C1~(x~_C1~)

x~_C1~evalb函数的目的是对一个包含关系型运算符的表达式使用三值逻辑系统求值, 返回的值是true, false和FAIL. 如果无法求值, 则返回一个未求值的表达式. 通常包含关系型运算符“=, <>, <, <=, >, >=”的表达式在Maple中看作是代数方程或者不等式. 然而, 作为参数传递给evalb或者出现在if或while语句的逻辑表达式中时, 它们会被求值为true或false. 值得注意的是, evalb不化简表达式, 因此在使用evalb之前应将表达式化简, 否则可能会出错.

再看下面常微分方程的求解:yy21

> alias(y=y(x)):

> ODE:=diff(y,x)=sqrt(y^2+1);

ODE := yy21

x> dsolve(ODE,y);

ysinh(x_C1)

- 39 -

函数dsolve对于求解含有未知参变量的常微分方程也完全可以胜任: > alias(y=y(x)):

> ODE:=diff(y,x)=-y/sqrt(a^2-y^2);

ODE := yx> sol:=dsolve(ODE,y);

yay22

2a22a2alny22sol := xaya22a2y2_C10

由此可见, 对于不能表示成显式结果的微分方程解, Maple尽可能将结果表示成隐式解. 另外, 对于平凡解y=0常常忽略, 这一点应该引起注意.

dsolve对于求解微分方程初值问题也十分方便的: > ODE:=diff(u(t),t$2)+omega^2*u(t)=0;

2u(t)0 ODE := u(t)t2> dsolve({ODE,u(0)=u0,D(u)(0)=v0},u(t));

2u(t)v0sin(t)u0cos(t) 2.2 利用积分变换求解微分方程

对于特殊的微分方程, 我们还可以指定dsolve利用积分变换方法求解, 只需要在dsolve中加入可选参数method=transform即可. 其中transform是积分变换, 可以是laplace、fourier、fouriercos或者fouriersin变换.

作为例子, 我们来看一个具有阻尼的振子在阶跃冲击(Heaviside函数)下的响应: >

ODE:=diff(u(t),t$2)+2*d*omega*diff(u(t),t)+omega^2*u(t)=Heaviside(t);

2dODE := u(t)t22u(t)2u(t)Heaviside(t) t> initvals:=(u(0)=u[0],D(u)(0)=v[0]);

initvals := u(0)u0,D(u)(0)v0

> solution:=dsolve({ODE,initvals},u(t),method=laplace);

21(td)(u01)cosh(tesolution := u(t)d222)(v0d2u0d)sinh(td222d222)

(t)2(2t)11(t)u(t)eHeaviside(t)etHeaviside(t)etHeaviside(t)eHeaviside(t)362

2.3 常微分方程组的求解

函数dsolve不仅可以用来求解单个常微分方程, 也可以求解联立的常微分方程组. 特别是对于线性

微分方程组, 由于数学上具有成熟的理论, Maple的求解也是得心应手. 其命令格式为:

- 40 -

dsolve( {eqn1, eqn2, …, ini_conds}, {vars}); 其中, ini_conds是初始条件.

> eqn1:={diff(x(t),t)=x(t)+y(t),diff(y(t),t)=y(t)-x(t)};

x(t)x(t)y(t),y(t)y(t)x(t)} tt> dsolve(eqn1,{x(t),y(t)});

eqn1 := {{x(t)et(_C1sin(t)_C2cos(t)),y(t)et(_C1cos(t)_C2sin(t))}

> eqn2:=2*diff(x(t),t$2)+2*x(t)+y(t)=2*t;

2x(t)y(t)2t eqn2 := 2x(t)t2> eqn3:=diff(y(t),t$2)+2*x(t)+y(t)=t^2+1;

222x(t)y(t)t21 eqn3 := y(t)2tdsolve({eqn2, qn3, x(0)=0, D(x)(0)=1, y(0)=0, D(y)(0)=0},

{x(t),y(t)} );

1113{x(t)sin(2t)2t3t4t,81248411121314 y(t)sin(2t)2tttt}422624>

五 Maple图形绘制

1 二维图形制作

Maple所提供的二维绘图指令plot可以绘制二维的函数图、参数图、极坐标图、等高线图、不等式图,等等. 这些绘图指令有些已经内嵌在其核心程序里, Maple启动时即被装入,直接调用函数命令即可,有些则需要使用with(plots)调用plots函数库才能完成.

1.1 基本二维绘图指令

plot (f(x), x=xmin .. xmax); plot (f(x), x=xmin .. xmax, y=ymin .. ymax); plot ([f1(x), f2(x), …], x=xmin .. xmax); plot (f(x), x=xmin .. xmax, option);

其中,xmin..xmax为x的变化范围,ymin..ymax为y(即f(x))的变化范围. option选项参数主要有: axes:设定坐标轴的显示方式, 一般有FRAME(坐标轴在图形的左边与下面)、BOXED(坐标轴围绕

图形)、NORMAL(一般方式显示)或NONE(无)

- 41 -

color:设定图形所要涂的颜色(可选用也可自设)

coords:指定绘图时所用的坐标系(笛卡尔坐标系(cartesian,默认)、极坐标系(polar)、双极坐标系

(bipolar)、logarthmic(对数坐标系)等

discont:设定函数在不是否用线段连接起来(discont=true则不连接, 默认是discont=false) labels:设定坐标轴的名称(labels=[x, y], x与y分别为x与y坐标轴的名称)

linestyle:设定所绘线条的线型(linestyle=n, n为1是实线, 2为点, 3为虚线, 4为虚线与点交错) numpoints:设定产生一个函数图形所需的最少样点

scaling:设置x与y轴的比例(unconstrained非约束,constrained约束,比例为1:1)

style:设定图形的显示样式(LINE(线形)、POINT(点)、PATCH(显示多边形与边线)、

PATCHNOGRID(只显示色彩而无边界)

symbol:设定点的格式(主要有BOX(方块)、CROSS(十字)、CIRCLE(圆形)、POINT(点)、DIAMOND(菱

形)等几项)

thickness:设定线条的粗细(0、1、2、3几种参数, 数值越大线条越粗)

tickmarks:设定坐标轴刻度的数目(设定tickmarks=[m, n], 则x轴刻度为m, y轴为n) title:定义图形的标题(要用\" \"把标题引起来)

view:设定屏幕上图形显示的最大坐标和最小坐标,缺省是整个曲线 下面通过一些实例学习:

> plot(1/(2*sin(x)),x=-10..10,y=-30..30);

除了绘制基本的函数图之外, plot还可绘制自定义函数的图形, 也可以同时绘制多个函数图. > f:=x->sin(x)+cos(x)^2; plot(f(x),x=0..16);

> plot([sin(x),sin(x^2),sin(x^3/10)],x=-2*Pi..2*Pi);

利用seq指令产生一个由函数所组成的序列, 并将此函数的序列赋给变量, 然后将函数序列绘于同一张图上.

> f:=x->sin(x)+cos(x);

fs:=seq(f(x)^(n-1)+f(x)^n,n=1..4): plot([fs],x=0..20);

> f:=x->x*ln(x^2):g:=x->ln(x):

- 42 -

plot({f,g},0..2,-1.5..1.5);

也可以直接把seq指令放在plot里来绘出一系列的函数图. > plot([seq(f(x)^(2/n),n=1..3)],x=0..10);

1.2 二维参数绘图

更多情况下,我们无法把隐函数化成显函数的形式, 因而plot指令无法在二维的平面里直接绘图. 但是, 在某些情况下, 我们可以把平面上的曲线f(x, y)化成 x=x(t), y=y(t)的形式, 其中t为参数(parameter). 据此即可绘图, 其命令格式如下:

plot ([x(t), y(t), t=tmin .. tmax]);

plot ([x(t), y(t), t=tmin .. tmax], xmin .. xmax, y=ymin .. ymax); plot ([x(t), y(t), t=tmin .. tmax], scaling=CONSTRAINED);

plot ([[x1(t), y1(t), t1=t1min .. t1max], [x2(t), y2(t), t2=t2min .. t2max],…]); > plot([t*exp(t),t,t=-4..1],x=-0.5..1.5,y=-4..1);

> plot([sin(t),cos(t),t=0..2*Pi]);

> plot([sin(t),cos(t),t=0..2*Pi],scaling=CONSTRAINED);

上述两上语句都是绘制圆的命令, 但由于后者指定的x、y坐标的比例为1:1, 所以才得到了一个真正的圆, 而前者由于比例不同, 则像个椭圆. 下面则是内摆线的图形: > x:=(a,b)->(a-b)*cos(t)+b*cos((a-b)*t/b);

(ab)tx := (a,b)(ab)cos(t)bcos b> y:=(a,b)->(a-b)*sin(t)-b*sin((a-b)*t/b);

(ab)ty := (a,b)(ab)sin(t)bsin b 当a=1, b=0.58时,(x(a,b), y(a,b))图形绘制命令为:

> plot ([x(1,0.58), y(1,0.58), t=0..60*Pi], scaling=CONSTRAINED);

再作a, b取其它值时的情形:

> plot([x(2,1.2),y(2,1.2),t=0..6*Pi],scaling=CONSTRAINED);

> plot([x(2,8),y(2,8),t=0..16*Pi],scaling=CONSTRAINED);

> plot([x(2,12),y(2,12),t=0..16*Pi],scaling=CONSTRAINED);

下面再看同时绘制多个图形的情形.

> plot([[cos(3*t),sin(2*t),t=0..2*Pi],[sin(t),cos(3*t),t=0..2*Pi]]);

- 43 -

1.3 数据点绘图

如果所绘的图形是间断性的数据, 而不是一个连续的函数, 那么我们可以把数据点绘在x-y坐标系中, 这就是所谓的数据点绘图. 其命令格式如下:

plot([[x1, y1], [x2, y2], …], style=point); plot([[x1, y1], [x2, y2], …] );

> data1:=seq([2*n,n^3+1],n=1..10): plot([data1],style=point);

> data2:=seq([n,1+(-1)^n/n],n=1..15):

plot([data2],style=point,view=[0..20,0..2]);

> data3:=seq([t*cos(t/3),t*sin(t/3)],t=1..30): plot([data3],style=point);

2 三维绘图

2.1 基本三维绘图指令

三维空间的绘图比二维空间更有变化性和趣味性, 其命令函数为plot3d, 可直接调用. 命令格式如下:

plot3d(f(x,y), x=xmin .. xmax, y=ymin .. ymax);

plot3d({f(x,y), g(x,y), …}, x=xmin .. xmax, y=ymin .. ymax); plot3d(f(x,y), x=xmin .. xmax, y=ymin .. ymax, options);

其中,xmin..xmax为x的变化范围,ymin..ymax为y(即f(x))的变化范围. Option选项参数与二维时的情形相似,这里只列示新增指令的意义:

cotours:设定等高线的数目或者等高线的值 grid:设定组成曲面的样点数或方形网格的数量

gridstyle:设定网格的形状(rectangular—矩形,triangular—三角形)

orientation:设定观看图形的视角(但设定视角的最佳方式是用鼠标拖动图形) projection:设定投影的模式 shading:设定曲面着色的方式

> plot3d(x*y^2/(x^2+y^4),x=-1..1,y=-1..1,axes=boxed);

> plot3d(x*y/(x^2+y^2+2*x*y),x=-4..4,y=-4..4, axes=BOXED);

> plot3d(sin(x*y),x=-Pi..Pi,y=-Pi..Pi);

> plot3d({2*sin(x)*cos(y),-6*x/(x^2+y^2+1)},x=-4..4,y=-4..4);

> plot3d(sin(z/2), t=0..3*Pi/2, z=-4..4, coords=spherical);

- 44 -

> plot3d(1,t=0..2*Pi,p=0..Pi, coords=spherical, scaling=constrained);

> plot3d(sin(t)*sin(p^2), t=0..Pi, p=0..Pi, coords=spherical, grid=[35,35]);

> plot3d(theta,theta=0..8*Pi,phi=0..Pi, coords=spherical, style=wireframe);

2.2 三维参数绘图

当二元函数无法表示成zf(x,y)时, 有时可以用一组参数方程表示, 关于这类参数方程的Maple作图, 指令如下:

plot3d( [fx, fy, fz], t=tmin .. tmax, u=umin .. umax);

plot3d( [fx, fy, fz], t=tmin .. tmax, u=umin .. umax, options);

> plot3d([sin((x+10)/2),cos(y^3/3),x],x=-4..4,y=1..4);

> plot3d([cosh(u)*cos(v),cosh(u)*sin(v),u],u=-2..2,v=0..2*Pi);

> plot3d([cos(u)*cos(v),cos(u)*sin(v),u^2],u=-2..2,v=0..2*Pi,axes=FRAME);

> plot3d([cos(u)*cos(v),cos(u)*sin(v), sin(u)], u=-1..1, v=0..2*Pi, orientation= [146,21], scaling=CONSTRAINED);

3 特殊作图

3.1 图形的显示与合并

> with(plots):

g1:=plot(cos(x),x=-2*Pi..2*Pi):

g2:=plot(sin(x),x=-2*Pi..2*Pi,thickness=5): display(g1,g2,axes=BOXED);

> g3:=plot3d(2*exp(-sqrt(x^2+y^2)),x=-6..6,y=-6..6):

g4:=plot3d(sin(sqrt(x^2+y^2)),x=-6..6,y=-6..6): display(g3,g4);

3.2 不等式作图

不等式作图基本上有4部分:

① 解区间(feasible region):此区域完全满足所有的不等式; ② 非解区间(excluded region):此区域不完全满足所有不等式; ③ 开线(open lines):不等式的边界, 但不包含此边界; ④ 闭线(closed lines):不等式的边界(包含此边界) > with(plots):

inequal(2*x-5*y<6,x=-3..3,y=-3..3);

- 45 -

> ineqns:={x-y+2>0,2*x+3*y+9>0,8*x+3*y-27<0};

sol:=solve(ineqns,{x,y});

ans:=map(convert,sol,equality);

implicitplot(ans,x=-6..8,y=-10..10);

3.3 空间曲线绘图

> with(plots):

spacecurve([cos(t/2),sin(t/2),t,t=0..68*Pi],numpoints=500);

> spacecurve({[3*cos(t), 3*sin(t), t, t=0..12*Pi], [2+t*cos(t), 2+t*sin(t), t, t=0.. 10*Pi]}, numpoints=200);

> spacecurve({[t*cos(2*Pi*t),t*sin(2*Pi*t),2+t],[2+t,t*

cos(2*Pi*t),t*sin(2*Pi*t)],[t*cos(2*Pi*t),2+t,t*sin (2*Pi*t)]},t=0..10,shading=none,numpoints=500,style= line,axes=boxed);

3.4 隐函数作图

> with(plots):

eqn:=x^2+y^2=1; sol:=solve(eqn,x);

plot([sol],y=-1..1,scaling=constrained);

> implicitplot(eqn,x=-1..1, y=-1..1, scaling=constrained);

> implicitplot((x^2+y)^2=x^2-y^2-1/60, x=-3..3, y=-3..3, grid=[100,100]);

> implicitplot3d(x^3+y^3+z^3+1=(x+y+z+ 1)^3,x=-2..2,y=-2..2,z=-2..2);

>implicitplot3d(r=(1.3)^x*sin(y),x=-1..2*Pi,y=0..Pi,r=0.1..5, coords=spherical);

> p:= proc(x,y,z) if x^23.5 等高线与密度图

> with(plots):

expr:=6*x/(x^2+y^2+1);

plot3d(expr,x=-6..6,y=-6..6,orientation=[-119,37]);

上面是expr的三维图, 试看其密度图(contourplot)、等高线图(densityplot):

- 46 -

> densityplot(expr,x=-6..6,y=-6..6,grid=[60,60],style=patchnogrid,axes=boxed);

> contourplot(expr,x=-6..6,y=-6..6,contours=[-2.7,-2,-1,1,2,2.7],grid=[60,60],thickness=2);

还可以用display将等高线图与密度图绘制在同一张图上: > display(%,%%);

进一步, 还可以为等高线图着色(用filled=true), 并以coloring来指定着色的方向. > contourplot(expr,x=-10..10,y=-6..6,filled=true,grid=[50,50],coloring= [white,red],axes=boxed);

> contourplot3d(expr, x=-6..6, y=-4..4, axes=boxed, orientation=[-124,67], filled=true,coloring=[navy,pink]);

3.6 对数作图

对数作图主要有三种情形:logplot(线性-对数)、loglogplot(对数-对数)、semilogplot (对数-线性). > with(plots):

logplot(x^2-x+4,x=1..12);

> loglogplot(x^2-x+4,x=1..12);

> semilogplot(x^2-x+4,x=1..12);

> loglogplot([cos(2*t)^2+3,sin(t^2)^2+1,t=0..3]);

- 47 -

因篇幅问题不能全部显示,请点此查看更多更全内容

Top