第六章 符号计算new.docx
- 文档编号:23868431
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:28
- 大小:128.52KB
第六章 符号计算new.docx
《第六章 符号计算new.docx》由会员分享,可在线阅读,更多相关《第六章 符号计算new.docx(28页珍藏版)》请在冰豆网上搜索。
第六章符号计算new
第六章符号计算
6.1符号对象的创建
6.1.1符号对象的生成
符号计算工具箱定义了一种新的MATLAB数据类型,叫做符号对象。
在MATLAB内部,符号对象的数据存储格式是符号字符串。
sym函数用于创建符号对象,包括符号常量、符号变量和符号表达式。
【调用格式】
f=sym(arg)把数值、字符串或者表达式arg转换为符号对象f
f=sym(argn,flagn)把数值或者数值表达式argn转换为flagn格式的符号对象
f=sym('argv',flagv)把字符串'argv'按照flagv的格式转换为符号对象
symsargv1argv2...定义argv1、argv2等为符号对象
symsarg1arg2...flagv定义arg1、arg2等为flagv格式的符号对象
【说明】
1.对于数值或者数值表达式argn,flagn可以取以下值:
'd'最接近的十进制浮点精度表示
'e'带估计误差的有理表示
'f'十六进制浮点数表示
'r'最接近的有理表示,MATLAB的缺省表示方法
2.对于字符串变量名argv,flagv可以取以下“限定”项:
'positive'“正实数”符号变量
'real'“实数”符号变量
'unreal'“非实数”符号变量
3.syms是sym函数的简化书写方式,各符号对象之间只能用空格分开。
6.1.2符号常量
用sym函数可以定义符号常量对象,包括符号标量对象和符号常量数组对象,定义符号常量对象的同时也可以指定数值常量的表示方法。
例6.1.1符号常量的定义
>>a=[1/3,sqrt(5),pi+sqrt
(2)];%定义数值数组
>>s1=sym([1/3,sqrt(5),pi+sqrt
(2)],'d');%用十进制方式表示符号常量
>>s2=sym([1/3,sqrt(5),pi+sqrt
(2)]);%用最接近的有理方式表示符号常量
>>s3=sym('[1/3,sqrt(5),pi+sqrt
(2)]');%绝对准确的符号数值表示,输入为字符串
6.1.3符号变量与符号表达式
1.定义符号变量和符号表达式
例6.1.2符号变量和符号表达式的定义
>>x=sym('x','real');%定义实数符号变量x
>>symyreal;%定义实数符号变量y
>>z=x+i*y;%定义符号表达式对象z
>>conj(z)%符号变量求共轭复转置
>>f=z*conj(z);%符号表达式对象
>>f=simple(f)%符号表达式对象化简
f=
x^2+y^2
例6.1.3符号变量与符号矩阵
>>symsabc;%定义符号变量a,b,c
>>A=[a,b,c;b,c,a;c,a,b];%定义符号矩阵A
>>sum(A(:
1));%求矩阵A第一列的元素的和
>>sum(A(1,:
))==sum(A(:
2))%符号对象的关系运算
>>det(A);%矩阵求行列式
>>symsalphabeta;%定义符号变量alpha和beta
>>A(1,3)=beta;%矩阵元素赋值
>>A=subs(A,a,alpha)%符号表达式的替换操作,矩阵A中的a用alpha代替
2.符号表达式中自变量的确定
在数学表达式或者数学函数中,一般都含有自变量。
为了便于进行数学运算,通常要显示的指定表达式中的自变量,如果不指定自变量,MATLAB会根据上下文关系,识别表达式中默认的自变量(独立自由的符号变量)。
识别表达式中自变量的基本原则是:
按照字母表中靠近小写字母x的顺序识别,最靠近字母x的变量被第一个识别为自变量。
MATLAB还提供了自变量识别函数findsym。
【调用格式】
findsym(exp)识别表达式exp中所有的自由符号变量
findsym(exp,n)识别表达式exp中最靠近x的n个独立自由变量
【说明】
1.表达式可以是符号矩阵,此时变量识别是对整个矩阵进行的。
2.函数识别的是“独立的”“自由的”符号变量,符号常量或者非独立的符号变量无法被识别。
3.识别次序是按照靠近x的远近进行的,区分大小写,总认为大写字母距离x的距离大于所有小写字母。
例6.1.4符号表达式中自变量的识别
>>symsabxXY;%定义符号变量
>>k=sym(2.5);
>>z=sym('c*sqrt(alpha)+y*sin(beta)');%定义符号表达式对象(变量)z
>>exp=a*z*X+k*Y+b^x%定义符号表达式变量exp
exp=
a*(c*alpha^(1/2)+y*sin(beta))*X+5/2*Y+b^x
?
?
?
>>k=sym(2.5);%定义符号常量k,无法被识别
>>findsym(exp)%自动识别所有自由独立变量,k为常量,z为非独立
>>findsym(exp,3)%识别exp中前3个靠近x的独立自由变量
6.1.4符号数学函数
在MATLAB中,可以定义表示数学函数的符号对象,既能建立具有详细运算关系的函数,又能建立抽象数学函数。
定义符号数学函数有2种方法:
1.用符号表达式
2.用函数M文件(在函数M文件中用符号变量作为输入变量)
例6.1.5用符号表达式定义符号数学函数
>>symsxyz%定义函数自变量
>>r=sqrt(x^2+y^2+z^2);%定义函数r
>>t=atan(y/x);%定义函数t
>>f=sin(x*y)/(x*y);%定义函数f
例6.1.6用函数M文件来定义符号数学函数,下列代码定义了函数
。
functionz=sinc(x)
%SINC符号函数
%sin(x)/x数学计算公式
%接受符号变量作为输入变量
ifisequal(x,sym(0))%如果自变量值为符号0,则函数值为1
z=1;
else
z=sin(x)/x;
end
例6.1.7建立抽象的符号数学函数
>>f=sym('f(x)')%建立抽象函数f(x)
>>symsxh;
>>df=(subs(f,x,x+h)-f)/h%建立抽象函数df,表示f(x)的导数表达式
df=
(f(x+h)-f(x))/h
>>g=subs(df,'f','sin')%建立sin(x)的导数函数的定义
g=
((sin)(x+h)-(sin)(x))/h
>>limit(g,h,0)%根据导数定义,求sin(x)的导数
ans=
cos(x)
6.1.5符号数值计算的精度
数值计算受计算机字长的限制,每次数值计算都会产生截断误差。
在MATLAB中,数值计算的精度大约为16位数字。
对于符号计算来说,只要能获得解析结果,其计算结果是绝对准确的,不包含任何误差。
但是当将符号数值对象转换成数值数据时,就会产生误差,涉及到转换精度问题。
MATLAB的符号计算工具箱提供3种算术运算:
1.数值运算(16位数字精度)
2.符号运算(绝对准确)
3.任意精度运算(用户指定运算精度)
有关符号运算精度的函数及其调用方法如下:
【调用格式】
n=digits获取当前采用的数值计算精度
digits(n)设置数值计算精度的有效位为n,除非再次设定,否则始终有效
xs=vpa(x)在当前精度下,给出变量x的数值符号结果xs
xs=vpa(x,n)在n位精度下,给出变量x的数值符号结果xs
【说明】
1.相对精度位数n表示有效数字位数。
2.x可以是符号常量,也可以是数值对象。
3.返回值xs是符号结果,一定是符号对象。
例6.1.8符号数值计算精度
>>z=1.0e-16
>>x=1.0e+2
>>digits(14)%设置数值运算精度为14位
>>y=vpa(x*z+1)%在14位精度下计算y
6.1.6符号对象与其他数据类型之间的转换
数值、字符和符号是MATLAB中3种不同的数据类型。
MATLAB提供了不同数据类型之间的转换指令。
表6.1.1介绍了MATLAB中实现符号对象到数值、字符串之间的转换指令。
表6.1.1符号对象和其他数据类型之间的转换指令表
函数名称
功能
函数名称
功能
char
将符号对象转换为字符串
uint32
将符号对象转换为32位无符号整数
double
将符号对象转换为双精度数值
uint64
将符号对象转换为64位无符号整数
int8
将符号对象转换为8位整数
single
将符号对象转换为单精度数值
int16
将符号对象转换为16位整数
sym2poly
将符号多项式转换为数值系数向量
int32
将符号对象转换为32位整数
poly2sym
多项式系数向量转换为符号多项式
int64
将符号对象转换为64位整数
vpa
转换为符号运算结果
uint8
将符号对象转换为8位无符号整数
sym
转为为符号对象
uint16
将符号对象转换为16位无符号整数
pretty
转换为易读的显示方式
例6.1.9多项式和符号对象之间的转换
>>symx;
>>f=x^4-3*x^2+3-5*x%定义符号多项式对象
>>p1=sym2poly(f)%将符号多项式对象转换为数值系数向量
p1=
10-3-53
>>p1s=poly2str(p1,'y');%将多项式数值系数向量转换为多项式字符串格式
>>f2=poly2sym(p1);%将多项式数值系数向量转换为多项式符号对象
>>pretty(f2,'s');%将多项式符号对象显示为易读格式
6.2符号对象的代数运算
6.2.1符号对象的运算
1.符号对象的基本代数运算
符号对象的基本代数运算和普通数值变量一样,可以使用算术运算符、关系运算符(仅能使用==和~=),其运算符的定义和数值运算相同。
例6.2.1符号矩阵的基本代数运算
>>symst;
>>G=[cos(t),sin(t);-sin(t),cos(t)];
>>A=G*G;%符号矩阵的乘法
>>A=simple(A);%化简为最简表达式
>>I=G.'*G;%符号数组乘法
>>I=simple(I);%化简为最简表达式
I=
[1,0]
[0,1]
>>F=[cos(t),-sin(t);sin(t),cos(t)];
>>(F+G)/2;%符号矩阵加法和符号矩阵与标量的除法
2.符号对象的函数运算
数值计算使用的函数基本上也可以用于符号计算,包括三角函数(atan2除外)、指数函数、对数函数(log2、log10除外)、复数函数(angle除外)、线性代数函数和矩阵函数。
例6.2.2符号矩阵的函数运算
>>H=hilb(3);%生成3×3的希尔伯特数值矩阵
>>H=sym(H);%将数值矩阵转为符号常数矩阵
>>inv(H);%符号矩阵求逆
>>det(H)%符号矩阵求行列式的值
ans=
1/2160
>>symss
>>H(1,1)=s;%将符号元素赋值为符号变量s,使矩阵变为非奇异矩阵
>>Z=det(H)%带有符号变量的符号矩阵求行列式的值
Z=
1/240*s-1/270
>>sol=solve(Z)%求行列式的根
sol=
8/9
>>H=subs(H,s,sol);%将矩阵行列式的根代入符号矩阵,使矩阵变为奇异矩阵
>>det(H);%奇异矩阵的行列式值
>>inv(H);%奇异矩阵求逆
>>eig(H);%符号矩阵的特征值
6.2.2符号表达式分解、展开与化简
MATLAB提供了符号表达式的因式分解、展开和化简函数。
【调用格式】
collect(expr,v)合并符号表达式expr中符号对象v的同类项系数
expand(expr)对表达式expr进行多项式、三角函数、指数对数等函数展开
factor(expr)对符号表达式expr做因式分解
horner(expr)把多项式expr分解为嵌套形式
[n,d]=numden(expr)提取表达式最小分母公因子d和相应的分子多项式n
simplify(expr)用多种恒定变换对表达式expr进行综合化简
simple(expr)把expr化简为最简表达式
【说明】上述表达式expr可以是符号矩阵,此时函数对符号矩阵的每个元素进行相应操作。
例6.2.3符号表达式的展开和分解
>>f=sym('(x^3-6*x^2+10*x-5)+(x-1)');%定义原始的符号表达式
>>fc=collect(f);%符号表达式合并同类项
>>ff=factor(f);%符号表达式因式分解
>>fh=horner(f);%符号表达式的嵌套分解
>>fe=expand(fh);%符号表达式的展开
>>factor(1025);%正整数的质数分解,1025=5×5×41
例6.2.4写出矩阵
各元素的分子多项式和分母多项式
>>symsx;
>>A=[1/4,1/(2*x-1)+1/(x+1);2/(x^2-1),3*x+2];
>>[n,d]=numden(A);%提取表达式最小分母公因子d和相应的分子多项式n
>>pretty(simplify(n./d));
例6.2.5化简
解:
用simplify进行多次化简也得不到最简结果,用simple化简可以得到最简结果
>>symsx;
>>f=(1+3/x+3/x^2+1/x^3)^(1/3);
>>sfy1=simplify(f);
>>sfy2=simplify(sfy1);
>>sp1=simple(f);
>>sp2=simple(sp1)
sp2=
1+1/x
6.2.3符号表达式的置换操作
MATLAB提供了子表达式的置换函数。
通常在这几种情况下使用子表达式的置换函数:
第一,符号计算结果中多次出现同一个表达式,为了阅读方便,可以把这个表达式用符号变量来置换;第二,可以用符号常量对象置换表达式中的自变量,实现表达式求值;第三,通过置换某些表达式可以生成新的表达式。
1.自动置换函数
【调用格式】
[RS,vn]=subexpr(S,vn)用符号变量vn置换S中的子表达式,并重写S为RS。
[RS,vn]=subexpr(S,'vn')
例6.2.6对一元三次方程
的符号解进行子表达式的置换。
>>t=solve('a*x^3+b*x^2+c*x+d=0');
>>[r,s]=subexpr(t,'s')
2.通用置换函数
【调用格式】
RS=subs(S,old,new)用new置换S中old,生成RS
【说明】
1.old是被替换的子表达式,可以是符号变量,也可以是字符串表达式。
2.new是替换old的值,可以是符号常量、符号变量、符号表达式,也可以是数值。
3.如果要替换多个子表达式,则old和new为细胞数组。
例6.2.7通用置换函数。
>>symsax;
>>f=a*cos(x)+1;
>>f1=subs(f,'cos(x)',sym('y'));%用符号变量替换
>>f2=subs(f,{a,x},{3,sym('pi/4')})%用符号常量替换,
>>f3=subs(f,{a,x},{3,pi/4});%用双精度数替换
>>f4=subs(f,{a,x},{0:
3,0:
pi/3:
pi});%用双精度数组替换
>>f5=subs(f,x,sym('exp(-t)'))%用符号表达式替换
f5=
a*cos(exp(-t))+1
6.2.4符号函数的反函数
【调用格式】
g=finverse(f,v)求指定自变量为v的函数f(v)的反函数g(v)
g=finverse(f)求函数f对缺省的自变量(由findsym确定)的反函数g
例6.2.8求
的反函数。
>>symsx;f=(x^2+1)^(1/2);
>>g=finverse(f);
6.2.5符号函数的复合函数
【调用格式】
fg=compose(f,g,x,y,z)对
和
求复合函数
fg=compose(f,g)对
和
求复合函数
,自变量由findsym确定
例6.2.9求复合函数。
>>symsxyztu;
>>f=1/(1+x^2);g=sin(y);h=x^t;p=exp(-y/u);
>>compose(f,g);
>>compose(f,g,t);
>>compose(h,g,x,z)
ans=
sin(z)^t
>>compose(h,g,t,z);
>>compose(h,p,x,y,z);
>>compose(h,p,t,u,z)
ans=
x^exp(-y/z)
6.3符号微积分
6.3.1符号微分和雅可比矩阵
求导数、高阶导数、偏导数是常见的数学运算,MATLAB提供这方面的符号微分函数。
【调用格式】
df=diff(f,v,n)求
,即求函数
对
的n阶导数
R=jacobian(f,v)求多元向量函数
的雅可比矩阵,即
例6.3.1
,求
、
和
>>symsatx;
>>f=[a,t^2;t*sin(x),log(x)];
>>dfx=diff(f,x)%矩阵f对x的一阶导数,也可以写为diff(f)
dfx=
[0,0]
[t*cos(x),1/x]
>>df2t=diff(f,t,2);%矩阵f对t的二阶导数
>>dfxt=diff(diff(f,x),t)
dfxt=
[0,0]
[cos(x),0]
例6.3.2
,求其雅可比矩阵
>>symsxyz;
>>f=[x*y*z;y;x+z];
>>v=[x,y,z];
>>R=jacobian(f,v)
R=
[y*z,x*z,x*y]
[0,1,0]
[1,0,1]
6.3.2函数极限
函数的极限是通过导数来定义的,limit函数用于求函数极限。
【调用格式】
limit(f,x,a)求
limit(f,x,a,'right')求
limit(f,x,a,'left')求
例6.3.3求极限运算。
>>limit(sin(x)/x,x,0);
>>limit(1/x,x,0,'right');
>>limit(1/x,x,0,'left');
>>limit((sin(x+h)-sin(x))/h,h,0)%sin(x)导函数的定义
ans=
cos(x)
>>v=[(1+a/x)^x,exp(-x)];
>>limit(v,x,inf)
ans=
[exp(a),0]
6.3.3符号积分
int函数用于求定积分、不定积分和多重积分的符号解。
【调用格式】
S=int(f,v)求不定积分
,符号计算结果不带积分常数
S=int(f,v,a,b)求定积分
rsums(f,ra,rb)用Riemann和求符号函数
在[ra,rb]区间上的近似积分
【说明】
1.当f为矩阵时,将对矩阵的每个元素做积分运算。
2.v缺省时,积分对findsym确认的变量进行。
3.积分上下限a和b可以是任何数值和表达式
4.rsums函数绘制求积分的曲线,根据用户的选择来确定最终的近似积分值
例6.3.4计算
>>symsat;
>>f=[exp(t),t^4;1,sin(a*t)];
>>int(f,t)
ans=
[exp(t),1/5*t^5]
[t,-1/a*cos(a*t)]
例6.3.5求多重积分
>>symsxyz;
>>V=int(int(int(x^2+y^2+z^2,z,sqrt(x*y),x*y),y,sqrt(x),x^2),x,1,2)
V=
-6072064/348075*2^(1/2)+14912/4641*2^(1/4)+64/225*2^(3/4)+51643291/795600
>>vpa(V)
ans=
44.540012164287862574338076759024
6.3.4符号序列求和
symsum函数实现符号序列的求和运算。
【调用格式】
s=symsum(f,v,a,b)求
,a和b为整数,b可以取无穷大
例6.3.6计算
和
>>symstkx;
>>f1=[t,k^2];
>>f2=x^k/sym('k!
');
>>simple(symsum(f1,t,0,t))
ans=[1/2*t*(t+1),(t+1)*k^2]
>>simple(symsum(f2,k,0,inf))
simplify:
exp(x)
6.4符号方程求解
6.4.1符号代数方程组的解
代数方程包括线性、非线性和超越方程等,solve函数用于符号代数方程求解。
【调用格式】
g=solve('eq1','eq2',...,'eqn','var1','var2',...,'varn')
g=solve(exp1,exp2,...,expn,var1,var2,...,varn)
【说明】
1.'eq1','eq2',...,'eqn'是字符串表达式的方程,或者是字符串表达式,如果它们是不含等号的字符串表达式,则相当于方程'eqi=0'
2.'var1','var2',...,'varn'是用字符串表示的方
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第六章 符号计算new 第六 符号 计算 new