§1 MATLAB 符号计算 符号对象: 1.1 符号对象: 1、建立符号变量和符号常数 MATLAB 中提供了两个建立符号对象的函数或命令,sym 和 syms,但二者的用法 稍有不同。 (1)sym 函数:可以建立符号串,符号字符串可以是常量、变量和表达式等, 调用格式为 sym('v') a=sym('a'); %定义符号变量 a x=5; %定义数值变量 x w1=a*a %符号运算 w2=x^2 %数值运算 w1 = a^2 w2 = 25 whos %查看内存变量 Name Size Bytes Class Attributes a 1x1 60 sym w1 1x1 60 sym w2 1x1 8 double x 1x1 8 double 应用 sym 函数还可以定义符号常量,使用符号常量进行代数运算时和数值常量 进行运算不同。 pi1=sym('pi'); k1=sym('8'); k2=sym('3'); %定义符号变量 pi2=pi; r1=8; r2=3; %定义数值变量 sin(pi1/3) %符号运算 ans = 3^(1/2)/2 sin(pi2/3) %数值运算 ans = 0.8660 sqrt(k1+sqrt(k2)) %符号运算 ans = (3^(1/2) + 8)^(1/2) sqrt(r1+sqrt(r2)) %数值运算 ans = 3.1196 (2)syms 命令 MATLAB 提供了 syms 命令,一次可以定义多个符号变量,其格式为 syms arg1 arg2 … argn ,其中 arg1、arg2…argn 是定义的符号变量名。注意:变量间 用空格而不是用逗号分隔。如定义 4 个符号变量 a、b、c、d 可用命令:syms a b c d 1、建立符号表达式 (1) 利用单引号生成符号表达式 y='1/sqrt(2*x)' %生成一般的符号表达式 y = 1/sqrt(2*x) f='cos(x^2)-sin(2*x)=0' %生成符号方程 f = cos(x^2)-sin(2*x)=0 (2) 用 sym 函数建立符号表达式 U=sym('3*x^2-5*y+2*x*y+6') %生成表达式 3x 2 ? 5 y + 2 xy + 6 U = 3*x^2 + 2*y*x - 5*y + 6 M=sym('[a b;c,d]') %生成符号矩阵 M = [ a, b] [ c, d] (3) 使用已经定义的符号变量组成符号表达式 syms x y; V=3*x^2-5*y+2*x*y+6 %生成表达式 3x 2 ? 5 y + 2 xy + 6 V = 3*x^2 + 2*y*x - 5*y + 6 1.2 基本符号运算 1、符号表达式的四则运算 符号表达式的加、减、乘、除运算分别用 symadd、aymsub、symmul、symdiv 来 实现,幂运算用 sympow 来实现。注意,符号运算结果依然为符号表达式。注 意:symadd、symsub、submul、symdiv 只在 MATLAB6.5 和 MATLAB7.0 有用。 f='2*x^2+3*x-5' %定义符号表达式 f = 2*x^2+3*x-5 g='x^2-x+7' g = x^2-x+7 symadd(f,g) %求 f+g ans = 3*x^2+2*x+2 symsub(f,g) %求 f-g ans = x^2+4*x-12 symmul(f,g) %求 f*g ans = (2*x^2+3*x-5)*(x^2-x+7) symdiv(f,g) %求 f/g ans = (2*x^2+3*x-5)/(x^2-x+7) sympow(f,'3*x') %求 f^(3x) ans = (2*x^2+3*x-5)^(3*x) 另外,与数值运算一样,也可以用 + 、、 、 、 运算符实现符号运算。 - × ÷ ^ syms x y z; f1=2*x+x^2*x-5*x+x^3+exp(3) %生成表达式 2 x + x 3 ? 5 x + x 3 + e 3 f1 = 2*x^3 - 3*x + 2826788018837635/140737488355328 f2=2*x/(5*x) f2 = 2/5 f3=(x*x-y^2)/(x-y) f3 = (x^2 - y^2)/(x - y) 2、符号表达式的提取分子和分母运算 如果符号表达式是一个有理分式或可以展开为有理分式,可利用 numden 函数来 提取符号表达式中的分子或分母,其调用格式为 [n,d]=numden(s) ,其中 n 为分子,m 为分母,s 为要提取的有理分式。 a=sym(0.333) a = 333/1000 [n,d]=numden(a) n = 333 d = 1000 f=sym('a*x^2/(b+x)') f = (a*x^2)/(b + x) [n,d]=numden(f) n = a*x^2 d = b + x 3、符号表达式的因式分解与展开 factor(s) :对符号表达式 s 分解因式 expand(s) :对符号表达式 s 进行展开 collect(s) :对符号表达式 s 合并同类项 collect(s,v) :对符号表达式是 s 按变量 v 合并同类项 例如: syms a b x y; A=a^3-b^3; factor(A) ans = (a - b)*(a^2 + a*b + b^2) s=(-7*x^2-8*y^2)*(-x^2+3*y^2) s = (x^2 - 3*y^2)*(7*x^2 + 8*y^2) expand(s) ans = 7*x^4 - 13*x^2*y^2 - 24*y^4 collect(s) ans = 7*x^4 + ((-13)*y^2)*x^2 - 24*y^4 collect(s,x) ans = 7*x^4 + ((-13)*y^2)*x^2 - 24*y^4 factor(sym('420')) ans = (2)^2*(3)*(5)*(7) 4、符号表达式的化简 sympligy(s) :应用函数规则对 s 进行化简 symple(s) :调用 MATLAB 的其他函数对表达式进行综合化简,并显示化简 过程。 syms x y a; s1=log(2*x/y); simplify(s1) ans = log((2*x)/y) s2=(-a^2+1)/(1-a); simplify(s2) ans = a + 1 s3=(x^2+y^2)^2+(x^2-y^2)^2; simple(s3) simplify: 2*x^4 + 2*y^4 radsimp: (x^2 + y^2)^2 + (x^2 - y^2)^2 simplify(100): 2*x^4 + 2*y^4 combine(sincos): (x^2 + y^2)^2 + (x^2 - y^2)^2 combine(sinhcosh): (x^2 + y^2)^2 + (x^2 - y^2)^2 combine(ln): (x^2 + y^2)^2 + (x^2 - y^2)^2 factor: 2*(x^4 + y^4) expand: 2*x^4 + 2*y^4 combine: (x^2 + y^2)^2 + (x^2 - y^2)^2 rewrite(exp): (x^2 + y^2)^2 + (x^2 - y^2)^2 rewrite(sincos): (x^2 + y^2)^2 + (x^2 - y^2)^2 rewrite(sinhcosh): (x^2 + y^2)^2 + (x^2 - y^2)^2 rewrite(tan): (x^2 + y^2)^2 + (x^2 - y^2)^2 mwcos2sin: (x^2 + y^2)^2 + (x^2 - y^2)^2 collect(x): 2*x^4 + 2*y^4 ans = 2*x^4 + 2*y^4 5、符号表达式与数值表达式之间的转换 利用函数 sym 可以将数值表达式变化成它的符号表达式。 a=sym(1.5) b=sym(3.14) a = 3/2 b = 157/50 函数 numeric 或 eval 可以将符号表达式变化成数值表达式。(在 MATLAB 6.5 和 MATLAB 7.0 版本中有用) eval('234/5') ans = 46.8000 phi=sym('(1+sqrt(5))/2') phi = (1+sqrt(5))/2 numeric(phi) ans = 1.6180 6、符号表达式的变量替换 符号运算工具箱中有一个很有用的变量替换函数 subs,其格式为 * * * * f1 = subs ( f , x1 , x1 ) 和 f1 = subs ( f ,{ x1 , x2 L xn },{ x1 , x2 L xn }) syms x y m n; %定义 x、y、m、n 为符号变量 z=(x^2-y^2)*exp(-x^2-y^2-x*y) %先得出 z 关于 x、y 的表达式 z = (x^2 - y^2)/exp(x^2 + x*y + y^2) subs(z,{x,y},{m,n}) %用 m、n 分别代替表达式中的 x、y ans = (m^2 - n^2)/exp(m^2 + m*n + n^2) x=2;y=3; %给 x、y 赋值 subs(z) %将 x、y 的值代入替换 x、y 求值 ans = -2.8014e-008 1.3 符号表达式中变量的确定 MATLAB 中的符号可以表示符号变量和符号常量。findsym 可以帮助用户查找一 个符号表达式中的符号变量,其调用格式为: findsym(s,n) ,函数符号表达式 s 中的 n 个符号变量,若没有指定 n,则返回 s 中的全部符号变量。 syms x a y z b; %定义 5 个符号变量 s1=3*x+y; s2=a*y+b; %定义 2 个符号表达式 findsym(s1) ans = x,y findsym(s2,2) ans = y,b findsym(5*x+2) ans = x c=sym('3'); %定义符号常量 c findsym(a*x+b*y+c) %符号常量 c 不在结果中出现 ans = a,b,x,y 1.4 符号矩阵 符号矩阵也是一种符号表达式,所以前面介绍的符号表达式运算都可以在矩阵 意义下进行。函数作用于符号矩阵时,时分别作用于矩阵的每一个元素。 例如:建立如下符号矩阵并化简: ? a 3 ? b3 sin 2 α + cos 2 α ? ? ? m = ?15 xy ? 3 x 2 ? 78 ? x ? 5y ? ? ? syms a b x y alp; m=sym('[a^3-b^3,sin(alp)^2+cos(alp)^2;(15*x*y-3x^2)/(x5*y),78]') m = [ a^3-b^3, sin(alp)^2+cos(alp)^2] [ (15*x*y-3x^2)/(x-5*y), 78] §2 符号函数及其应用 2.1 符号函数的极限 limite(f,x,a) :求符号函数 f 的极限值 lim f ( x) 。即当变量 x 趋近于常数 a x→a 时,f(x)的极限值。; limite(f,a) :求符号函数 f(x)的极限值,默认 x 为自变量; limite(f) :求符号函数的 f(x)的极限值,默认自变量 x 趋近于 0; limite(f,x,a,'right') :求符号函数 f(x)的极限值 lim+ f ( x) ,'right'表示变 x→a 量 x 从右边趋近于 a; limite(f,x,a,'left') :求符号函数 f(x)的极限值 lim? f ( x) ,'left'表示变量 x→a x 从左边趋近于 a; 例如:求极限 x ?m a (2) lim x( x 2 + 1 ? x) x →+∞ x→a x?a 解:(1)syms x a m; f=(x^(1/m)-a^(1/m))/(x-a); limit(f,x,a) ans = a^(1/m)/a/m (2) syms x; f=x*(sqrt(x^2+1)-x); limit(f,x,inf) ans = 1/2 2.2 符号函数的求导及其应用 diff 函数用于对符号表达式求导,其调用格式为: diff(f) :没有指定变量和导数阶,则系统按 findsym 函数指示的默认变量对 符号表达式 s 求一阶导; diff(f,v) :以 v 为自变量,对符号表达式 f 求一阶导; diff(f,n) :按 findsym 函数指示的默认变量对符号表达式 f 求 n 阶导,n 为正 数; diff(f,v,n) :以 v 为自变量,对符号表达式 f 求 n 阶导; 例如:求下列函数的导数: (1) y = 1 ? e x ,求 y′ (2) y = x cos x ,求 y′′ 和 y ′′′ m (1) lim 解:(1)syms x; y=sqrt(1-exp(x)); diff(y) ans = -1/2/(1-exp(x))^(1/2)*exp(x) (2)syms x; y=x*cos(x); diff(y,x,2) ans = -2*sin(x)-x*cos(x) diff(y,x,3) ans = -3*cos(x)+x*sin(x) 例:在曲线 y = x3 + 3 x ? 2 上哪一点的切线与直线 y = 4 x ? 1 平行。 解:依题意,即求曲线哪一点的导数值为 4. syms x y=x^3+3*x-2; f=diff(y); g=f-4; solve(g) ans = [ 1/3*3^(1/2)] [ -1/3*3^(1/2)] 3 3 结果表明,在 x = 和x=? 处的切线和指定直线平行。 3 3 §3 符号积分 3.1 符号函数的不定积分 int(f) :没有指定积分变量和积分阶数时,按 findsym 函数指示的默认变量对 被积函数或符号表达式 f 求不定积分。 inf(f,v) :以 v 为自变量,对被积函数或符号表达式 f 求不定积分。 例如:求下列不定积分 (1) ∫ (3 ? x 2 ) dx 3 (2) ∫ sin 2 xdx 解:(1)syms x; y=(3-x^2)^3; int(y) ans = -1/7*x^7+9/5*x^5-9*x^3+27*x (2)syms x; int(sin(x)^2) ans = -1/2*cos(x)*sin(x)+1/2*x 符号函数的定积分 3.2 符号函数的定积分 int(f,v,a,b) :a、b 为该积分区间的上、下限。表示对 f 在区间[a,b]的定积 分。 2 +∞ 1 例如:(1) ∫ 1 ? x dx (2) ∫ dx 1 ?∞ 1 + x 2 解:(1)syms x; int(abs(1-x),1,2) ans = 1/2 (2)syms x; f=1/(1+x^2); int(f,-inf,inf) ans = pi 例:球椭球的体积 x2 y 2 z 2 + + =1 a 2 b2 c 2 解:用平面 Z = z0 ( z0 ≤ c) 去截上述椭球时,其相交线是一个椭圆,该椭圆在 xy 平 面的投影的面极是: s ( z ) = π ab(c 2 ? z 2 ) c2 ,椭球的体积 V = ∫ s ( z )dz 。命令如下: ?c c syms a b c z; f=pi*a*b*(c^2-z^2)/c^2; v=int(f,z,-c,c) v = (4*pi*a*b*c)/3 §3 级数 求无穷级数的和需要使用符号表达式求和函数 symsum ,其调用格式为: symsum(a,v,m,n) ,其中 a 表示一个级数的通项,是一个符号表达式。v 是求和变 量,v 省略是使用系统的默认变量。m 和 n 是求和的开始项和末项。 例如:求下列级数之和 1 1 1 1 (1) s1 = 1 + + + + L + 2 + L 4 9 16 n 1 1 1 1 (2) s2 = 1 ? + ? + L + (?1) n +1 + L 2 3 4 n 命令如下: n=sym('n'); s1=symsum(1/n^2,n,1,inf) s1 = pi^2/6 syms n; s2=symsum((-1)^(n+1)/n,n,1,inf) s2 = log(2) §4 符号方程求解 4.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。 例如:求解下列方程 1 4x 2 (1) (2) x ? 3 x3 ? 4 x ? 7 = 1 + 2 = 1+ x+2 x ?4 x?2 ?1 1 ? x3 + y 3 = 28 ?u 3 + v3 = 98 ? (3) ? (4) ? ?u + v = 2 ?1 + 1 = 4 ?x y ? 解: x=solve('1/(x+2)+4*x/(x^2-4)=1+2/(x-2)','x') %求解(1) x = 1 f=sym('x-(x^3-4*x-7)^(1/3)=1'); %求解(2) x=solve(f) x = 3 [x y]=solve('1/x^3+1/y^3=28','1/x+1/y=4','x,y') %求解(3) x = 1 1/3 y = 1/3 1 [u,v]=solve('u^3+v^3=98','u+v=2','u,v') %求解(4) u = 5 -3 v = -3 5 4.2 符号常微分方程的求解 在 MATLAB 中,用大写字母 D 表示倒数。例如,Dy 表示 y′ ,D2y 表示 y′′ ,方程 D3y+D2y+Dy-x+5=0 表示微分方程 y′′′ + y′′ + y′ + x ? 5 = 0 。