《MATLAB7 基础教程》课件第6章_第1页
《MATLAB7 基础教程》课件第6章_第2页
《MATLAB7 基础教程》课件第6章_第3页
《MATLAB7 基础教程》课件第6章_第4页
《MATLAB7 基础教程》课件第6章_第5页
已阅读5页,还剩164页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

6.1符号对象的创建与使用6.2数学计算功能

6.3表达式的化简和替换

6.4线性代数

6.5求解符号方程6.6简易符号绘图函数6.7调用Maple函数

6.8积分变换

6.1.1创建符号变量和表达式

MATLAB的符号数学工具箱提供了用于创建符号变量和表达式的两个基本函数,即sym和syms。

sym函数的常用调用格式为S=sym(A),其作用是创建一个由A表示的“sym”类的对象S。如果输入参量是字符串,则生成一个符号类型的数值或变量;如果输入参量是数值标量或数值矩阵,则生成一个符号类型的数值。6.1符号对象的创建与使用【例】创建符号类型数值。

在命令窗输入:

>>a=3;

>>b='3';

>>s1=sym(a);

>>s2=sym(b);

>>s1==s2

class_=class(s1)运行结果:

ans=

1

class_=

sym

【例】创建符号类型变量。

在命令窗输入:

>>x=sym('x')

a=sym('alpha')运行结果:

x=

x

a=

alpha

【例】创建符号类型矩阵。

在命令窗输入:

>>A=magic(3);

>>sym(A)运行结果:

ans=

[8,1,6]

[3,5,7]

[4,9,2]

syms函数用于创建符号表达式时的变量声明,这也是最常用的创建符号表达式的方法。该函数的常用调用格式为symsa1a2…。【例】创建符号表达式。

在命令窗输入:

>>symsab

>>f=a^2+2*b

运行结果:

f=

a^2+2*b其中,表达式的创建语句定义了f为符号变量,无需再定义f。否则,如果继续在命令窗输入:

>>symsf

>>f

运行结果会将原本创建好的表达式覆盖:

f=

f

另外,符号表达式也可以通过sym函数直接创建。

【例】创建符号表达式。

在命令窗输入:

>>f1=sym(a^2+2*b)

运行结果:

f1=

a^2+2*b

通过这种方法创建的符号表达式与上例中通过syms创建的符号表达式的结果是相同的。但是,如果采用以字符串作为输入参量的方法,得到的将是另一个结果。

【例】创建符号表达式。

在命令窗输入:

>>f2=sym(‘a^2+2*b’)

运行结果:

f2=

a^2+2*b

应当注意,f2表达式的“+”号前后各存在一个空字符,与前面两种方法创建的表达式略有差别。对于一个已有的表达式,利用findsym函数可以寻找该表达式中的符号变量,例如:

【例】寻找符号变量。

在命令窗输入:

>>symsab

>>f=a^2+2*b;

>>findsym(f)

运行结果:

ans=

a,b

使用pretty函数可以使符号表达式的显示形式更为美观。【例】按照书写习惯显示表达式。

在命令窗输入:

>>symsxy

>>y=3*x^3-2*x^2+x+1

pretty(y)

运行结果:

y=

3*x^3-2*x^2+x+1

32

3x-2x+x+16.1.2创建符号数学函数

符号数学函数的输入参量中含有符号变量,创建符号数学函数的方法与创建一般函数的方法类似。符号数学函数在一些场合有着特殊的用途。

下面以一个sinc符号数学函数为例来说明其创建方法。创建一个M文件,输入如下代码并保存为sincsym.m:

functionz=sincsym(x)

ifisequal(x,sym(0))

z=sym(1);

else

z=sin(x)/x;

end在命令窗输入:

>>x=sym(2);

y=sincsym(x)

x1=sym(0);

y1=sincsym(x1)

z=class(y1)

运行结果:

y=

1/2*sin(2)

y1=

1

z=

sym6.2.1符号微积分

微积分运算是整个高等数学的基础,本小节主要介绍如何利用符号数学工具箱对符号表达式进行微积分运算。

1.微分

在符号数学工具箱中,表达式的微分由函数diff实现,其调用格式如下:

● diff(S):求符号表达式S对于默认自变量的微分。

● diff(S,y):求符号表达式S对于自变量y的微分。6.2数学计算功能● diff(S,n):求符号表达式S对于默认自变量的n次微分。

● diff(S,y,n)或diff(S,n,y):求符号表达式S对于自变量y的n次微分。

符号微分的默认自变量为x,如果表达式中不存在x,则以字母表中最接近x的字母作为微分的默认自变量。不论一个符号变量是否与表达式有关,符号微分都可以求表达式对于该符号变量的微分。【例】符号微分。

在命令窗输入:

>>symsxyt

>>z=x^2+2*y^3;

>>dzdx=diff(z)

dzdt=diff(z,t)

d2zdx2=diff(z,2,x)

d3zdy3=diff(z,y,3)运行结果:

dzdx=

2*x

dzdt=

0

d2zdx2=

2

d3zdy3=

12

2.积分

在符号数学工具箱中,表达式的积分由函数int实现,其调用格式如下:

● int(S):求符号表达式S对于默认自变量的不定积分。

