510 likes | 699 Views
第五章 符号计算. 符号计算的特点: 一、运算以推理解析的方式进行,因此不受计算误差积累问题困扰; 二、符号计算,或给出完全正确的封闭解,或给出任意精度的数值解(当封闭解不存在时); 三、符号计算指令的调用比较简单,与经典教科书公式相近; 四、计算所需时间较长,有时难以忍受。. 5 .1 符号对象和符号表达式 5 .1.1 符号对象的生成和使用. 定义基本符号对象的指令有两个: sym , syms 格式如下: f=sym(arg) 把数字、字符串或表达式 arg 转换为符号对象 f 。
E N D
第五章 符号计算 符号计算的特点: 一、运算以推理解析的方式进行,因此不受计算误差积累问题困扰; 二、符号计算,或给出完全正确的封闭解,或给出任意精度的数值解(当封闭解不存在时); 三、符号计算指令的调用比较简单,与经典教科书公式相近; 四、计算所需时间较长,有时难以忍受。
5.1 符号对象和符号表达式 5.1.1 符号对象的生成和使用 定义基本符号对象的指令有两个:sym,syms 格式如下: f=sym(arg) 把数字、字符串或表达式arg转换为符号对象f。 f=sym(argn,flagn)把数值或数值表达式argn转换为flagn格式的符号对象。 argv=sym(‘argv’,flagv)按flagv指定的要求把字符串’argv’定义为符号对象argv。
syms(‘argv1’,’argv2’,’argvk’) 把字符argv1,argv2,argvk定义为基本符号对象。 syms argv1 argv2 argvk上述格式的简洁形式。 说明: f=sym(argn,flagn)中的argn是数值或数值表达式时,flagn可取以下选项: ‘d’最接近的十进制浮点精确表示; ‘e’带(数值计算时)估计误差的有理表示; ‘f’十六进制浮点表示‘ ‘r’最接近有理表示,这是缺省设置。 两个正整数p,q构成的p/q,p*pi/q,sqrt(p),2^q,10^q
argv=sym(‘argv’,flagv)中的’argv’是字符时,flagv可取以下“限定性”选项:argv=sym(‘argv’,flagv)中的’argv’是字符时,flagv可取以下“限定性”选项: ‘positive’ 限定argv为“正、实”符号变量。 ‘real’ 限定argv为“实”符号变量。 ‘unreal’ argv为非符号变量。
符号常数形成中的差异 a1=[1/3,pi/7,sqrt(5),pi+sqrt(5)] a2=sym([1/3,pi/7,sqrt(5),pi+sqrt(5)]) a3=sym([1/3,pi/7,sqrt(5),pi+sqrt(5)],'e') a4=sym('[1/3,pi/7,sqrt(5),pi+sqrt(5)]') a24=a2-a4
几种输入下产生矩阵的异同 a1=sym([1/3,0.2+sqrt(2),pi]) a2=sym('[1/3,0.2+sqrt(2),pi]') a3=sym('[1/3 0.2+sqrt(2) pi]') a1_a2=a1-a2
把字符表达式转换为符号变量 y=sym('2*sin(x)*cos(x)') y=simple(y) 用符号计算验证三角等式 sin(fai1)cos(fai2)-cos(fai1)sin(fai2)=sin(fai1-fai2) syms fai1 fai2; y=simple(sin(fai1)*cos(fai2)-cos(fai1)*sin(fai2))
例 求矩阵A=[a11,a12;a21,a22]的行列式值、逆和特征根 syms a11 a12 a21 a22;A=[a11,a12;a21,a22] DA=det(A),IA=inv(A),EA=eig(A) syms A t tao w; yf=int(A*exp(-i*w*t),t,-tao/2,tao/2); Yf=simple(yf)
5.1.2 符号计算中的算符和基本函数 由于matlab采用了重载技术,使得用来构成符号计算表达式的算符和基本函数,无论在形状、名称上、还是在使用方法上,都与数值计算中的算符和基本函数几乎完全相同
5.1.3 识别对象类别的指令 数据对象及其识别指令的使用 (1) clear,a=1;b=2;c=3;d=4; Mn=[a,b;c,d] Mc='[a,b;c,d]' Ms=sym(Mc) (2) SizeMn=size(Mn),SizeMc=size(Mc),SizeMs=size(Ms)
(3) CMn=class(Mn); CMc=class(Mc); CMs=class(Ms) (4)用isa判断每种矩阵的类别(若返回1,表示判断正确) isa(Mn,'double'); isa(Mc,'char'); isa(Ms,'sym') (5) whos Mn Mc Ms
5.1.4 符号表达式中自由变量的确定 findsym(EXPR) 确认表达式EXPR中所有“自由”符号“变量”; findsym(EXPR,N) 从表达式EXPR中确认出靠x最近的N个独立自变量。 说明 EXPR可以是符号矩阵。此时,该指令对自由变量的确认是对整个矩阵进行的,而不是对矩阵元素逐个进行的。
5.1.4 符号表达式中自由变量的确定 对独立自由符号变量的自动辨认。 (1)生成符号变量 syms a b x X Y; k=sym('3');z=sym('c*sqrt(delta)+y*sin(theta)'); EXPR=a*z*X+(b*x^2+k)*Y; (2)找出EXPR中的全部自由符号变量 findsym(EXPR)
(3)在EXPR中确定一个自由符号变量 findsym(EXPR,1) (4)在EXPR中确定2个和3个自由变量时的执行情况 findsym(EXPR,2),findsym(EXPR,3) findsym确定自由变量是对整个矩阵进行的 syms a b t u v x y; A=[a+b*x,sin(t)+u;x*exp(-t),log(y)+v] findsym(A,3)
collect(EXPR,v)对EXPR表达式中指定的符号对象v的同幂项系数进行合并collect(EXPR,v)对EXPR表达式中指定的符号对象v的同幂项系数进行合并 expand(EXPR)对EXPR表达式进行多项式、三角函数、指数对数函数等展开 factor(EXPR)对EXPR表达式(或正整数)进行因式(或因子)分解 horner(EXPR)对多项式EXPR分解成嵌套形式 [n,d]=numden(EXPR)提取表达式EXPR的最小分母公因式d和相应的分子多项式n 5.2 符号表达式和符号函数的操作 5.2.1 符号表达式的操作
simplify(EXPR) 运用多种恒等式转换对表达式EXPR进行综合简化; simple(EXPR) 运用包括simplify在内的各种指令把EXPR转换成最简短形式 pretty(EXPR) 以习惯的“书写”方式显示EXPR表达式 说明 以上指令中的EXPR也可以是符号矩阵。在这种情况下,这些指令将对该矩阵的元素逐个进行操作。
按不同的方式合并同幂项 EXPR=sym('(x^2+x*exp(-t)+1)*(x+exp(-t))'); expr1=collect(EXPR) expr2=collect(EXPR,'exp(-t)')
(1)除x外不含其他自由变量的情况 syms a x; f1=x^4-5*x^3+5*x^2+5*x-6;factor(f1) (2)含其他自由变量的情况 f2=x^2-a^2;factor(f2) (3)对正整数的质数分解 factor(1025) factor 指令的使用 对多项式进行嵌套型分解 clear;syms a x; f1=x^4-5*x^3+5*x^2+5*x-6;horner(f1)
(1)求矩阵各元素的分子、分母多项式 syms x; A=[3/2,(x^2+3)/(2*x-1)+3*x/(x-1);4/x^2,3*x+4]; [n,d]=numden(A) pretty(simplify(A)) (2) pretty(simplify(n./d))
(1)运用simplify简化 syms x;f=(1/x^3+6/x^2+12/x+8)^(1/3); sfy1=simplify(f),sfy2=simplify(sfy1) (2)运用simple简化 g1=simple(f),g2=simple(g1); 说明 simple给出的简化式比simplify给出的更短;多次使用simple指令,可找到最少字母的简化式
syms x;ff=cos(x)+sqrt(-sin(x)^2); ssfy1=simplify(ff),ssfy2=simplify(ssfy1) gg1=simple(ff),gg2=simple(gg1)
5.2.2 符号函数的求反和复合 g=finerse(f,v)对指定自变量为v的函数f(v),求反函数 g=finverse(f)对缺省自变量求反函数g; fg=compose(f,g,v,w,t)对f(v)和v=g(w)求复合函数fg=f(g(w))|w=t fg=compose(f,g)对f(.)和v=g(.)求复合函数fg=f(g(.))。
说明 v,w分别是对函数f和g指定的自变量。t是所得复合函数得自变量符号 finverse(f,g)是finverse(f,v)的缺省形式。此时默认自变量由findsym确定。 compose(f,g)是compose(f,g,v,w,t)的缺省形式。此时,v,w都是由findsym自动对函数f和g进行辨认而定的自变量。
例求f = x2 的反函数 syms x; f=x^2;g=finverse(f) fg=simple(compose(g,f)) 说明: 事实上,x2的反函数有两个,finverse只给出“主”反函数
(1)自变量由机器确定 syms x y u fai t; f=x/(1+u^2);g=cos(y+fai); fg1=compose(f,g) (2)指定自变量 fg2=compose(f,g,u,fai,t)
5.2.3 置换及其应用 1、 自动执行的子表达式置换指令 [RS,ssub]=subexpr(S,ssub) 运用符号变量ssub置换子表达式,重写S为RS。 子表达式的置换表示 syms a b c d W; [V,D]=eig([a b;c d]) [RVD,W]=subexpr([V;D],W) • 被置换的子表达式是机器自动寻找的。其置换原则与pretty指令相同 • RVD的上两行子阵是置换后的特征向量阵;下两行是特征值阵
2、 通用置换指令 RES=subs(ES,old,new) 用new置换ES中的old后产生RES RES=subs(ES,new) 用new置换ES中的自由变量后产生RES。 RES=subs(ES) 用当前内存中已知值置换ES中所有可能的同名变量后产生RES。 subs 的置换规则 (1)产生符号函数 syms a x;f=a*sin(x)+5;
(2)符号变量置换 f1=subs(f,'sin(x)',sym('y')) (3)符号常量置换 f2=subs(f,{a,x},{2,sym(pi/3)}) (4)双精度数值置换 f3=subs(f,{a,x},{2,pi/3}) (5)数值数组置换 f4=subs(subs(f,a,2),x,0:pi/6:pi) f5=subs(f,{a,x},{0:6,0:pi/6:pi})
5.2.4 符号数值精度控制和任意精度计算 任意精度的符号数值 digits 显示当前采用的数值计算的精度 digits(n) 设置今后数值计算以n位相对精度进行 xs=vpa(x) 在digits指定精度下,给出x的数值型符号结果xs。 xs=vpa(x,n) 在n位相对精度下,给出x的数值型符号结果xs
指令使用实例 p0=sym('(1+sqrt(5))/2'); p1=sym((1+sqrt(5))/2) e01=vpa(abs(p0-p1)) p2=vpa(p0) e02=vpa(abs(p0-p2),64) digits
5.2.5 符号对象与其它数据对象间的转换 符号、数值间的转换 phi=sym((1+sqrt(5))/2) double(phi) 各种多项式表示形式之间的转换 syms x;f=x^3+2*x^2-3*x+5; sy2p=sym2poly(f) p2st=poly2str(sy2p,'x') p2sy=poly2sym(sy2p) pretty(f,'x')
5.3 符号微积分 5.3.1 符号序列的求和 • s = symsum(f,v,a,b) 求通式f在指定变量v取遍[a,b]中所有整数时的和。 • 说明 • f是矩阵时,求和对元素逐个进行,但自变量定义在整个矩阵上。 • v缺省时,f中的自变量由findsym自动辨认;b可以取有限整数,也可以取无穷大。 • a,b可同时缺省,此时默认求和的自变量区间为[0,v-1]
例 求 • syms k t;f1=[t k^3];f2=[1/(2*k-1)^2,(-1)^k/k]; • s1=simple(symsum(f1)) • s2=simple(symsum(f2,1,inf)) • 通式中 的自变量只取整数值 • 指令中的f可以是符号矩阵,此时求和操作将对矩阵中的“元素通式”逐个进行。但通式矩阵的自变量及其取值区间对各“元素通式”是相同的。 • 由于findsym对f符号矩阵的自变量进行确认时,不是对该矩阵元素分别进行的,而是把矩阵f作为一个统一的对象处理的。所以当f矩阵中含有一个以上非常数符号变量时要特别注意,求和对哪个符号变量进行。
5.3.2 符号微分和jacobian 矩阵 dfdvn=diff(f,v,n) 求 fjac=jacobianfv(f,v) 求多元向量函数f的jacobian矩阵 • f是矩阵时,求导对元素逐个进行,但自变量定义在整个矩阵上。 • v缺省时,自变量会自动由findsym确认;n缺省时,默认n=1。 • 注意:在数值计算中,指令diff是用来求差分的。
syms a t x;f=[a,t^3;t*cos(x), log(x)]; df=diff(f) dfdt2=diff(f,t,2) dfdxdt=diff(diff(f,x),t)
syms x1 x2 x3; f=[x1*exp(x2);x2;cos(x1)*sin(x2)]; v=[x1 x2]; fjac=jacobian(f,v)
5.3.3 符号积分 • 通用积分指令 • intf=int(f,v) 给出f对指定变量v的(不带积分常数的)不定积分 • intf =int(f,v,a,b) 给出f对指定变量v的定积分 • 说明: • 当f是矩阵时,积分将对元素逐个进行 • v缺省时,积分对findsys确认的变量进行 • a,b分别是积分的下、上限,准许他们取任何值或符号表达式
syms a b x; f=[a*x,b*x^2;1/x,sin(x)]; disp('The integral of f is'); int(f) pretty(int(f))
syms x y z F2=int(int(int(x^2+y^2+z^2,z,sqrt(x*y),x^2*y),y,sqrt(x),x^2),x,1,2) VF2=vpa(F2)
5.4 符号积分变换 Fourier 变换及其反变换 Fw=fourier(ft,t,w) 求“时域”函数ft的Fourier变换Fw ft=ifourier(Fw,w,t)求“频域”函数Fw的Fourier反变换ft
(1)求Fourier 变换 syms t w;ut=sym('Heaviside(t)'); UT=fourier(ut) UTS=simple(UT) (2)求Fourier 反变换进行验算 Ut=ifourier(UT,w,t) Uts=ifourier(UTS,w,t)
5.5 符号代数方程的求解 5.5.1 线性方程组的符号解 例 求d+n/2+p/2=q, n+d+q-p=10, q+d-n/4=p,q+p-n-8d=1线性方程组的解 A=sym([1 1/2 1/2 -1;1 1 -1 1;1 -1/4 -1 1;-8 -1 1 1]); b=sym([0;10;0;1]); X1=A\b
5.5.2 一般代数方程组的解 • S=solve(‘eq1’,’eq2’,…,’eqn’,’v1’,’v2’,…,’vn’) • 求方程组关于指定变量的解(标准格式) • S=solve(exp1,exp2,…,expn,v1,v2,…,vn) • 求方程组关于指定变量的解(可用格式) • 说明; • ‘eq1’,’eq2’,…,’eqn’或是字符串表达的方程,或是字符串表达式; ’v1’,’v2’,…,’vn’)是字符串表达的求解变量名。 • exp1,exp2,…,expn只能是符号表达式;v1,v2,…,vn • 是求解的符号变量
如eq1,eq2,…eqn是不含“等号”的表达式,则指令是对eq1=0,eq2=0,….,eqn=0求解如eq1,eq2,…eqn是不含“等号”的表达式,则指令是对eq1=0,eq2=0,….,eqn=0求解 • S是一个构架数组。 • 在得不到“封闭型解析解”时,给出数值解。 例 求方程组uy^2 + vz + w = 0 , y +z+w= 0 关于y, z 的解。 S=solve('u*y^2+v*z+w=0','y+z+w=0','y','z') disp('S.y'),disp(S.y),disp('S.z'),disp(S.z)
5.6 符号微分方程的求解 求微分方程符号解的一般指令 • S=dsolve(‘a_1’,’a_2’,…,’a_n’) • 求解符号常微分方程最完整、通用的指令调用格式 • 说明 • 输入参数包括3部分内容:微分方程、初始条件、指定独立变量。其中微分方程是必不可少的输入内容。输入参数必须以字符形式编写。 • 在本调用格式中,输出参数S是“结构对象”。
图示微分方程y = xy’ − ( y’)2的通解和奇解的关系 y=dsolve('y=x*Dy-(Dy)^2','x') clf,hold on,ezplot(y(2),[-6,6,-4,8],1) cc=get(gca,'Children'); set(cc,'Color','r','LineWidth',5) for k=-2:0.5:2; ezplot(subs(y(1),'C1',k),[-6,6,-4,8],1); end hold off, title('\fontname{隶书}\fontsize{16}通解和奇解')
5.7 可视化数学分析界面 mfun 对maple中若干经典特殊函数实施数值计算 mfunlist 能被mfun计算的maple经典特殊函数列表 mhelp 查阅maple中的库函数及其调用方法 maple 进入maple工作空间计算,结果送回matlab工作间 procread 把按maple格式写的源程序读入maple工作空间
5.7.1 单变量函数分析的交互界面 funtool
5.7.2 泰勒级数逼近分析界面 taylortool