当前位置:首页 > 科技 > 正文

Matlab符号计算


在科学研究和工程应用中,除了存在大量的数值计算外,还有对符号对象进行的运算,即直接对抽象的符号对象进行的计算,并将所得到的结果以标准的符号形式来表示。符号计算可以得到比数值计算更一般的结果。Matlab的符号计算是通过集成在Matlab中的符号运算工具箱(Symbolic Math Toolbox)来实现的。本章主要介绍符号计算基础,符号微积分,级数的符号求和,代数方程和微分方程的符号求解等内容。

一.符号计算基础

Matlab提供了一种符号数据类型,相应的运算对象称为符号对象。如:符号常量,符号变量,以及它们参与的数学表达式等。在进行符号运算前首先要建立符号对象,然后才可以进行符号对象的运算。

一.符号对象

1. 建立符号变量和符号常量

matlab提供了两个建立符号对象的命令:sym和syms。其用法不同。

①sym函数

sym函数用来建立单个符号量,格式为:

符号量名=sym(符号字符串)

该函数可以建立一个符号字符串,符号字符串可以是常量、变量、函数或表达式。如:a=sym(' a ')将建立符号变量a,此后用户可以在表达式中使用变量a进行各种运算.符号变量a和在其他过程中建立的非符号变量a是不同的。一个非符号变量在参与运算前必须赋值,变量的运算实际上该变量所对应值的运算,其运算结果是一个和变量类型对应的值,而符号变量参与运算前无须赋值,其结果是一个由参与运算的变量名组成的表达式。

a=sym('a');%定义符号变量

b=sym('b');

c=sym('c');

x=5;%定义数值变量

y=-8;

z=11;

w=a*a+b*b+c*c%符号运算

w =

a^2+b^2+c^2

w=x*x+y*y+z*z%数值运算

w=

210

使用sym函数还可以定义符号常量,使用符号常量进行代数运算时和数值常量进行的运算不同。下面比较差别:

pi1=sym('pi');k1=sym('8');k2=sym('3'); %定义符号变量

pi2=pi;r1=8;r2=3;%定义数值变量

sin(pi1/3)%符号计算

ans =

1/2*3^(1/2)

sin(pi2/3)%数值计算

ans =

0.8660

sqrt(k1+sqrt(k2))%符号计算

ans =

(8+3^(1/2))^(1/2)

sqrt(r1+sqrt(r2))%数值计算

ans =

3.1196

从命令执行结果来看,用符号常量进行计算像在进行数学演算,所得到的结果是精确的数学表达式,而数值计算将结果近似为一个有限的小数。

②syms命令

sym函数一次只能定义一个符号变量,使用不方便。Matlab提供了syms命令,一次可以定义多个符号变量。其格式:

syms arg1 arg2 … argn

arg1 arg2 … argn是定义的符号变量名,注意变量间用空格而不要用逗号分隔。

2.建立符号表达式

含有符号对象的表达式称为符号表达式,建立符号表达式有以下3种方法:

①利用单引号生成符号表达式

y='1/sqrt(2*x)'%生成一般的符号表达式

y =

1/sqrt(2*x)

f='cos(x^2)-sin(2*x)=0'%生成符号方程

f =

cos(x^2)-sin(2*x)=0

②用sym函数建立符号表达式

U=sym('3*x^2-5*y+2*x*y+6')%生成符号表达式,不需定义变量

U =

3*x^2-5*y+2*x*y+6

M=sym('[a,b;c,d]')%生成符号矩阵

M =

[ a, b]

[ c, d]

③使用已定义的符号变量组成符号表达式

syms x y;

V=3*x^2-5*y+2*x*y+6

V =

3*x^2-5*y+2*x*y+6

二.基本的符号运算

1.四则运算:

符号表达式的加减乘除可以分别利用函数symadd、symsub、symmul、symdiv来实现,幂运算可以由sympow来实现。

例:

f=‘2*x^2+3*x-5’%定义符号表达式

g=‘x^2-x+7’

U=symadd(f,g)%求f+g

V=symsub(f,g) %求f-g

W=symmul(f,g)%求f*g

X=symdiv(f,g)%求f/g

Y=sympow(f,’3*x’)%求f^(3x)

另外,与数值运算一样,也可以用+ - * / ^运算符来实现符号运算。如:

syms x y z;

f=2*x+x^2*x-5*x+x^3+exp(2)

f=2*x/(5*x)

f=(x*x-y*y)/(x-y)

f =

(x^2-y^2)/(x-y)%有时,Matlab并未将结果化为最简形式。

2.符号表达式的提取分子和分母运算