● int(S,v):求符号表达式S对于自变量v的不定积分。

● diff(S,a,b):求符号表达式S对于默认自变量从a到b的定积分。

符号积分的默认自变量选取规则与符号微分中的规则类似。【例】符号积分。

在命令窗输入:

>>symsxy

>>ix=int(z)

iy=int(z,y)

ix1_2=int(z,1,2)

iy0_2pi=int(z,y,0,pi/2)运行结果:

ix=

log(x)+2*sin(y)*cos(y)*x

iy=

1/x*y-cos(y)^2

ix1_2=

2*sin(y)*cos(y)+log(2)

iy0_2pi=

1/2*(2*x+pi)/x6.2.2函数的极限

求极限就是当函数的自变量无限接近某个确定值时,求该函数的值的过程。譬如微分的计算就是利用极限定义的(假如该极限存在):函数的极限在很多场合有重要的作用,本小节将介绍如何使用符号数学工具箱求函数的极限。

通常使用limit函数求函数的极限,其调用格式如下:

● limit(F,x,a):计算符号表达式F在x趋向于a条件下的极限。

● limit(F,a):计算符号表达式F中默认自变量趋向于a条件下的极限。

● limit(F):计算符号表达式F在默认自变量趋向于0时的极限。

●limit(F,x,a,'right')和limit(F,x,a,'left'):计算符号表达式F在x趋向于a条件下的右极限和左极限。例如,函数x/|x|在x→0+,x→0-时存在极限,而在x→0时不存在极限。下面将利用limit函数来求解。

【例】函数的极限。

在命令窗输入:

>>symx;

>>F=x/abs(x);

F_2_NEGATIVE=limit(F,-2)

F_0=limit(F,x,0)

F_0_RIGTH=limit(F,x,0,‘right’)

F_0_LEFT=limit(F,x,0,'left')运行结果:

F_2_NEGATIVE=

-1

F_0=

NaN

F_0_RIGTH=

1

F_0_LEFT=

-16.2.3级数求和

利用符号数学工具箱中的symsum函数可以实现级数的求和,其调用格式如下:

● symsum(S):求符号表达式S对于默认自变量x从0到x -1的和。

● symsum(S,v):求符号表达式S对于自变量v从0到v -1的和。

● symsum(S,a,b):求符号表达式S对于默认自变量x从a到b的和。

● symsum(S,v,a,b):求符号表达式S对于自变量v从a到b的和。

级数求和的默认自变量选取规则与符号微分中的规则类似。【例】级数求和。

在命令窗输入:

>>symsxv

>>S=x^2+v;

>>S1=symsum(S)

S2=symsum(S,v)

S3=symsum(S,0,4)

S4=symsum(S,v,0,4)运行结果:

S1=

1/3*x^3-1/2*x^2+1/6*x+v*x

S2=

x^2*v+1/2*v^2-1/2*v

S3=

5*v+30

S4=

5*x^2+106.2.4泰勒级数展开

利用符号数学工具中taylor函数可以求得符号表达式的泰勒级数展开式,其调用格式如下:

● taylor(f):计算符号表达式f在默认自变量等于0处的5阶泰勒级数展开式。

● taylor(f,n,v):计算符号表达式f在自变量v = 0处的n -1阶泰勒级数展开式。

● taylor(f,n,v,a):计算符号表达式f在自变量v = a处的n -1阶泰勒级数展开式。

当符号表达式中有多个自变量时,利用taylor函数可以求得表达式对于一个自变量的泰勒级数展开,默认自变量选取规则与符号微分中的规则类似。【例】泰勒级数展开。

在命令窗输入:

>>symsxz

>>f=sin(x)+exp(z);

>>T1=taylor(f)

T2=taylor(f,7,x)

T3=taylor(f,4,z,1)运行结果:

T1=

exp(z)+x-1/6*x^3+1/120*x^5

T2=

exp(z)+x-1/6*x^3+1/120*x^5

T3=

sin(x)+exp(1)+exp(1)*(z-1)+1/2*exp(1)*(z-1)^2+1/6*exp(1)*(z-1)^36.3.1符号表达式的化简

MATLAB的符号数学工具箱提供了丰富的表达式代数恒等变换和三角恒等变换的函数,本小节将介绍这类变换函数,如collect、expand、horner、factor、numden、simplify和simple。

1.因式分解

因式分解函数factor的调用格式为factor(p),返回值为p的因式分解形式。其中,p为有理系数符号多项式或符号类型的整数,如果p不可分解,则返回值为p本身。6.3表达式的化简和替换【例】因式分解。

在命令窗输入:

>>symsx;

>>n=(1:4)‘;

>>p=x.^n-1;

>>f=factor(p);

>>[p,f]运行结果:

ans=

[x-1,

x-1]

[x^2-1,

(x-1)*(x+1)]

[x^3-1,

(x-1)*(x^2+x+1)]

[x^4-1,(x-1)*(x+1)*(x^2+1)]【例】因数分解。

在命令窗输入:

>>N=sym(3);

>>fork=2:4

N(k)=10*N(k-1);

end

>>[N'factor(N')]运行结果:

ans=

[3,(3)]

[30,(2)*(3)*(5)]

[300,(2)^2*(3)*(5)^2]

