昆明理工大学上机安排3符号计算讲解.docx
- 文档编号:3198705
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:21
- 大小:78.09KB
昆明理工大学上机安排3符号计算讲解.docx
《昆明理工大学上机安排3符号计算讲解.docx》由会员分享,可在线阅读,更多相关《昆明理工大学上机安排3符号计算讲解.docx(21页珍藏版)》请在冰点文库上搜索。
昆明理工大学上机安排3符号计算讲解
符号计算学习要点
MATLAB的符号数学工具箱(SymbolicMathToolbox)将符号运算结合到MATLAB的数值运算环境中。
符号数学工具箱是以Maple软件内核为符号运算的引擎,当MATLAB进行符号运算时,就转入Maple去计算并将结果返回到MATLAB的命令窗口。
符号数学工具箱与其它工具箱不同,它不针对特殊专业或专业分支,而适用于广泛的用途;它使用字符串来进行符号分析,而不是数值分析。
它涉及微积分、简化、复合、求解代数方程及微分方程等,有丰富的线性代数工具,支持Fourier,Laplace,z变换及逆变换。
符号计算是数字运算的自然扩展,其特点包括:
不受计算误差的困扰;
计算可以给出完全正确的封闭解或任意精度的数值解;
计算的指令比较简单,所需要的时间较长。
自然科学理论分析中的公式、关系式及其推导是符号计算要解决的问题。
数值计算与符号计算的区别:
MATLAB数值计算的对象是数值,而符号计算的对象则是非数值的符号字符串。
例:
下面的代数方程的的根推导说明了符号计算的特点:
(以下例子要在计算机上运行,分析其结果;有些程序可能标点符号是在中文状态下输入的,请复制时改为英文状态下的标点)
一符号对象的创建
函数sym()和命令syms创建符号常量、变量、函数以及表达式,函数class()检验符号对象类型。
sym函数的用处之一是创建单个的符号变量。
这种创建方式不需要在前面有任何说明,使用非常快捷。
正因如此,此创建过程中,包含在表达式内的符号变量并未得到说明,也就不存在于工作空间。
syms函数与sym相反,它需要在具体创建一个符号表达式之前,将这个表达式所包含的全部符号变量创建完毕。
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函数的简化书写方式,各符号对象之间只能用空格分开。
2符号常量
用sym函数可以定义符号常量对象,包括符号标量对象和符号常量数组对象,定义符号常量对象的同时也可以指定数值常量的表示方法。
例符号常量的定义
>>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)]');%绝对准确的符号数值表示,输入为字符串
3符号变量与符号表达式
1.定义符号变量和符号表达式
例符号变量和符号表达式的定义
>>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
例符号变量与符号矩阵
>>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代替
以上例子可以看出:
元素是符号对象的矩阵叫做符号矩阵;符号表达式是由以下部分组成的符号对象:
a.符号常量;
b.符号变量;
c.符号运算符;
d.专用函数。
4符号表达式中自变量的确定
在数学表达式或者数学函数中,一般都含有自变量。
为了便于进行数学运算,通常要显示指定表达式中的自变量,如果不指定自变量,MATLAB会根据上下文关系,识别表达式中默认的自变量(独立自由的符号变量)。
识别表达式中自变量的基本原则是:
按照字母表中靠近小写字母x的顺序识别,最靠近字母x的变量被第一个识别为自变量。
MATLAB还提供了自变量识别函数findsym。
【调用格式】
findsym(exp)识别表达式exp中所有的自由符号变量
findsym(exp,n)识别表达式exp中最靠近x的n个独立自由变量
【说明】
1.表达式可以是符号矩阵,此时变量识别是对整个矩阵进行的。
2.函数识别的是“独立的”“自由的”符号变量,符号常量或者非独立的符号变量无法被识别。
3.识别次序是按照靠近x的远近进行的,区分大小写,总认为大写字母距离x的距离大于所有小写字母。
例符号表达式中自变量的识别
>>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
>>findsym(exp)%自动识别所有自由独立变量,k为常量,z为非独立
>>findsym(exp,3)%识别exp中前3个靠近x的独立自由变量
5符号数学函数
在MATLAB中,可以定义表示数学函数的符号对象,既能建立具有详细运算关系的函数,又能建立抽象数学函数。
定义符号数学函数有2种方法:
1.用符号表达式
2.用函数M文件(在函数M文件中用符号变量作为输入变量)
例用符号表达式定义符号数学函数
>>symsxyz%定义函数自变量
>>r=sqrt(x^2+y^2+z^2);%定义函数r
>>t=atan(y/x);%定义函数t
>>f=sin(x*y)/(x*y);%定义函数f
例用函数M文件来定义符号数学函数,下列代码定义了函数sin(x)=sinc(x)/x。
创建M函数文件如下:
functionz=sinc(x)
%SINC符号函数
%sin(x)/x数学计算公式
%接受符号变量作为输入变量
ifisequal(x,sym(0))%如果自变量值为符号0,则函数值为1
z=1;
else
z=sin(x)/x;
end
例建立抽象的符号数学函数(可用help命令查看subs、limit函数的用法)
>>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)
二符号计算
符号计算有:
代数运算、函数运算、微积分运算、极限运算、级数求和、方程(组)求解等。
A代数运算
符号对象的基本代数运算
符号对象的基本代数运算和普通数值变量一样,可以使用算术运算符、关系运算符(仅能用==和!
=),其运算符的定义和数值运算相同。
例符号矩阵的基本代数运算,查看结果
>>symst;
>>G=[cos(t),sin(t);-sin(t),cos(t)];
>>A=G*G;%符号矩阵的乘法
>>A=simple(A);%化简为最简表达式
>>I=G'.*G;%符号数组乘法
>>I=simple(I);%化简为最简表达式
>>F=[cos(t),-sin(t);sin(t),cos(t)];
>>(F+G)/2;%符号矩阵加法和符号矩阵与标量的除法
B函数运算
数值计算使用的函数基本上也可以用于符号计算,包括三角函数(atan2除外)、指数函数、对数函数(log2、log10除外)、复数函数(angle除外)、线性代数函数和矩阵函数。
例符号矩阵的函数运算,运行下面语句查看结果(去掉分号)
>>H=hilb(3);%生成3×3的希尔伯特数值矩阵
>>H=sym(H);%将数值矩阵转为符号常数矩阵
>>inv(H);%符号矩阵求逆
>>det(H)%符号矩阵求行列式的值
>>symss
>>H(1,1)=s;%将符号元素赋值为符号变量s,使矩阵变为非奇异矩阵
>>Z=det(H)%带有符号变量的符号矩阵求行列式的值
>>sol=solve(Z)%求行列式的根
>>H=subs(H,s,sol);%将矩阵行列式的根代入符号矩阵,使矩阵变为奇异矩阵
>>det(H);%奇异矩阵的行列式值
>>inv(H);%奇异矩阵求逆
>>eig(H);%符号矩阵的特征值
C符号表达式分解、展开与化简
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可以是符号矩阵,此时函数对符号矩阵的每个元素进行相应操作。
例符号表达式的展开和分解
>>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
例写出矩阵
各元素的分子多项式和分母多项式
>>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));
例化简
解:
用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)
D符号表达式的置换操作
MATLAB提供了子表达式的置换函数。
通常在这几种情况下使用子表达式的置换函数:
第一,符号计算结果中多次出现同一个表达式,为了阅读方便,可以把这个表达式用符号变量来置换;第二,可以用符号常量对象置换表达式中的自变量,实现表达式求值;第三,通过置换某些表达式可以生成新的表达式。
1.自动置换函数
【调用格式】
[RS,vn]=subexpr(S,vn)用符号变量vn置换S中的子表达式,并重写S为RS。
[RS,vn]=subexpr(S,'vn')
例对一元三次方程
的符号解进行子表达式的置换。
>>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为细胞数组。
例通用置换函数。
>>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)'))%用符号表达式替换
E符号函数的反函数
【调用格式】
g=finverse(f,v)求指定自变量为v的函数f(v)的反函数g(v)
g=finverse(f)求函数f对缺省的自变量(由findsym确定)的反函数g
例求
的反函数。
>>symsx;f=(x^2+1)^(1/2);
>>g=finverse(f);
F符号函数的复合函数
【调用格式】
fg=compose(f,g,x,y,z)对f(x)和g(y)求复合函数fg(z)=f(g(y))|y=z
fg=compose(f,g)对f(⋅)和g(⋅)求复合函数fg=(fg(⋅)),自变量由findsym确定
例求复合函数。
>>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)
>>compose(h,g,t,z);
>>compose(h,p,x,y,z);
>>compose(h,p,t,u,z)
G符号微分和雅可比矩阵
求导数、高阶导数、偏导数是常见的数学运算,MATLAB提供这方面的符号微分函数。
【调用格式】
df=diff(f,v,n)求
,即求函数f(v)对的n阶导数
R=jacobian(f,v)求多元向量函数f(v)的雅可比矩阵,即
例
求
和
>>symsatx;
>>f=[a,t^2;t*sin(x),log(x)];
>>dfx=diff(f,x)%矩阵f对x的一阶导数,也可写为diff(f)
>>df2t=diff(f,t,2);%矩阵f对t的二阶导数
>>dfxt=diff(diff(f,x),t)
例
,求其雅可比矩阵
>>symsxyz;
>>f=[x*y*z;y;x+z];
>>v=[x,y,z];
>>R=jacobian(f,v)
H函数极限
函数的极限是通过导数来定义的,limit函数用于求函数极限。
【调用格式】
limit(f,x,a)求
limit(f,x,a,'right')求
limit(f,x,a,'left')求
例求极限运算。
>>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)导函数的定义
>>v=[(1+a/x)^x,exp(-x)];
>>limit(v,x,inf)
I符号积分
int函数用于求定积分、不定积分和多重积分的符号解。
【调用格式】
S=int(f,v)求不定积分∫f(v)dv,符号计算结果不带积分常数
S=int(f,v,a,b)求定积分
rsums(f,ra,rb)用Riemann和求符号函数f(x)在[ra,rb]区间上的近似积分
【说明】
1.当f为矩阵时,将对矩阵的每个元素做积分运算。
2.v缺省时,积分对findsym确认的变量进行。
3.积分上下限a和b可以是任何数值和表达式
4.rsums函数绘制求积分的曲线,根据用户的选择来确定最终的近似积分值
例计算
>>symsat;
>>f=[exp(t),t^4;1,sin(a*t)];
>>int(f,t)
例求多重积分
>>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)
>>vpa(V)
J符号级数求和
symsum函数实现符号级数的求和运算。
【调用格式】
s=symsum(f,v,a,b)求
,a和b为整数,b可以取无穷大
例计算
和
>>symstkx;
>>f1=[t,k^2];
>>f2=x^k/sym('k!
');
>>simple(symsum(f1,t,0,t))
>>simple(symsum(f2,k,0,inf))
K符号代数方程组的解
代数方程包括线性、非线性和超越方程等,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'是用字符串表示的方程中的变量名
3.exp1,exp2,...,expn只能是符号表达式,不能是带有等号的表达式方程。
4.var1,var2,...,varn只能是符号变量。
5.返回值g是一个结构体数据,方程组的解用g.var1,g.var2,...,g.varn表示。
6.在无法求得解析解的时候,给出数值解。
例方程组
,分别求其关于y,z和关于u,v,w的解
>>s1=solve('u*y+v*z^2+w=0','y+z+v=0','y','z');%方程组关于的解,从结果来看方程有2组解:
s1=
y:
[2x1sym]
z:
[2x1sym]
>>y=s1.y;z=s1.z;
%方程组关于u,v,w的解,2个方程3个变量,方程有无穷多组解,其中w为自由变量,
>>s2=solve('u*y+v*z^2+w=0','y+z+v=0','u','v','w');
>>u=s2.u;v=s2.v;w=s2.w;
L符号微分方程的解
【调用格式】
g=dsolve('eq1','eq2',...,'eqn','cond1','cond2',...,'condn','v')
【说明】
1.'eq1','eq2',...,'eqn'是微分方程,只能用字符串形式。
微分方程是函数必须的输入变量。
2.'cond1','cond2',...,'condn'是初始条件,也只能用字符串形式。
3.'v'定义了微分方程的独立变量名(微分方程解中的自变量名),只能用字符串形式。
默认的独立变量名为t。
4.微分方程字符串中,Dny表示y的n阶导数,Dy表示y的一阶导数。
5.返回值g是一个结构体变量,要引用其成员才能得到方程的解。
例求微分方程组
的解。
>>s=dsolve('Dx=y,Dy=-x');
>>x=s.x
x=
-C1*cos(t)+C2*sin(t)
>>y=s.y
y=
C1*sin(t)+C2*cos(t)
例求微分方程
的解y(x),初始条件为y(0)=0,y
(1)=1
>>s=dsolve('x*D2y-3*Dy=x^2','y(0)=0,y
(1)=1','x')
s=
4/3*x^4-1/3*x^3
例求微分方程y”+y2=1的解,初始条件为y(0)=0
>>y=dsolve('(Dy)^2+y^2=1','y(0)=0')
y=
sin(t)
-sin(t)
M积分变换
MATLAB的符号计算支持积分变换,对傅氏变换、拉氏变换和Z变换都提供了相应的符号计算函数。
1傅立叶变换及其反变换
【调用格式】
Fw=fourier(ft,t,w)求时域函数ft的傅氏变换Fw
ft=ifourier(Fw,w,t)求频域函数Fw的傅立叶反变换ft
【说明】
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 昆明 理工大学 上机 安排 符号 计算 讲解