第三章 MATLAB的符号运算概要.docx
《第三章 MATLAB的符号运算概要.docx》由会员分享,可在线阅读,更多相关《第三章 MATLAB的符号运算概要.docx(31页珍藏版)》请在冰豆网上搜索。
![第三章 MATLAB的符号运算概要.docx](https://file1.bdocx.com/fileroot1/2022-11/25/d8851d62-5ad4-4cc3-ade2-f7a0a5b21a13/d8851d62-5ad4-4cc3-ade2-f7a0a5b21a131.gif)
第三章MATLAB的符号运算概要
第三章MATLAB的符号运算
教学目标
1熟悉符号对象和符号表达式的建立
2熟练掌握符号表达式的代数运算
3掌握符号矩阵的建立及其运算
4掌握符号微积分函数的使用方法
5掌握方程的求解
3.1符号对象与符号表达式
3.1.1符号对象的生成
1.建立符号变量和符号常量
(1)符号常量的建立
符号常量是不含变量的符号表达式。
在MATLAB中我们使用sym指令来建立符号常量。
一般调用形式为
sym(‘常量’)%创建符号常量
例如,创建符号常量,这种方式是绝对准确的符号数值表示:
>>a=sym('sin
(2)')
a=
sin
(2)
sym命令也可以把数值转换成某种格式的符号常量。
语法:
sym(常量,参数)%把常量按某种格式转换为符号常量
说明:
参数可以选择为’d’、’f’、’e’或’r’四种格式,也可省略,其作用如表3.1所示。
表3.1参数设置
参数
作用
d
返回最接近的十进制数值(默认位数为32位)
f
返回该符号值最接近的浮点表示
r
返回该符号值最接近的有理数型(为系统默认方式),可表示为p/q、p*q、10^q、pi/q、2^q和sqrt(p)形式之一
e
返回最接近的带有机器浮点误差的有理值
例如,创建符号常量,这种方式是绝对准确的符号数值表示:
a=sym('sin
(2)')
a=
sin
(2)
例如,把常量转换为符号常量,按系统默认格式转换:
a=sym(sin
(2))
a=
8190223105242182*2^(-53)
例3-1创建数值常量和符号常量。
a1=2*sqrt(5)+pi%创建数值常量
a1=
7.6137
a2=sym('2*sqrt(5)+pi')%创建符号表达式
a2=
2*sqrt(5)+pi
a3=sym(2*sqrt(5)+pi)%按最接近的有理数型表示符号常量
a3=
8572296331135796*2^(-50)
a4=sym(2*sqrt(5)+pi,'d')%按最接近的十进制浮点数表示符号常量
a4=
7.6137286085893727261009189533070
a31=a3-a1%数值常量和符号常量的计算
a31=
0
a5='2*sqrt(5)+pi'%字符串常量
a5=
2*sqrt(5)+pi
(2)符号变量的建立
符号变量就是含有变量的符号表达式。
在MATLAB中sym也可以用于定义符号变量,但是函数sym一次只能定义一个符号变量,使用不方便。
MATLAB提供了另一个函数syms,一次可以定义多个符号变量。
syms函数的一般调用格式为:
syms符号变量名1符号变量名2…符号变量名n
用这种格式定义符号变量时不要在变量名上加字符串分界符(‘),变量间用空格而不要用逗号分隔。
2.建立符号表达式
符号表达式就是代表数字、函数和变量的MATLAB字符串或字符串数组,它不要求变量要有预先定义的值。
符号表达式包含符号函数和符号方程,其中符号函数没有等号,而符号方程必须带有等号。
在MATLAB中建立符号表达式主要有一下三种方式:
(1)用单引号建立符号表达式
例
>>f='exp(x)'
f=
exp(x)
‘’中的内容也可以是符号方程。
>>e='a*x^2+bx+c=0'
e=
a*x^2+bx+c=0
(2)用sym建立符号表达式
f1=sym('a*x^2+b*x+c')
f1=
a*x^2+b*x+c
(3)使用已经定义的符号变量来组成符号表达式
symsabcx%创建多个符号变量
f2=a*x^2+b*x+c%创建符号表达式
f2=
a*x^2+b*x+c
syms('a','b','c','x')
f3=a*x^2+b*x+c;%创建符号表达式
3.2符号表达式的运算
符号运算与数值运算的区别主要有以下几点:
A传统的数值型运算因为要受到计算机所保留的有效位数的限制,它的内部表示法总是采用计算机硬件提供的8位浮点表示法,因此每一次运算都会有一定的截断误差,重复的多次数值运算就可能会造成很大的累积误差。
符号运算不需要进行数值运算,不会出现截断误差,因此符号运算是非常准确的。
B符号运算可以得出完全的封闭解或任意精度的数值解。
C符号运算的时间较长,而数值型运算速度快。
3.2.1提取分子分母
如果符号表达是有理分式形式或可展开为有理分式形式,则可通过函数numden来提取符号表达式中的分子分母。
numden函数的调用形式如下:
[n,d]=numden(a)提取符号表达式a的分子与分母,并分别将其存放在n与d中
n=numden(a)提取符号表达式a的分子与分母,但只把分子存放在n中
例提取符号表达式的分子与分母
>>f=sym('a*x^2/(b-x)');
[n,d]=numden(f)
n=
-a*x^2
d=
-b+x
3.2.2符号表达式的基本代数运算
符号表达式的加、减、乘、除四则运算及幂运算等基本的代数运算,与矩阵的数值运算几乎完全一样。
其中,符号表达式的加、减、乘、除运算可分别有函数symadd、symsub、symmul、symdiv来实现,也可与矩阵的数值运算一样,用“+”、“-”、“×”、“÷”符号进行运算,而符号表达式的幂运算也可以由函数sympow来实现,也可以由幂运算符“^”来实现。
例
>>f='4*x+5';
g='2*x^2+5*x+6';
symadd(f,g)
ans=
9*x+11+2*x^2
symsub(f,g)
ans=
-x-1-2*x^2
symmul(f,g)
ans=
(4*x+5)*(2*x^2+5*x+6)
symdiv(f,g)
ans=
(4*x+5)/(2*x^2+5*x+6)
sympow(f,g)
ans=
(4*x+5)^(2*x^2+5*x+6)
>>A=sym('4*x+5');
B=sym('2*x^2+5*x+6');
>>C=A+B
C=
9*x+11+2*x^2
A^B
ans=
(4*x+5)^(2*x^2+5*x+6)
注意只有在使用sym命令的定义的表达式才可以用“+”、“-”、“×”、“÷”、“^”
例3-2符号表达式f=2x2+3x+4与g=5x+6的代数运算。
f=sym('2*x^2+3*x+4')
f=
2*x^2+3*x+4
g=sym('5*x+6')
g=
5*x+6
f+g%符号表达式相加
ans=
2*x^2+8*x+10
f*g%符号表达式相乘
ans=
(2*x^2+3*x+4)*(5*x+6)
3.3符号表达式的操作及转换
3.3.1符号表达式中自由变量的确定
自由变量的确定原则
MATLAB将基于以下原则选择一个自由变量:
A小写字母i和j不能作为自由变量。
B符号表达式中如果有多个字符变量,则按照以下顺序选择自由变量:
首先选择x作为自由变量;如果没有x,则选择在字母顺序中最接近x的字符变量;如果与x相同距离,则在x后面的优先。
C大写字母比所有的小写字母都靠后。
如果我们无法确定表达式中的自由变量,我们可以使用MATLAB提供的findsym函数来确定,该函数的一般调用形式为
findsym(EXPR,n)%确定自由符号变量
说明:
EXPR可以是符号表达式或符号矩阵;n为按顺序得出符号变量的个数,当n省略时,则不按顺序得出EXPR中所有的符号变量。
例得出符号表达式中的符号变量。
f=sym('a*x^2+b*x+c')
f=
a*x^2+b*x+c
findsym(f)%得出所有的符号变量
ans=
a,b,c,x
g=sym('sin(z)+cos(v)')
g=
sin(z)+cos(v)
findsym(g,1)%得出第一个符号变量
ans=
z
3.3.2符号表达式的化简
当通过MATLAB的符号函数运算生成的符号表达式难于看懂时,可以通过MATLAB的符号数学工具箱中提供的函数,来对符号表达式进行化简,把它化成易于看懂的形式。
这方面的函数主要有:
pretty、collect、expand、horner、factor、simplify、simple。
一般来说同一个数学函数可以表示成三种,如
多项式形式的表达方式:
f(x)=x3+6x2+11x-6
因式形式的表达方式:
f(x)=(x-1)(x-2)(x-3)
嵌套形式的表达方式:
f(x)=x(x(x-6)+11)-6
例三种形式的符号表达式的表示。
f=sym('x^3-6*x^2+11*x-6')%多项式形式
f=
x^3-6*x^2+11*x-6
g=sym('(x-1)*(x-2)*(x-3)')%因式形式
g=
(x-1)*(x-2)*(x-3)
h=sym('x*(x*(x-6)+11)-6')%嵌套形式
h=
x*(x*(x-6)+11)-6
下面我们将使用上面讲的函数对其化简
1.pretty函数
例给出相应的符号表达式形式。
pretty(f)
32
x-6x+11x-6
2.collect函数
例给出相应的符号表达式形式。
collect(g)
ans=
x^3-6*x^2+11*x-6
当有多个符号变量,可以指定按某个符号变量来合并同类项。
下面有x、y符号变量的表达式:
f1=sym('x^3+2*x^2*y+4*x*y+6')
f1=
x^3+2*x^2*y+4*x*y+6
collect(f1,'y')%按y来合并同类项
ans=
(2*x^2+4*x)*y+x^3+6
3.expand函数
例给出相应的符号表达式形式。
expand(g)
ans=
x^3-6*x^2+11*x-6
4.horner函数
例给出符号表达式的嵌套形式。
horner(f)
ans=
x*(x*(x-6)+11)-6
5.factor函数
例给出符号表达式的因式形式。
factor(f)
ans=
(x-1)*(x-2)*(x-3)
6.simplify函数
例利用三角函数来简化符号表达式cos2x-sin2x。
y=sym('cos(x)^2-sin(x)^2')
y=
cos(x)^2-sin(x)^2
simplify(y)
ans=
2*cos(x)^2-1
7.simple函数
simple函数给出多种简化形式,给出除了pretty、collect、expand、factor、simplify简化形式之外的radsimp、combine、combine(trig)、convert形式,并寻求包含最少数目字符的表达式简化形式。
例利用simple简化符号表达式cos2x-sin2x。
simple(y)
simplify:
2*cos(x)^2-1
radsimp:
cos(x)^2-sin(x)^2
combine(trig):
cos(2*x)
factor:
(cos(x)-sin(x))*(cos(x)+sin(x))
expand:
cos(x)^2-sin(x)^2
combine:
cos(2*x)
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)^2
convert(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
ans=
cos(2*x)
3.3.3符号表达式的替换
在MATLAB中可以使用subs函数可用来进行对符号表达式中符号变量的替换。
语法:
subs(s)%用给定值替换符号表达式s中的所有变量
subs(s,new)%用new替换符号表达式s中的自由变量
subs(s,old,new)%用new替换符号表达式s中的old变量
用subs函数对符号表达式(x+y)2+3(x+y)+5进行替换。
f=sym('(x+y)^2+3*(x+y)+5')%创建符号表达式
f=
(x+y)^2+3*(x+y)+5
x=5;
f1=subs(f)%用工作空间的给定值替换x
f1=
(5+y)^2+20+3*y
f2=subs(f,'x+y','s')%用s替换x+y
f2=
((s))^2+3*((s))+5
f3=subs(f,'x+y',5)%用常数5替换x+y
f3=
45
f4=subs(f,'x','z')%用z替换x
f4=
((z)+y)^2+3*((z)+y)+5
3.3.4符号数值任意精度控制和运算
在MATLAB的符号运算工具箱(SymbolicMathToolbox)中共包含3种算术运算:
A数值类型matlab的浮点算术运算
B有理数类型maple的精确符号运算
Cvpa类型maple的任意精度算术运算
1.浮点运算
例:
1/2+1/3--(定义输出格式formatlong)
ans=
0.83333333333333
2.符号运算
例:
sym(1/2)+(1/3)
ans=
5/6--精确解
3.任意精度算术运算
任意精度的VPA型运算可以使用digits和vpa命令来实现。
语法:
digits(n)%设定默认的精度
说明:
n为所期望的有效位数。
digits函数可以改变默认的有效位数来改变精度,随后的每个进行Maple函数的计算都以新精度为准。
当有效位数增加时,计算时间和占用的内存也增加。
命令“digits”用来显示默认的有效位数,默认为32位。
语法:
S=vpa(s,n)%将s表示为n位有效位数的符号对象
说明:
s可以是数值对象或符号对象,但计算的结果S一定是符号对象;当参数n省略时则以给定的digits指定精度。
vpa命令只对指定的符号对象s按新精度进行计算,并以同样的精度显示计算结果,但并不改变全局的digits参数。
例对表达式
进行任意精度控制的比较。
a=sym('2*sqrt(5)+pi')
a=
2*sqrt(5)+pi
digits%显示默认的有效位数
Digits=32
vpa(a)%用默认的位数计算并显示
ans=
7.6137286085893726312809907207421
vpa(a,20)%按指定的精度计算并显示
ans=
7.6137286085893726313
digits(15)%改变默认的有效位数
vpa(a)%按digits指定的精度计算并显示
ans=
7.61372860858937
例用三种运算方式表达式比较2/3的结果。
a1=2/3%数值型
a1=
0.6667
a2=sym(2/3)%有理数型
a2=
2/3
a3=vpa('2/3',32)%VPA型
a3=
.66666666666666666666666666666667
总结
▪三种运算方式中数值型运算的速度最快。
▪有理数型符号运算的计算时间和占用内存是最大的,产生的结果是非常准确的。
▪VPA型的任意精度符号运算比较灵活,可以设置任意有效精度,当保留的有效位数增加时,每次运算的时间和使用的内存也会增加。
3.3.5符号与数值间的转换
1.将符号表达式转换成数值表达式
将符号表达式转换成数值表达式主要是通过函数numeric或eval来实现
>>p='1+sqrt
(2)/2';
>>numeric(p)
ans=
1.7071
>>eval(p)
ans=
1.7071
2.将数值转换成符号表达式
将数值转换成符号表达式主要是通过函数sym来实现。
>>p=1.7071;
>>n=sym(p)
n=
17071/10000
3.符号表达式与多项式的转换
构成多项式的符号表达式f(x)可以与多项式系数构成的行向量进行相互转换,MATLAB提供了函数sym2poly和poly2sym实现相互转换。
(1)sym2poly函数
例3-3将符号表达式2x+3x2+1转换为行向量。
f=sym('2*x+3*x^2+1')
f=
2*x+3*x^2+1
sym2poly(f)%转换为按降幂排列的行向量
ans=
321
f1=sym('a*x^2+b*x+c')
f1=
a*x^2+b*x+c
注意:
只能对含有一个变量的符号表达式进行转换。
(2)poly2sym函数
【例3.12续】将行向量转换为符号表达式。
g=poly2sym([132])%默认x为符号变量的符号表达式
g=
x^2+3*x+2
g=poly2sym([132],sym('y'))%y为符号变量的符号表达式
g=
y^2+3*y+2
3.3.6求反函数和复合函数
在MATLAB中finverse函数可以求得符号函数的反函数。
语法:
finverse(f,v)%对指定自变量v的函数f(v)求反函数
说明:
当v省略,则对默认的自由符号变量求反函数。
1.求反函数
【例3.11】求tex的反函数。
f=sym('t*e^x')%原函数
f=
t*e^x
g=finverse(f)%对默认自由变量求反函数
g=
log(x/t)/log(e)
g=finverse(f,'t')%对t求反函数
g=
t/(e^x)
symst
g=finverse(f,t)
2.求复合函数
【例3.11续】计算tex与ay2+by+c的复合函数。
f=sym('t*e^x');%创建符号表达式
g=sym('a*y^2+b*y+c');%创建符号表达式
h1=compose(f,g)%计算f(g(x))
h1=
t*e^(a*y^2+b*y+c)
h2=compose(g,f)%计算g(f(x))
h2=
a*t^2*(e^x)^2+b*t*e^x+c
h3=compose(f,g,'z')%计算f(g(z))
h3=
t*e^(a*z^2+b*z+c)
【例3.11续】计算得出tex与y2的复合函数。
f1=sym('t*e^x');
g1=sym('y^2');
h1=compose(f1,g1)
h1=
t*e^(y^2)
h2=compose(f1,g1,'z')%计算f(g(z))
h2=
t*e^(z^2)
h3=compose(f1,g1,'t','y')%以t为自变量计算f(g(z))
h3=
y^2*e^x
3.4符号矩阵
符号矩阵和符号向量中的元素都是符号表达式。
3.4.1符号矩阵的生成
1使用sym
符号矩阵可通过函数sym来生成。
符号矩阵的元素是任何不带等号的符号表达式,各符号表达式的长度可以不同;符号矩阵中,以空格或逗号分隔的元素指定的是不同列的元素,而以分号分隔的元素指定的是不同行的元素。
A=sym('[a,b;c,d]')
A=
[a,b]
[c,d]
symsabcd
A=[ab;cd]
A=
[a,b]
[c,d]
例3-4比较符号矩阵与字符串矩阵的不同。
A=sym('[a,b;c,d]')%创建符号矩阵
A=
[a,b]
[c,d]
B='[a,b;c,d]'%创建字符串矩阵
B=
[a,b;c,d]
C=sym(B)%转换为符号矩阵
C=
[a,b]
[c,d]
whos
NameSizeBytesClass
A2x2312symobject
B1x918chararray
C2x2312symobject
Grandtotalis25elementsusing642bytes
2.用字符串直接创建矩阵
模仿matlab数值矩阵的创建方法
需保证同一列中各元素字符串有相同的长度
例:
A=['[a,2*b]';'[3*a,0]']
A=
[a,2*b]
[3*a,0]
3.4.2符号矩阵的运算
符号矩阵的运算主要包括符号矩阵的一些基本运算以及符号矩阵的常用函数运算。
1.符号矩阵的四则运算
在MATLAB中,进行符号运算的四则运算非常方便。
实际上,它与数值矩阵的四则运算完全相同,这大大地方便了用户的操作。
符号表达式的加、减、乘、除运算可分别有函数symadd、symsub、symmul、symdiv来实现,也可与矩阵的数值运算一样,用“+”、“-”、“×”、“÷”符号进行运算,而符号表达式的幂运算也可以由函数sympow来实现,也可以由幂运算符“^”来实现。
2.符号矩阵的其他一些基本运算
符号矩阵的其他一些基本运算包括符号矩阵的转置、行列式、秩、指数运算等。
(1)符号矩阵的转置运算
符号矩阵的转置运算由函数transpose来实现。
例>>A=sym('[cos(x),sin(x);x^2+x+1tan(x)]');
>>B=transpose(A)
B=
[cos(x),x^2+x+1]
[sin(x),tan(x)]
(2)符号矩阵的行列式运算
符号的行列式运算