[3000,(2)^3*(3)*(5)^3]

2.表达式展开

符号表达式的展开函数expand的调用格式为expand(S),返回值为符号表达式S的展开式。利用expand函数可以实现多项式、三角函数和指数函数的展开。

【例】表达式展开。

在命令窗输入:

>>symsabxy

>>f1=a*(x+y)^2;

>>f2=x*(x*(x-a)+b);

>>f3=exp(a+b);

>>f4=cos(a*x+b*y);

>>p=expand([f1;f2;f3;f4])

运行结果:

p=

a*x^2+2*a*x*y+a*y^2

x^3-a*x^2+x*b

exp(a)*exp(b)

cos(a*x)*cos(b*y)-sin(a*x)*sin(b*y)

3.合并同类项

符号表达式的同类项合并函数collect的调用格式如下:

● collect(S):按符号表达式S中默认自变量的同次幂项的系数合并,默认自变量为x。

● collect(S,v):按符号表达式S中自变量v的同次幂项的系数合并。

【例】合并同类项。在命令窗输入:

>>symsxy;

>>f=(sin(x)*x)*(x+y)*y;

>>R1=collect(f)

R2=collect(f,y)

R3=collect([(x+1)*(y+1),x+y])运行结果:

R1=

sin(x)*y*x^2+sin(x)*y^2*x

R2=

sin(x)*y*x^2+sin(x)*y^2*x

R3=

[(y+1)*x+y+1,x+y]

4.表达式化简

符号表达式的化简可以通过函数simple和simplify来实现,其调用格式如下:

● r=simple(S):使用多种算数法则对符号表达式S进行化简,得到所有比S更简短的表达式,返回值r为其中最简洁的形式。如果S为符号表达式矩阵,则结果为整个矩阵的最简表达形式,而不是矩阵的每个元素最简。如果不给出返回值,那么命令simple(S)的结果将显示所有可能的表达式并且返回值为其中的最简形式。● [r,how]=simple(S):返回最简形式及其使用的化简方法,并且不显示化简的中间过程。其中,r为化简后的符号表达式,how为代表化简方法的字符串。

● R=simplify(S):利用Maple化简规则化简符号矩阵S中的每个元素,返回值为R。

【例】显示表达式化简的所有形式。在命令窗输入:

>>symsx

>>S=cos(x)^2+sin(x)^2;

>>simple(S)

运行结果:

simplify:

1

radsimp:

cos(x)^2+sin(x)^2

combine(trig):1

factor:

cos(x)^2+sin(x)^2

expand:

cos(x)^2+sin(x)^2

combine:

1

convert(exp):

(1/2*exp(i*x)+1/2/exp(i*x))^2-1/4*(exp(i*x)-1/exp(i*x))^2

convert(sincos):

cos(x)^2+sin(x)^2convert(tan):

(1-tan(1/2*x)^2)^2/(1+tan(1/2*x)^2)^2+4*tan(1/2*x)^2/(1+tan(1/2*x)^2)^2

collect(x):

cos(x)^2+sin(x)^2

mwcos2sin:

1

ans=

1

【例】显示表达式化简的最简形式及其使用方法。

在命令窗输入:

>>symsx

>>S=cos(x)^2+sin(x)^2;

>>[r,how]=simple(S)

运行结果:

r=

1

how=

simplify

【例】利用Maple化简规则化简。

在命令窗输入:

>>symsx

>>S=cos(x)^2+sin(x)^2;

>>R=simplify(S)

运行结果:

R=

1

5.表达式通分

符号表达式的通分可以通过函数numden来实现,其调用格式为[N,D]=numden(A),表示将A转化为分子分母都是整系数的最佳形式。其中,A为符号矩阵,N为分子符号矩阵,D为分母符号矩阵。

【例】表达式通分。

在命令窗输入:

>>symsxy

>>[n,d]=numden([x/y+y/x,sym(1-1/2.4)])运行结果:

n=

[x^2+y^2,7]

d=

[y*x,12]

6.表达式的嵌套形式

函数horner可以将符号表达式转换成嵌套形式,其调用格式为F=horner(P)。其中,P为符号多项式矩阵,该函数将P的每一个元素转化为嵌套形式。

【例】表达式的嵌套形式。

在命令窗输入:

>>symsx

>>P=[x^2+x;y^3-2*y];

>>F=horner(P)运行结果:

F=

x*(x+1)

(-2+y^2)*y6.3.2符号表达式的替换

MATLAB的符号数学工具箱提供了两个符号表达式替换的函数subexpr和subs。利用这两个函数可以将表达式的输出形式简化,从而得到一个简单的表达式。

subexpr函数的调用格式如下:

● [Y,SIGMA]=subexpr(X,SIGMA):将符号表达式X中重复出现的字符串用SIGMA来代替,返回值Y为替换后的符号表达式。● [Y,SIGMA]=subexpr(X,‘SIGMA’):将符号表达式X中重复出现的字符串用‘SIGMA’来代替,返回值Y为替换后的符号表达式。

subexpr函数可以使非常复杂的表达式的形式得到一定程度的化简。

【例】表达式重复字符串的替换。

在命令窗输入:

>>t=solve(‘a*x^3+b*x^2+c*x+d=0’);