如果符号表达式是一个有理分式或可以展开为有理分式,可利用numden函数来提取符号表达式中的分子、分母。调用格式

[n,d]=numden(s)

该函数提取符号表达式s的分子和分母,分别存入n和d中

如a=sym(0.3333)

a =

3333/10000

[n,d]=numden(a)

n =

3333

d =

10000

再如:f=sym('a*x^2/(b+x)')

f =

a*x^2/(b+x)

[n,d]=numden(f)

n =

a*x^2

d =

b+x

3.符号表达式的因式分解和展开

Matlab提供了符号表达式的因式分解和展开的函数,

factor(s),对符号表达式s进行分解因式

expand(s),对s进行展开

collect(s),对s进行合并同类项

collect(s,v),对s按变量v合并同类项。

syms a b x y;

A=a^3-b^3;

factor(A)

ans =

(a-b)*(a^2+a*b+b^2)

s=(-7*x^2-8*y^2)*(-x^2+3*y^2)

expand(s)%对s展开

ans =

7*x^4-13*x^2*y^2-24*y^4

collect(s,x)%对s按变量x合并同类项

ans =

7*x^4-13*x^2*y^2-24*y^4

4.符号表达式的化简

Matlab提供的对符号表达式化简的函数有:

simplify(s) ,应用函数规则对s进行化简

simple(s),调用Matlab的其他函数对表达式进行综合化简,并显示化简过程。

syms x y a

s=log(2*x/y);

simplify(s)

ans =

log(2)+log(x/y)

s=(-a^2+1)/(1-a)

simplify(s)

ans =

a+1

函数simple试用几种不同的化简工具,然后选择在结果中含有最少字符的那种形式。如下例:

syms x y;

s=(x^2+y^2)^2+(x^2-y^2)^2

simple(s)%下面是自动调用多种函数对s进行化简,并显示每步结果,以下是化简过程

simplify:

2*x^4+2*y^4

radsimp:

2*x^4+2*y^4

combine(trig):

2*x^4+2*y^4

factor:

2*x^4+2*y^4

expand:

2*x^4+2*y^4

combine:

(x^2+y^2)^2+(x^2-y^2)^2

convert(exp):

(x^2+y^2)^2+(x^2-y^2)^2

convert(sincos):

(x^2+y^2)^2+(x^2-y^2)^2

convert(tan):

(x^2+y^2)^2+(x^2-y^2)^2

collect(x):

2*x^4+2*y^4

ans =

2*x^4+2*y^4

5.符号表达式与数值表达式之间的转换

利用函数sym可以将数值表达式变换为它的符号表达式:

sym(1.5)

ans =

3/2

函数numeric或eval可以将符号表达式变换成数值表达式:

phi='(1+sqrt(5))/2'

phi =

(1+sqrt(5))/2

numeric(phi)

ans =

1.6180

三.符号表达式中变量的确定

Matlab中的符号可以表示符号变量和符号常量,findsym可以帮助用户查找一个符号表达式中的符号变量。该函数的调用格式为:

findsym(s,n)

函数返回符号表达式s中的n个符号变量,若没有指定n则返回s中的全部符号变量。

syms x a y z b;%定义5个符号变量

s1=3*x+y;s2=a*y+b%定义两个符号表达式

findsym(s1)

findsym(s2,2)

syms x y;

s=2*x+3*y;

findsym(s)

ans =

x, y

syms a b x y;%定义符号变量

c=sym('3');%定义符号常量c

findsym(a*x+b*y+c)

ans =%c不在结果中出现

a, b, x, y

注:Matlab按离字母x最近原则确定默认变量。

四.符号矩阵

二.符号函数及其应用

一.符号函数的极限

Matlab中求极限的函数是limit,可以用来求函数在指定点的极限值和左右极限。对于没有定义的极限,Matlab给出的结果为NaN,极限值为无穷大时,Matlab给出的结果为inf。limit的调用格式:

①limit(f,x,a)求符号函数f(x)的极限。当x趋向于a时,f(x)的极限值。

②limit(f,a) 求符号函数f(x)的极限。由于没有指定自变量,则使用该格式时,符号函数f(x)的变量为函数findsym(f)确定的默认自变量,即变量x趋向于a。

③limit(f) 求符号函数f(x)的极限。没有指定变量的目标值,系统默认变量趋近于0时的情况。

④limit(f,x,a,’right’),求极限,’right’表示变量x从右边趋近于a。

⑤limit(f,x,a,’left’),求极限,’left’表示变量x从左边趋近于a。

例:求下列极限

syms a m x;

f=(x^(1/m)-a^(1/m))/(x-a);

