330 likes | 548 Vues
第 7 章 MATLAB 符号计算. 7.1 符号计算基础 7.2 符号导数及其应用 7.3 符号积分 7.4 级数 7.5 符号方程求解. 7.1 符号计算基础. 7.1.1 符号对象 1. 建立符号变量和符号常数 (1)sym 函数 sym 函数用来建立单个符号量,例如, a=sym('a') 建立符号变量 a ,此后,用户可以在表达式中使用变量 a 进行各种运算。. 例 7.1 考察符号变量和数值变量的差别。 在 MATLAB 命令窗口,输入命令:
E N D
第7章 MATLAB符号计算 7.1 符号计算基础 7.2 符号导数及其应用 7.3 符号积分 7.4 级数 7.5 符号方程求解
7.1 符号计算基础 7.1.1 符号对象 1. 建立符号变量和符号常数 (1)sym函数 sym函数用来建立单个符号量,例如,a=sym('a')建立符号变量a,此后,用户可以在表达式中使用变量a进行各种运算。
例7.1 考察符号变量和数值变量的差别。 在 MATLAB命令窗口,输入命令: a=sym('a');b=sym('b');c=sym('c');d=sym('d'); %定义4个符号变量 w=10;x=5;y=-8;z=11; %定义4个数值变量 A=[a,b;c,d] %建立符号矩阵A B=[w,x;y,z] %建立数值矩阵B det(A) %计算符号矩阵A的行列式 det(B) %计算数值矩阵B的行列式
例7.2 比较符号常数与数值在代数运算时的差别。 在 MATLAB命令窗口,输入命令: pi1=sym('pi');k1=sym('8');k2=sym('2');k3=sym('3'); % 定义符号变量 pi2=pi;r1=8;r2=2;r3=3; % 定义数值变量 sin(pi1/3) % 计算符号表达式值 sin(pi2/3) % 计算数值表达式值 sqrt(k1) % 计算符号表达式值 sqrt(r1) % 计算数值表达式值 sqrt(k3+sqrt(k2)) % 计算符号表达式值 sqrt(r3+sqrt(r2)) % 计算数值表达式值
(2)syms函数 syms函数的一般调用格式为: syms var1 var2 … varn 函数定义符号变量var1,var2,…,varn等。用这种格式定义符号变量时不要在变量名上加字符分界符('),变量间用空格而不要用逗号分隔。
2. 建立符号表达式 建立符号表达式有以下3种方法: (1)利用单引号来生成符号表达式。 (2)用sym函数建立符号表达式。 (3) 使用已经定义的符号变量组成符号表达式。
7.1.2 基本的符号运算 1. 符号表达式的四则运算 符号表达式的四则运算和其他表达式的运算并无不同,但要注意,其运算结果依然是一个符号表达式。符号表达式的加、减、乘、除运算可分别由函数symadd、symsub、symmul和symdiv来实现,幂运算可以由sympow来实现。
2.符号表达式的提取分子和分母运算 如果符号表达式是一个有理分式或可以展开为有理分式,可利用numden函数来提取符号表达式中的分子或分母。其一般调用格式为: [n,d]=numden(s) 该函数提取符号表达式s的分子和分母,分别将它们存放在n与d中。
3.因式分解与展开 factor(S) 对S分解因式,S是符号表达式或符号矩阵。 expand(S) 对S进行展开,S是符号表达式或符号矩阵。 collect(S) 对S合并同类项,S是符号表达式或符号矩阵。 collect(S,v) 对S按变量v合并同类项,S是符号表达式或符号矩阵。
4.表达式化简 MATLAB提供的对符号表达式化简的函数有: simplify(S) 应用函数规则对S进行化简。 simple(S) 调用MATLAB的其他函数对表达式进行综合化简,并显示化简过程。
5.符号表达式与数值表达式之间的转换 利用函数sym可以将数值表达式变换成它的符号表达式。 函数numeric或eval可以将符号表达式变换成数值表达式。
7.1.3 符号表达式中变量的确定 MATLAB中的符号可以表示符号变量和符号常数。findsym可以帮助用户查找一个符号表达式中的的符号变量。该函数的调用格式为: findsym(S,n) 函数返回符号表达式S中的n个符号变量,若没有指定n,则返回S中的全部符号变量。 在求函数的极限、导数和积分时,如果用户没有明确指定自变量,MATLAB将按缺省原则确定主变量并对其进行相应微积分运算。可用findsym(S,1)查找系统的缺省变量,事实上,MATLAB按离字符'x'最近原则确定缺省变量。
7. 1. 4 符号矩阵 transpose(S) 返回S矩阵的转置矩阵。 determ(S) 返回S矩阵的行列式值。 colspace(S) 返回S矩阵列空间的基。
7.2 符号导数及其应用 7.2.1 函数的极限 limit函数的调用格式为: limit(f,x,a) limit函数的另一种功能是求单边极限,其调用格式为: limit(f,x,a,'right') 或 limit(f,x,a,'left')
例7.10求极限。 在MATLAB命令窗口,输入命令: syms a m x; f=(x^(1/m)-a^(1/m))/(x-a); limit(f,x,a) %求极限(1) f=(sin(a+x)-sin(a-x))/x; limit(f) %求极限(2) limit(f,inf) %求f函数在x→∞(包括+∞和-∞)处的极限 limit(f,x,inf,'left') %求极限(3) f=(sqrt(x)-sqrt(a)-sqrt(x-a))/sqrt(x*x-a*a); limit(f,x,a,'right') %求极限(4)
7.2.2 符号函数求导及其应用 MATLAB中的求导的函数为: diff(f,x,n) diff函数求函数f对变量x的n阶导数。参数x的用法同求极限函数limit,可以缺省,缺省值与limit相同,n的缺省值是1。
例7.3 求函数的导数。 命令如下: syms a b t x y z; f=sqrt(1+exp(x)); diff(f) %求(1)。未指定求导变量和阶数,按缺省规则处理 f=x*cos(x); diff(f,x,2) %求(2)。求f对x的二阶导数 diff(f,x,3) %求(2)。求f对x的三阶导数 f1=a*cos(t);f2=b*sin(t); diff(f2)/diff(f1) %求(3)。按参数方程求导公式求y对x的导数 (diff(f1)*diff(f2,2)-diff(f1,2)*diff(f2))/(diff(f1))^3 %求(3)。求y对x的二阶导数 f=x*exp(y)/y^2; diff(f,x) %求(4)。z对x的偏导数 diff(f,y) %求(4)。z对y的偏导数 f=x^2+y^2+z^2-a^2; zx=-diff(f,x)/diff(f,z) %求(5)。按隐函数求导公式求z对x的偏导数 zy=-diff(f,y)/diff(f,z) %求(5)。按隐函数求导公式求z对y的偏导数
例7.4 在曲线y=x3+3x-2上哪一点的切线与直线y=4x-1平行。 命令如下: x=sym('x'); y=x^3+3*x-2; %定义曲线函数 f=diff(y); %对曲线求导数 g=f-4; solve(g) %求方程f-4=0的根,即求曲线何处的导数为4
7.3 符号积分 7.3.1 不定积分 在MATLAB中,求不定积分的函数是int,其调用格式为: int(f,x) int函数求函数f对变量x的不定积分。参数x可以缺省,缺省原则与diff函数相同。
例7.5 求不定积分。 命令如下: x=sym('x'); f=(3-x^2)^3; int(f) %求不定积分(1) f=sqrt(x^3+x^4); int(f) %求不定积分(2) g=simple(ans) %调用simple函数对结果化简
7.3.2 符号函数的定积分 定积分在实际工作中有广泛的应用。在MATLAB中,定积分的计算使用函数: int(f,x,a,b) 例7.6 求定积分。 命令如下: x=sym('x');t=sym('t'); int(abs(1-x),1,2) %求定积分(1) f=1/(1+x^2); int(f,-inf,inf) %求定积分(2) int(4*t*x,x,2,sin(t)) %求定积分(3) f=x^3/(x-1)^100; I=int(f,2,3) %用符号积分的方法求定积分(4) double(I) %将上述符号结果转换为数值
例7.7 求椭球的体积。 命令如下: syms a b c z; f=pi*a*b*(c^2-z^2)/c^2; V=int(f,z,-c,c) V = 4/3*pi*a*b*c
例7.8 求空间曲线c从点(0,0,0)到点(3,3,2)的长度。求曲线c的长度是曲线一型 命令如下: syms t; x=3*t;y=3*t^2;z=2*t^3; f=diff([x,y,z],t) %求x,y,z对参数t的导数 g=sqrt(f*f') %计算一型积分公式中的根式部分 l=int(g,t,0,1) %计算曲线c的长度
7.3.3 积分变换 1. 傅立叶(Fourier)变换 在MATLAB中,进行傅立叶变换的函数是: fourier(fx,x,t) 求函数f(x)的傅立叶像函数F(t)。 ifourier(Fw,t,x) 求傅立叶像函数F(t)的原函数f(x)。
例7.9 求函数的傅立叶变换及其逆变换。 命令如下: 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(x)的拉普拉斯像函数F(t)。 ilaplace(Fw,t,x) 求拉普拉斯像函数F(t)的原函数f(x)。
例7.10 计算y=x2的拉普拉斯变换及其逆变换. 命令如下: x=sym('x');y=x^2; Ft=laplace(y,x,t) %对函数y进行拉普拉斯变换 fx=ilaplace(Ft,t,x) %对函数Ft进行拉普拉斯逆变换
3. Z变换 对数列f(n)进行z变换的MATLAB函数是: ztrans(fn,n,z) 求fn的Z变换像函数F(z) iztrans(Fz,z,n) 求Fz的z变换原函数f(n) 例7.20求数列 fn=e-n的Z变换及其逆变换。 命令如下: syms n z fn=exp(-n); Fz=ztrans(fn,n,z) %求fn的Z变换 f=iztrans(Fz,z,n) %求Fz的逆Z变换
7.4 级数 7.4.1 级数的符号求和 级数符号求和函数symsum,调用格式为: symsum(a,n,n0,nn) 例7.12 求级数之和。 命令如下: n=sym('n'); s1=symsum(1/n^2,n,1,inf) %求s1 s2=symsum((-1)^(n+1)/n,1,inf) %求s2。未指定求和变量,缺省为n s3=symsum(n*x^n,n,1,inf) %求s3。此处的求和变量n不能省略。 s4=symsum(n^2,1,100) %求s4。计算有限级数的和
7.4.2 函数的泰勒级数 MATLAB中提供了将函数展开为幂级数的函数taylor,其调用格式为: taylor(f,v,n,a) 例7.23求函数在指定点的泰勒展开式。 命令如下: x=sym('x'); f1=(1+x+x^2)/(1-x+x^2); f2=sqrt(1-2*x+x^3)-(1-3*x+x^2)^(1/3); taylor(f1,x,5) %求(1)。展开到x的4次幂时应选择n=5 taylor(f2,6) %求(2)。
7.5符号方程求解 7.5.1 符号代数方程求解 代数方程是指未涉及微积分运算的方程,相对比较简单。在MATLAB中,求解用符号表达式表示的代数方程可由函数solve实现,其调用格式为: solve(eq):求解符号表达式表示的代数方程eq,求解变量为默认变量。当方程右端为0时,方程eq中可以不包含右端项和等号,而仅列出方程左端的表达式。 solve(eq,v):求解符号表达式表示的代数方程eq,求解变量为v。 solve(eq1,eq2,…,eqn,v1,v2,…,vn):求解符号表达式eq1,eq2,…,eqn组成的代数方程组,求解变量分别v1,v2,…,vn。若不指定求解变量,由默认规则确定。
7.5.2 符号常微分方程求解 MATLAB的符号运算工具箱中提供了功能强大的求解常微分方程的函数dsolve。该函数的调用格式为: dsolve('eqn1','condition','var') 该函数求解微分方程eqn1在初值条件condition下的特解。参数var描述方程中的自变量符号,省略时按缺省原则处理,若没有给出初值条件condition,则求方程的通解。 dsolve在求微分方程组时的调用格式为: dsolve('eqn1','eqn2',…,'eqnN','condition1',…,'conditionN','var1',…,'varN') 函数求解微分方程组eqn1、…、eqnN在初值条件conditoion1、…、conditionN下的解,若不给出初值条件,则求方程组的通解,var1、…、varN给出求解变量。
例7.16 求微分方程的通解。 命令如下: y=dsolve('Dy-(x^2+y^2)/x^2/2','x') %解(1)。方程的右端为0时可以不写 y=dsolve('Dy*x^2+2*x*y-exp(x)','x') %解(2) y=dsolve('Dy-x^2/(1+y^2)','y(2)=1','x'); %解(3) [x,y]=dsolve('Dx=4*x-2*y','Dy=2*x-y','t') %解方程组(4) [x,y]=dsolve('D2x-y','D2y+x','t'); %解方程组(5)