>>[r,s]=subexpr(t,'s')运行结果:

r=

1/6/a*s^(1/3)-2/3*(3*c*a-b^2)/a/s^(1/3)-1/3*b/a

-1/12/a*s^(1/3)+1/3*(3*c*a-b^2)/a/s^(1/3)-1/3*b/a+1/2*i*3^(1/2)*(1/6/a*s^(1/3)

+2/3*(3*c*a-b^2)/a/s^(1/3))

-1/12/a*s^(1/3)+1/3*(3*c*a-b^2)/a/s^(1/3)-1/3*b/a-1/2*i*3^(1/2)*(1/6/a*s^(1/3)

+2/3*(3*c*a-b^2)/a/s^(1/3))s=

36*c*b*a-108*d*a^2-8*b^3+12*3^(1/2)*(4*c^3*a-c^2*b^2-18*c*b*a*d+27*d^2*a^2

+4*d*b^3)^(1/2)*a

subs函数的调用格式如下:

● R=subs(S):用调用函数或工作区间的变量值替换符号表达式S中所有出现的对应变量。

● R=subs(S,new):用变量new替换S中的默认变量。

● R=subs(S,old,new):用变量new替换S中的变量old。old为符号变量或代表某个变量名字符串,new为符号变量、数值变量或表达式。

【例】用工作区间变量替换。

在命令窗输入:

>>a=10;

>>C1=2;

>>y=dsolve(‘Dy=-a*y’)

yt=subs(y)运行结果:

y=

C1*exp(-a*t)

yt=

2*exp(-10*t)

【例】用输入参量替换。

在命令窗输入:

>>symsaC1t

>>y=C1*exp(-a*t);

>>yt=subs(y,{a,C1},{10,2})

运行结果:

yt=

2*exp(-10*t)

【例】用矩阵替换标量。

在命令窗输入:

>>subs(exp(a*t),‘a’,magic(2))

运行结果:

ans=

[exp(t),exp(3*t)]

[exp(4*t),exp(2*t)]

【例】相乘标量的替换。

在命令窗输入:

>>symsxy

>>subs(x*y,{x,y},{[01;-10],[11;11]})

运行结果:

ans=

01

-106.4.1基本代数运算

符号对象的基本代数运算与double类的MATLAB对象运算方法相同。

【例】符号矩阵的幂。

在命令窗输入:

>>symst;

>>G=[cos(t)sin(t);-sin(t)cos(t)];

>>A=G^2

A=simple(A)6.4线性代数运行结果:

A=

[cos(t)^2-sin(t)^2,2*cos(t)*sin(t)]

[-2*cos(t)*sin(t),cos(t)^2-sin(t)^2]

A=

[cos(2*t),sin(2*t)]

[-sin(2*t),cos(2*t)]

【例】符号正交矩阵。

在命令窗输入:

>>symst;

>>G=[cos(t)sin(t);-sin(t)cos(t)];

>>I=G.‘*G

I=simple(I)运行结果:

I=

[cos(t)^2+sin(t)^2,0]

[0,cos(t)^2+sin(t)^2]

I=

[1,0]

[0,1]6.4.2线性代数运算

符号对象的线性代数运算与double类的MATLAB对象的线性代数运算相同。本小节将以希尔伯特矩阵为例来介绍符号数学工具箱中的几种线性代数运算。

【例】符号线性代数运算。

创建一个数值类型的希尔伯特矩阵,在命令窗输入:

>>H=hilb(3)运行结果:

H=

1.00000.50000.3333

0.50000.33330.2500

0.33330.25000.2000

将H转化为符号矩阵,在命令窗输入:

>>H=sym(H)运行结果:

H=

[1,1/2,1/3]

[1/2,1/3,1/4]

[1/3,1/4,1/5]

对这个无限精度的希尔伯特矩阵求逆及行列式,在命令窗输入:

>>inv(H)

det(H)运行结果:

ans=

[9,-36,30]

[-36,192,-180]

[30,-180,180]

ans=

1/2160利用反斜杠求希尔伯特矩阵构成的线性方程组,在命令窗输入:

>>b=[111]‘;

>>x=H\b

x=

3

-24

30

以上求逆、求行列式、求解线性方程组的结果都是对应无限精度有理希尔伯特矩阵的精确解。另一方面,如果以使用16位精度的线性代数运算所得结果与上例进行对比,可以看出符号线性代数运算与数值线性代数运算存在着本质上的区别。

【例】16位精度数值线性代数运算。

创建一个16位精度的希尔伯特矩阵,在命令窗输入:

>>digits(16)

>>V=vpa(hilb(3))

运行结果:上面的矩阵元素的小数点表明使用的是变精度算法,即将结果四舍五入至16位阿拉伯数字。当求矩阵的逆时,由于矩阵条件数很大(3阶希尔伯特矩阵的条件数约为500),因此误差将被放大。在命令窗输入:

>>inv(V)

运行结果:再看行列式的值,在命令窗输入:

>>det(V)

运行结果:

ans=

.462962962962953e-3

求解线性方程组,在命令窗输入:

>>V\b运行结果:

ans=

3.000000000000041

-24.00000000000021

30.00000000000019

【例】奇异矩阵的运算。