limit(f,x,a)

f=(sin(a+x)-sin(a-x))/x;

limit(f)

f=x*(sqrt(x^2+1)-x);

limit(f,x,inf,’left’)

f=(sqrt(x)-sqrt(a)-sqrt(x-a))/sqrt(x*x-a*a);

limit(f,x,a,’right’)

二.符号函数求导及其应用

diff函数用于对符号表达式求导数,其调用格式为:

①diff(f)没有指定变量和导数阶数,则系统按findsym(f)函数指示的默认变量对符号表达式求一阶导数

②diff(f,v)以v为自变量对符号表达式f求一阶导数

③diff(f,n)对f求n阶导数,n为正整数

④diff(f,v,n) 以v为自变量,对f求n阶导数。

例:求下列函数的导数

1.

2.

3.

4.

5.

syms x

f=sqrt(1+exp(x));

diff(f)%对默认变量求一阶导数

f=x*cos(x)

diff(f,x,2) %对x求二阶导数

diff(f,x,3) %对x求三阶导数

三.符号积分

一.符号函数的不定积分

在Matlab中,int函数用于求符号函数的不定积分,有两种格式:

int(f),没有指定积分变量和积分阶数时,系统按findsym函数指示的默认变量对被积函数求不定积分

int(f,v),以v为自变量对被积函数求不定积分

例,求下列不定积分

1.

2,

3.

4.

命令如下:

x=sym('x')

f=(3-x^2)^3;

int(f)

f=sin(x)^2

int(f)

syms alpha t;

f=exp(alpha*t);

int(f)

f=5*x*t/(1+x^2)

int(f,t)

二.符号函数的定积分

在Matlab中,求符号函数的定积分也是使用int函数,调用格式为:

int(f,v,a,b)

其中,a,b分别表示定积分的上下限。该函数求被积函数f在区间[a,b]上的定积分。a,b可以是两个具体的数,也可以是一个符号表达式,还可以是无穷(inf)。当函数f关于变量x在闭区间[a,b]上可积时,返回一个定积分结果。当a,b有一个是inf时,返回一个广义积分。当ab有一个是符号表达式时,函数返回一个符号函数。

例:求下列定积分

1.

2.

3.

4.

syms x t;

int(abs(1-x),1,2)

f=1/(1+x^2);

int(f,-inf,inf)

f=x^3/(x-1)^10;

I=int(f,2,3)

double(I)% 把结果转换为数值

int(4*x/t,t,2,sin(x))

例 求椭球的体积

用平面Z=z0,去截上述椭球,其相交线是一个椭圆,该椭圆在xy平面投影的面积是:

,椭球的体积为:

例:

三.积分变换

积分变换就是通过积分运算把一个函数f(原函数)变成另一个函数F(像函数),变换过程是:

其中K(x,t)称为变换的核,变换的核决定了变换的不同名称。一一对应,相互转化。

积分变换的一项基本应用是求解微分方程,求解过程是基于这样这样一种想法:。。。

常见的积分变换有:傅立叶变换、拉普拉斯变换和Z变换

1.傅立叶(Fourier)变换

当积分变换的核 (i为虚数单位),称积分变换

为傅立叶变换,其逆变换为:

在Matlab中,进行傅立叶变换的函数是

fourier(f,x,t);求f的傅立叶像函数F(t)

ifourier(F,t,x);求傅立叶像函数F(t)的原函数f(x)

例:求函数y=|x|的傅立叶变换及其逆变换

命令如下:

Syms x t;

y=abs(x);

Ft=fourier(y,x,t)%求y的傅立叶变换

fx=ifourier(Ft,t,x)%求Ft的傅立叶逆变换

2.拉普拉斯(Laplace)变换

拉普拉斯变换在微分方程、信号分析以及自动控制方面有广泛的应用。当积分变换的核为

时,称积分变换: 为拉普拉斯变换。其逆变换为:

在Matlab中,进行拉普拉斯变换的函数是:

laplace(fx,x,t) :求f的拉普拉斯变换的像函数F(t)

ilaplace(Fw,t,x) :求拉普拉斯变换的像函数F(t)的原函数f(x)

例:求 的拉普拉斯变换及其逆变换。

命令如下:

x=sym(‘x’);

y=x^2;

Ft=laplace(y,x,t)%对y进行拉普拉斯变换

Fx=ilaplace(Ft,t,x) %进行逆变换

3.Z变换

当函数f(x)呈现为一个离散的数列f(n)时,称变换为:

为Z变换,其逆变换为: (i为虚数单位)

对数列f(n)进行Z变换的Matlab函数是:

ztrans(fn,n,z) :求fn的Z变换像函数F(z)

iztrans(Fz,z,n) :求Fz的Z变换原函数f(n)

例: 求数列 的Z变换和逆变换。

syms n z;

fn=exp(-n);

Fz=ztrans(fn,n,z)% 求Z变换

f=iztrans(Fz,z,n)%求逆变换

四.级数

一.级数的符号求和

(sum处理的级数是有穷级数)

对无穷级数求和,sum是无能为力的,需要使用符号表达式求和函数symsum,调用格式为:

symsum(a,v,m,n)

其中a表示一个级数的通项,是一个符号表达式。v是求和变量,m,n是求和的开始项和末项。(无穷inf)

例:求下列级数之和

1.

2.

3.

4.

命令如下:

n=sym(‘n’)

s1=symsum(1/n^2,n,1,inf)

s2=symsum((-1)^(n+1)/n,1,inf)

…………

二.函数的泰勒级数

泰勒(Taylor)级数将一个任意函数表示为一个幂级数,并且,在许多情况下,只需要取幂级数的前有限项来表示该函数,这对于大多数工程应用来说,精度已经足够。Matlab提供了taylor函数将函数展开为幂级数,调用格式为

taylor(f,v,n,a)

该函数将f按变量v展开为泰勒级数,展开到第n项(即变量v的n-1次幂)为止。n的默认值为6,v的默认值与diff函数相同,参数a指定将函数f在自变量v=a处展开,a的默认值为0。

例:求函数的泰勒级数展开

1.求 的5阶泰勒级数展开

2.将 在x=1处按5次多项式展开(n=6)

命令如下:

x=sym(‘x’);

f1=sqrt(1-2*x+x^3)-(1-3x+x^2)^(1/3)

f2=(1+x+x^2)/(1-x+x^2)

taylor(f1,x,5)%求(1)

taylor(f2,6,1)%求(2),展开到x-1的5次幂时应选择n=6

五.符号方程求解

一.符号代数方程求解

代数方程是指未涉及微积分运算的方程,相对比较简单。在Matlab中,求解用符号表达式表示的代数方程可由函数solve实现,调用格式为:

①solve(eq) 求解符号表达式表示的代数方程eq,求解变量为默认变量,当方程右端为0时,方程eq中可以不包含右端项和等号,而仅列出方程左边的表达式。

②solve(eq,v) 求解符号表达式表示的代数方程eq,求解变量为v

③solve(eq1,eq2,…,v1,v2,…) 求解符号表达式eq1,eq2…组成的代数方程组,求解变量为v1,v2,v3,….

例:解下列方程

1.

2.

3.

4.

命令如下:

x=solve(‘1/(x+2)+4*x/(x^2-4)=1+2/(x-2)’,’x’)

f=sym(‘x-(x^3-4*x-7)^(1/3)=1’)

x=solve(f)

x=solve(‘2*sin(3*x-pi/4)=1’)

x=solve(‘x-x*exp(x)-10’,’x’)

例:求下列方程组的解

1.

2.

3.

4.

[x y]=solve(‘1/x^3+1/y^3=28’,’1/x+1/y=4’,’x,y’)

[x y]=solve(‘x+y-98’,’x^(1/3)+y^(1/3)-2’,’x,y’)

二.符号常微分方程求解

在Matlab中,用大写字母D表示导数,如Dy表示y的导数,D2y表示y的2阶导数等。符号常微分方程求解可以通过函数dsolve来实现,调用格式:

dsolve(eq,c,v)

该函数求解常微分方程eq在初值条件c下的特解。v是方程中的自变量,可以省略。若没有给出初值条件c则求方程的通解。

dsolve在求常微分方程组时的调用格式:

dsolve(eq1,eq2,eq3,…,c1,c2,c3,…,v1,v2,v3,…)

该函数求解常微分方程组eq1,eq2,eq3,…在初值条件c1,c2,c3,…下的特解,若不给出初值条件则求方程的通解。

例:

1.求 的通解

2.求 的通解

3.求 的特解,y(2)=1

4.求 的通解

5.求 的通解。

命令如下:

y=dsolve(‘Dy-(x^2+y^2)/x^2/2’,’x’)

y=dsolve('Dy*x^2+2*x*y-exp(x) ', 'x')

y=dsolve('Dy-x^2/(1+y^2) ', 'y(2)=1', 'x')

[x,y]=dsolve('Dx=4*x-2*y','Dy=2*x-y','t')

[x,y]=dsolve('D2x-y', 'D2y+x', 't')

你可能想看:

有话要说...

取消
扫码支持 支付码