由于H非奇异,求其化零矩阵,在命令窗输入:

>>null(H)运行结果:

ans=

[emptysym]

求H的列空间,在命令窗输入:

>>colspace(H)

运行结果:

ans=

[1,0,0]

[0,0,1]

[0,1,0]即得到了一个单位矩阵的置换形式。下面介绍如何通过修改H(1,1)的值成为s,使H奇异。在命令窗输入:

>>symss

H(1,1)=s

Z=det(H)

sol=solve(Z)运行结果:

H=

[s,1/2,1/3]

[1/2,1/3,1/4]

[1/3,1/4,1/5]

Z=

1/240*s-1/270

sol=

8/9接着利用H=subs(H,s,sol)将s用sol替换,在命令窗输入:

>>H=subs(H,s,sol)

运行结果:

H=

[8/9,1/2,1/3]

[1/2,1/3,1/4]

[1/3,1/4,1/5]此时,H的行列式将为零,H的逆矩阵将不存在。Z =null(H)以及C=colspace(H)将返回非平凡的结果。在命令窗输入:

>>Z=null(H)

C=colspace(H)

运行结果:

Z=

1

-4

10/3

C=

[1,0]

[0,1]

[-3/10,6/5]需要指出的是,即使H奇异,vpa(H)非奇异。行列式不为零,逆矩阵存在。在命令窗输入:

>>digits(16);

det(vpa(H))

inv(vpa(H))

运行结果:

ans=

-.9e-176.4.3特征值

符号线性代数中,常用eig函数来求符号矩阵的特征值或特征向量,其调用格式如下:

● E=eig(A):求符号矩阵A的特征值。

● [V,E]=eig(A):求符号矩阵A的特征值E和特征向量V。

下面以上一小节的奇异矩阵为例,给出符号矩阵特征值和特征向量的求法。

【例】符号矩阵的特征值与特征向量。其中,T为特征向量,E为特征值构成的对角矩阵。为使这个结果更为明了,在命令窗输入:

>>Td=double(T)

Ed=double(E)运行结果:

Td=

1.00001.6497-1.2837

-4.00001.00001.0000

3.33330.70511.5851

Ed=

000

01.33440

000.08786.4.4约当标准型

约当标准型的结果类似于矩阵的对角化,即对于一个矩阵A,寻找一个非奇异矩阵V,使得矩阵J = V\A*V最接近对角矩阵。对于绝大部分矩阵,约当标准型为特征值组成的对角矩阵J,其变换矩阵V的列向量则为对应的特征向量。特征值不相等的对称矩阵往往具有这个特点,但是对于有重特征值的非对称矩阵,有可能不能对其进行对角化。约当型的主对角线上为矩阵的特征值,但是超对角线上的某些元素为1而不是0。

计算符号矩阵约当标准型的函数jordan的常用调用格式为[V,J] = jordan(A),其中,J为约当标准型,V为变换矩阵,其列向量代表广义特征向量。

【例】符号矩阵的约当标准型。

>>A=sym([12,32,66,116;-25,-76,-164,-294;

21,66,143,256;-6,-19,-41,-73]);

>>[V,J]=jordan(A)

V=

[4,-2,4,3]

[-6,8,-11,-8]

[4,-7,10,7]

[-1,2,-3,-2]J=

[1,1,0,0]

[0,1,0,0]

[0,0,2,1]

[0,0,0,2]6.4.5奇异值分解

符号数学工具箱中只支持变精度完全奇异向量分解的数值计算,其中的一个原因就是符号计算所得的公式过长且过于复杂。如果A是一个浮点或变精度数值的符号矩阵,则svd函数计算A的奇异分解。svd的常用调用格式为[U,S,V]=svd(A),其中U、V为正交矩阵,S为对角矩阵,且满足A=U*S*V'。

【例】符号矩阵的奇异值分解。

在命令窗输入:

>>[J,I]=meshgrid(1:5);

>>digits(8)

A=sym(1./(I-J+1/2))

[U,S,V]=svd(vpa(A))运行结果:

A=

[ 2,-2, -2/3,-2/5, -2/7]

[2/3, 2,  -2, -2/3,-2/5]

[2/5,2/3, 2, -2, -2/3]

[2/7,2/5,2/3,2,   -2]

[2/9,2/7,2/5, 2/3,2]6.4.6特征值轨迹

本小节给出一个在矩阵参数变化时,矩阵特征值的变化情况。

【例】特征值轨迹。

在命令窗输入:

>>A=gallery(3)

E=[130,-390,0;43,-129,0;133,-399,0];

symsxt

A=A+t*E

p=poly(A)

x=.8:.01:3.2;

fork=0:2c=sym2poly(subs(p,t,k*0.5e-6));

y=polyval(c,x);

lambda=eig(double(subs(A,t,k*0.5e-6)));

subplot(3,1,3-k)

plot(x,y,'-',x,0*x,':',lambda,0*lambda,'o')

axis([.83.2-.5.5])

text(2.25,.35,['t='num2str(k*0.5e-6)]);

end运行结果如下。图6-1所示自上至下分别为t=1.0e-6、t=0.5e-6、t=0时的特征值轨迹。

A=

-149-50 -154

537180546

-27 -9 -25

A=

[-149+130*t,-50-390*t,-154]

[537+43*t,180-129*t, 546]

[-27+133*t, -9-399*t,-25]

p=

x^3-6*x^2+11*x-t*x^2+492512*t*x-6-1221271*t图6-1特征值轨迹6.5.1求解代数方程

符号数学工具箱提供了求解符号代数方程的函数solve,其调用格式如下:

● g=solve(eq):求解关于默认自变量的方程式eq或eq=0。其中,eq可以是符号表达式或字符串,返回值g是所有解构成的列向量。如果eq是不带等号的符号表达式或字符串,则求解关于默认自变量的方程式eq=0。

● g=solve(eq,var):求解关于自变量var的方程式eq或eq=0。

通常方程的默认自变量为x。6.5求解符号方程【例】求解代数方程。

在命令窗输入:

>>symsabcx

S=a*x^2+b*x+c;

solve(S)

运行结果:

ans=

-1/2*(b-(b^2-4*a*c)^(1/2))/a

-1/2*(b+(b^2-4*a*c)^(1/2))/a当然,也可以指定自变量,继续在命令窗输入:

>>b=solve(S,b)

运行结果:

b=

-(a*x^2+c)/x

需要注意的是,如果待求解的方程形式不是f(x)=0,而是形如g(x)=f(x),则solve函数的输入参量必须是引号字符串。6.5.2求解代数方程组

符号代数方程组的求解也要使用函数solve,其调用格式如下:

● g=solve(eq1,eq2,…,eqn):求解关于n个默认自变量的方程组eq1、eq2、…、eqn。其中,eq1、eq2、…、eqn可以是符号表达式或字符串。默认自变量由函数findsym作用于方程系统决定。

● g=solve(eq1,eq2,…,eqn,var1,var2,…,varn):求解关于n个自变量var1、var2、…、varn的方程组eq1、eq2、…、eqn。

对于方程数等于输出数的方程组,其解按照字母表排序;对于单输出的方程组,则返回值为所有解组成的结构。

【例】

求解代数方程组(单输出)。

在命令窗输入:

>>S=solve(‘u^2-v^2=a^2’,‘u+v=1’,‘a^2-2*a=3’)

S.a

运行结果:

S=

a:[2x1sym]

u:[2x1sym]

v:[2x1sym]

ans=

3

-1

【例】求解代数方程组(输出数等于方程数)。

在命令窗输入:

>>symsxyalpha

>>[x,y]=solve(x^2*y^2,x-y/2-alpha)

运行结果:

x=

0

0

alpha

alpha

y=

-2*alpha

-2*alpha

0

0

需要注意的是,由于该方程组第一个方程的解为x=±0,y=±0,故最终的解向量中含有冗余项。6.5.3求解常微分方程

符号数学工具箱提供了求解符号常微分方程(组)的函数dsolve。微分方程中,在变量字母前加D代表对该变量的微分。符号D2、D3、…、DN分别对应二阶、三阶、…、N阶微分。例如D2y表示的是d2y/dt2。因变量是前面加D的符号变量,并且默认对自变量t求导。应当注意,符号变量名中不能含有D。

dsolve函数的调用格式如下:

● r = dsolve(‘eq1,eq2,…’,‘cond1,cond2,…’,‘v’):求解由eq1、eq2 …构成的常微分方程(组),且对自变量v求导,由cond1、cond2…指定边值或初值条件。

● r=dsolve(‘eq1’,‘eq2’,…,‘cond1’,‘cond2’,…,‘v’):同上,但输入参量最多不超过12。

● dsolve('eq1,eq2,…','cond1,cond2,…','v'):同上。如果初值条件数少于因变量数,求解的结果中将含有积分常数C1、C2等。dsolve函数的输出形式有以下三种:

●对于只有一个方程和一个输出的情况,dsolve函数的返回值为一个非线性方程多个解构成的列向量。

●对于多个方程和方程数等于输出数的情况,dsolve函数将解按照词典顺序排序并赋给输出。

●对于多个方程和一个输出的情况,dsolve函数的返回值为所有解组成的结构。【例】求解自治常微分方程。

在命令窗输入:

>>dsolve(‘Dx=-a*x’)

运行结果:

ans=

C1*exp(-a*t)【例】求解非自治常微分方程。

在命令窗输入:

>>dsolve(‘Df=f+sin(t)’)

运行结果:

ans=

-1/2*cos(t)-1/2*sin(t)+exp(t)*C1【例】求解二阶常微分方程。

在命令窗输入:

>>dsolve(‘D2y=-a^2*y’,‘y(0)=1’,‘Dy(pi/a)=0’)

运行结果:

ans=

cos(a*t)

【例】求解常微分方程组。

在命令窗输入:

>>S=dsolve(‘Dx=y’,‘Dy=-x’)

S.x

S.y运行结果:

S=

x:[1x1sym]

y:[1x1sym]

ans=

-C1*cos(t)+C2*sin(t)

ans=

C1*sin(t)+C2*cos(t)6.6.1二维基本绘图

函数ezplot是MATLAB最基本最常用的二维绘图函数,其调用格式如下:

● ezplot(f):在默认区域内绘制函数表达式f=f(x)。

● ezplot(f,[xmin,xmax]):在指定的区域[xmin,xmax]内绘制函数表达式f=f(x)。如果没有图形窗口存在,则该命令生成标题为FigureNo.1的新窗口并在该窗口中作图;如果已有图形窗口存在,则在标号最高的图形窗口中作图。6.6简易符号绘图函数● ezplot(f,[xminxmax],fign):打开并在指定标号fign的窗口中绘制[xmin,xmax]区域内函数f=f(x)的图像。

● ezplot(f):在默认区域,内绘制函数表达式f(x,y)=0的图像。

● ezplot(f,[xmin,xmax,ymin,ymax]):在xmin<x<xmax和ymin<y<ymax区域内绘制函数f(x,y)=0的图像。

● ezplot(f,[min,max]):在min<x<max和min<y<max区域内绘制函数f(x,y)=0的图像。

● ezplot(x,y):在默认范围内绘制参数方程x=x(t)、y=y(t)的图像。

● ezplot(x,y,[tmin,tmax]):在指定的范围tmin<t<tmax内绘制参数方程x=x(t)、y=y(t)的图像。

● ezplot(…,figure):在由figure句柄标识的图形窗口中绘制指定函数的图像。【例】绘制二维图像x2-y4=0。

在命令窗输入:

>>symsxy

>>ezplot(x^2-y^4)

运行结果如图6-2所示。图6-2x2 -y4=0的图像

【例】

绘制二维图像在命令窗输入:

>>symsx

>>ezplot(erf(x))

grid运行结果如图6-3所示。图6-3erf(x)的图像6.6.2二维极坐标绘图

函数ezpolar用于二维极坐标函数的绘图,其调用格式如下:

● ezpolar(f):在默认区域0 <theta< 2π内绘制极坐标函数rho = f(theta)的图像。

● ezpolar(f,[a,b]):在指定区域a <theta< b内绘制极坐标函数f的图像。

【例】二维极坐标绘图。

在命令窗输入:

>>symst

>>ezpolar(1+cos(4*t))

运行结果如图6-4所示。图6-4绘制极坐标图6.6.3三维曲线绘图

函数ezplot3用于三维曲线的简易绘图,其调用格式如下:

● ezplot3(x,y,z):在默认区域0<t<2π内绘制由参数方程x=x(t)、y=y(t)与z=z(t)定义的曲线。

● ezplot3(x,y,z,[tmin,tmax]):在区域tmin<t<tmax内绘制由参数方程x=x(t)、y=y(t)与z=z(t)定义的曲线。

● ezplot3(…,'animate'):绘制参数方程的动态轨迹。【例】绘制三维参数曲线。

在命令窗输入:

>>symst;

>>ezplot3(sin(t),cos(t),t,[0,6*pi])

运行结果如图6-5所示。图6-5绘制三维参数曲线图6.6.4三维网格绘图

函数ezmesh用于绘制三维网格图,其调用格式如下:

●ezmesh(f):绘制二元函数f(x,y)的三维网格图,f为函数f的符号表达式,默认区域-2π<x<2π,-2π<y<2π。MATLAB将根据函数变动的程度选择相应的计算栅格。如果函数f在某些栅格点上没有定义,则这些点将不显示。

●ezmesh(f,domain):在指定区域domain内绘制二元函数f的三维网格图,domain可以是四维向量[xmin,xmax,ymin,ymax]或二维向量[min,max]。●ezmesh(x,y,z):在默认区域 -2π<s<2π、-2π<t<2π内绘制由参数方程x=x(s,t)、y=y(s,t)、z=z(s,t)定义的网格图。

● ezmesh(x,y,z,[smin,smax,tmin,tmax]):在指定区域内绘制由参数方程定义的网格图。

● ezmesh(x,y,z,[min,max]):在指定区域内绘制由参数方程定义的网格图。

●ezmesh(…,n):用指定的n×n个栅格点在默认区域内绘制函数f的网格图。n的默认值为60。

● ezmesh(…,'circ'):在一圆形区域内画出函数f的网格图。函数ezmeshc用于同时绘制三维网格图与等高线图,其调用格式与函数ezmesh类似。例如绘制如下函数表达式的网格图。

【例】

绘制三维网格图。在命令窗输入:

>>symsxy

>>ezmesh(y/(1+x^2+y^2),[-5,5,-2*pi,2*pi])运行结果如图6-6所示。图6-6三维网格图

【例】同时绘制三维网格图与等高线图。

在命令窗输入:

>>symsxy

>>ezmeshc(y/(1+x^2+y^2),[-5,5,-2*pi,2*pi])

运行结果如图6-7所示。图6-7三维网格图与等高线图6.6.5三维表面绘图

ezsurf函数用于绘制三维表面图,其调用格式如下:

● ezsurf(f):绘制二元函数f(x,y)的三维表面图,f为函数f的符号表达式,默认区域-2π<x<2π,-2π<y<2π。MATLAB将根据函数变动的程度选择相应的计算栅格。如果函数f在某些栅格点上没有定义,则这些点将不显示。●ezsurf(f,domain):在指定区域domain内绘制二元函数f的三维表面图,domain可以是四维向量[xmin,xmax,ymin,ymax]或二维向量[min,max]。

●ezsurf(x, y, z):在默认区域 -2π<s<2π、-2π<t<2π内绘制由参数方程x=x(s, t)、y=y(s,t)、z=z(s,t)定义的表面图。

●ezsurf(x,y,z,[smin,smax,tmin,tmax]):在指定区域内绘制由参数方程定义的表面图。

●ezsurf(x,y,z,[min,max]):在指定区域内绘制由参数方程定义的表面图。●ezsurf(…,n):用指定n×n个栅格点在默认区域内绘制函数f的表面图。n的默认值为60。

●ezsurf(…,‘circ’):在一圆形区域内画出函数f的表面图。

函数ezsurfc用于同时绘制三维表面图与等高线图,其调用格式与函数ezsurf类似。例如绘制如下函数表达式的表面图。【例】绘制三维表面图。

在命令窗输入:

>>symsxy

>>ezsurf(y/(1+x^2+y^2),[-5,5,-2*pi,2*pi],35)

运行结果如图6-8所示。图6-8三维表面图【例】同时绘制三维表面图与等高线图。

在命令窗输入:

>>symsxy

>>ezsurfc(y/(1+x^2+y^2),[-5,5,-2*pi,2*pi],35)

运行结果如图6-9所示。图6-9三维表面图与等高线图6.6.6等高线绘图

函数ezcontour用于绘制函数的等高线,其调用格式如下:

●ezcontour(f):绘制二元函数f(x,y)的等高线图,f为函数f的符号表达式,默认区域-2π<x<2π,-2π<y<2π。MATLAB将根据函数变动的程度选择相应的计算栅格。如果函数f在某些栅格点上没有定义,则这些点将不显示。

● ezcontour(f,domain):在指定区域domain内绘制二元函数f的等高线图,domain可以是四维向量[xmin,xmax,ymin,ymax]或二维向量[min,max]。●ezcontour(…,n):用指定n×n个栅格点在默认区域内绘制函数f的等高线图。n的默认值为60。

函数ezcontourf用于绘制函数的等高线并以不同颜色填充,其调用格式与函数ezcontour类似。例如绘制如下函数表达式的等高线图。

【例】绘制等高线图。

在命令窗输入:

>>symsxy

>>f=3*(1-x)^2*exp(-(x^2)-(y+1)^2)...

-10*(x/5-x^3-y^5)*exp(-x^2-y^2)...

-1/3*exp(-(x+1)^2-y^2);

>>ezcontour(f,[-3,3],49)

运行结果如图6-10所示。图6-10等高线图

【例】绘制等高线图并以不同颜色填充。

在命令窗输入:

>>symsxy

>>f=3*(1-x)^2*exp(-(x^2)-(y+1)^2)...

-10*(x/5-x^3-y^5)*exp(-x^2-y^2)...

-1/3*exp(-(x+1)^2-y^2);

>>ezcontourf(f,[-3,3],49)

运行结果如图6-11所示。图6-11有填充色的等高线图6.7.1maple函数

maple函数为用户提供了直接调用Maple函数的途径。该函数的输入参量为sym对象、字符串或double类型的数,返回值为对应于输入类型的sym对象、字符串或double类型数。利用maple函数也可以对自行开发的符号数学程序进行调试。6.7调用Maple函数

maple函数的调用格式如下:

● r=maple(‘statement’):将statement传递给Maple内核,且返回计算结果。必要时可以在statement后面加分号(;)。

● maple('function',arg1,arg2,…):接受任何带引号的与输入参量相关的Maple函数名'function',必要时将输入参量转换为符号表达式并且函数通过给定参量调用。如果输入参量为syms,则maple返回一个sym类型的结果,否则返回一个char类型的结果。● [r,status]=maple(…):有条件地返回警告/错误信息。如果语句执行成功,则r为计算结果且status为0;如果语句执行失败,则r为相应的警告/错误信息,而status为一正整数。

● maple(‘traceon’)或mapletraceon:显示所有后续Maple语句及其相应结果。

● maple('traceoff')或mapletraceoff:关闭上面的操作特性。【例】计算最小公因数和最小公因式。

在命令窗输入:

>>num1=maple(‘gcd(14,21)’)

xy1=maple(‘gcd(x^2-y^2,x^3-y^3)’)

运行结果:

num1=

7

xy1=

-y+x6.7.2mfun函数

mfun函数的调用格式为mfun(‘function’,par1,par2,par3,par4)。计算Maple中的已知数学函数function,返回值为数值量。每个参量par为对应function的数值量。用户可以输入的参量最多不超过4个。最后指定的参量可以是矩阵,通常对应于X。其他参量的维数取决于function的Maple规范。用户可以通过以下命令获得Maple函数的相关参数信息:

● helpmfunlist;

● mhelpfunction。

Maple用16位精度计算function,其结果的每个元素为MATLAB数值量。function中的任何奇异值将返回NaN。

【例】使用mfun函数。

在命令窗输入:

>>mfun(‘FresnelC’,0:5)

mfun('Chi',[3*i0])运行结果:

ans=

00.77990.48830.60570.49840.5636

ans=

0.1196+1.5708iNaN+NaNi6.7.3sym函数

本小节将给出利用Maple阶乘函数计算阶乘的例子。计算阶乘时首先要通过sym函

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论