1、第五章 Matlab 符号运算,创建符号变量 符号表达式的建立、化简和替换 符号微积分 符号方程求解 符号数学的简易绘图函数,第一节 创建符号变量,一、sym函数定义符号变量 sym函数用于定义单个符号变量,使用函数sym的调用格式为: sym(x) sym(x,real) sym(x,unreal) 其中,参数real定义的变量为实型符号变量,unreal定义的是非实型符号变量。 【例5-1】 使用函数sym定义符号变量。 a=sym(a) % 定义符号变量a a =a sym(b,real) % 定义符号变量b,实型符号变量 ans =b c=sym(byebye) c =Byebye 有
2、了符号运算后,也可将数值变量向符号变量转换,见下例:,【例5-2】 使用函数sym将数值矩阵转换成符号矩阵。 A=3 1.1 2;2 4 1.5;3.1 2.2 5; B=sym(A) B = 3, 11/10, 2 2, 4, 3/2 31/10, 11/5, 5由例5-2可见,将数值矩阵转换为符号矩阵时,矩阵的表示方法发生了变化,原数值矩阵中的每一行单独用括号括了起来,而且,尽管矩阵中元素依然以数值的形式出现,但此时却是符号变量了。,二、syms函数定义符号变量除了sym函数以外,Matlab还提供了syms函数用来定义符号变量。与sym函数最大的不同点在于,syms可以很方便地一次定义多
3、个符号变量。syms函数的调用格式为: syms arg1 arg2 arg3 ,【例5-3】 使用函数syms定义多个符号变量 syms x t n who Your variables are: n t x 以上3个符号变量也可以通过sym函数来定义 x=sym(x); t=sym(t); n=sym(n); who Your variables are: n t x 变量的定义也可以通过Workspace查看,见图5-1,图5-1 从Workspace窗口查看变量,【例5-4】 使用syms函数定义符号矩阵 syms a b c d; n=a b c d;b c d a;c d a b;
4、d a b c n = a, b, c, d b, c, d, a c, d, a, b d, a, b, c m=size(n) % size函数用于查看符号矩阵的大小 m =4 4 在这里,需要注意的是符号矩阵和数值矩阵的区别: 在Workspace窗口中,变量的图标不同,数值矩阵的图标为,符号矩阵的图标为; 在Command Window窗口显示时,数值矩阵只显示元素的数值,而符号矩阵的每行元素都放在一对方括号内。,第二节 符号表达式的建立、化简和替换,在Matlab中,符号表达式可以通过基本赋值语句进行建立, 方法可以采用单引号或sym/syms函数定义。 【例5-5】 使用单引号建立
5、符号表达式。 y=a*x2+b=0 % 定义符号代数方程 y =a*x2+b=0 y=D2y-c*Dy+d=0 % 定义符号微分方程 y =D2y-c*Dy+d=0,【例5-6】 使用sym/syms函数建立符号表达式。 f1=sym(x3+4*x2+x+3) f1 =x3+4*x2+x+3 f2=sym(a*x2+b*x+c=0) f2 =a*x2+b*x+c=0 f3=sym(a b;c d) f3 = a, b c, d syms x y; f4=sin(x)+cos(y) f4 =sin(x)+cos(y),在书写符号表达式时,需要注意以下几点: 数学符号 的书写形式为pi;虚数单位用
6、i或j表示; 无穷大用INF或inf表示; 符号相乘必须用*连接; 指数运算以e为底的书写形式为exp(),在Matlab中,只有求以e为底的自然对数; 表达式需写在同一行; 与数学表达式不同,Matlab的表达式中只能用小括号。在Matlab函数嵌套调用时, 多重小括号嵌套使用,要避免出错。,一、符号表达式的化简,Matlab符号数学工具箱提供了化简符号表达式的各种函数,如多项式展开(expand)、因式分解(factor)、合并同类项(collect)、化简(simplify和simple)、分式通分(numden)以及嵌套形式重写(horner)等。 多项式展开(expand)在Matl
7、ab中,expand函数的功能是将符号表达式进行展开,其调用格式为: R=expand(s)该函数的功能是对表达式s进行因式展开,常用于多项式、三角函数、指数函数和对数函数。,【例5-7】 展开符号表达式和。 首先在命令窗口创建符号变量。 syms x y; f1=(x+1)7; expand(f1) ans = x7+7*x6+21*x5+35*x4+35*x3+21*x2+7*x+1 f2=cos(x+y); f=expand(f1) f = cos(x)*cos(y)-sin(x)*sin(y),【例5-8】 展开符号表达式、和符号矩阵。 syms x y t b; f1=expand(
8、x+3)*(x+t)*(y-1) f1 =x2*y-x2+x*t*y-x*t+3*x*y-3*x+3*t*y-3*t f=(x-2)2*(x+1)-x2; f2=expand(f) f2 =x3-4*x2+4 A=(x-b)2 (x+b)2;sin(x+y) cos(2*x); expand(A) ans = x2-2*b*x+b2, x2+2*b*x+b2 sin(x)*cos(y)+cos(x)*sin(y), 2*cos(x)2-1,1. 因式分解(factor) 函数factor的功能是将符号表达式进行因式分解, 其调用格式为: factor(s) 其中,s可以是正整数、符号整数、符号
9、表达式或 符号矩阵。当s为正整数时,因式分解的结果返回 的是s的质数分解式。在这里,我们需要注意的是, 在整数数组中,有一位元素位数超过16位时,必须 用sym函数创建该元素;当s为符号表达式时,结果 返回乘积形式。,【例5-9】 因式分解整数352、整数12345678901234567890、符号表达式以及符号矩阵。 f1=factor(sym(352) f1 =(2)5*(11) f2=factor(sym(1234567890123456789) f2 =(2)8*(3)*(11)*(146137297599841) syms a b x y f3=factor(x5-y5) f3 =
10、(x-y)*(x4+x3*y+x2*y2+x*y3+y4) f4=factor(x-b)2 x2-b*x;a2-b2 a*x-a) f4 = (x-b)2, x*(x-b) (a-b)*(a+b), a*(x-1) 可见,factor函数不仅在多项式中有着强大的分解能力,而且在正整 数质数分解中也有着广泛的应用。,2. 合并同类项(collect) 符号表达式同类项合并函数collect,其调用格式有两种: (1)R=collect(s) 将表达式s中相同次幂的项合并,其中s可以是符号表达式,也可以是符号矩阵。 (2)R=collect(s,v) 将表达式s中关于v的相同次幂项合并,v的默认值
11、是x。,【例5-10】 对符号表达式进行同类项合并。 clear % 清除内存变量 syms x y f1=(x-exp(x)*(x+y); R1=collect(f1) R1 = x2+(-exp(x)+y)*x-exp(x)*y R2=collect(f1,y) R2 = (x-exp(x)*y+(x-exp(x)*x,【例5-11】 试按照不同方式合并表达式。 syms a x y f=(x2-a*exp(y)*(a*x*y+exp(2*y)*x); R1=collect(f) R1 = (a*y+exp(2*y)*x3-a*exp(y)*(a*y+exp(2*y)*x R2=colle
12、ct(f,y) R2 = (x2-a*exp(y)*a*x*y+(x2-a*exp(y)*exp(2*y)*x R3=collect(f,a) R3 = -exp(y)*x*y*a2+(x3*y-exp(y)*exp(2*y)*x)*a+x3*exp(2*y),从结果可以看出,采用不同的合并条件时,同一个 符号表达式可能会得到不同的结果。因此,在实 际应用中,应根据需要选择适当的合并条件。 3. 化简(simplify和simple) 符号表达式化简的函数simplify和simple,其中函 数simplify的调用格式为: R=simplify(s) 在Matlab中,simplify函数
13、的具体功能是根据一定 规则对符号表达式进行化简。S代表符号表达式 或符号矩阵,R是化简后的结果。,【例5-12】 试对表达式和进行化简。 syms t x real R1=simplify(csc(t)2-cot(t)2) R1 =1 R2=simplify(x5-1)/(x-1) R2 =x4+x3+x2+x+1,函数simplify是一个强大的化简工具,它可以完成对指数、 对数、三角函数等各种数学表达式的化简。而函数simple 将化简结果及所使用的方法均列出来,这些方法中就包括 simplify。Simple的调用格式为: r=simple(s) simple函数使用不同的变换简化规则来
14、对符号表达式进行 化简,返回表达式s的最简形式。如果s是符号表达式矩阵时, 则返回表达式矩阵的最短形式,而不一定是使每一项都最 短;如果不给定输出参数r,该函数将显示所有使表达式s 最短的化简方式,并返回其中最短的一个表达式。 r,how=simple(s) 该格式不显示化简的中间结果,只是显示寻找到的最短形 式以及所有可以使用的化简方法。r表示符号表达式的结 果,how则表示具体使用的方法,表5-1给出了simple的化 简示例。,表5-1 simple化简示例,由表5-1可以看出,simple的化简方法有很多, 其中, radsimp函数对含根式的表达式进行化简; combine函数将表达
15、式中以求和、乘积、幂运算等形式出现的各项合并; collect函数合并同类项; factor函数对表达式进行因式分解; convert函数完成表达式由一种形式到另一种形式的转换。,4. 分式通分(numden) 在Matlab中,numden函数的功能是对符号表达式进行通分,其调用格式 如下: n,d=numden(s) 其中,s是符号多项式,n(numerator)返回最小分母公因式,d(denominator) 返回相应的分子多项式。【例5-14】 在Matlab中对表达式进行通分。 syms x f=(x+1)/x2+(x-1)/(2*x+3); n,d=numden(f) n =x2+
16、5*x+3+x3 d = x2*(2*x+3) 根据数学知识,可以直接对例5-14进行计算,结果如下: 因此,n代表计算后的分子,d代表计算后的分母。,【例5-15】 试确定符号矩阵的分子和分母。 syms a b x y A=1/x2 2/y;1/a2 3/b; n1,d1=numden(A) n1 = 1, 2 1, 3 d1 = x2, y a2, b,5. 嵌套形式重写(horner) 在Matlab中,horner函数的功能是将符号表达式转换成为嵌套形式,其调用格式如下: r=horner(s) 其中,s是符号多项式矩阵,函数horner将其中每个多项式转换成它们各自的嵌套形式。,【
17、例5-16】 在Matlab中完成对表达式的嵌套形式重写。 syms x f=x3+x2+5*x+3; r=horner(f) r =3+(5+(x+1)*x)*x 需要注意的是,horner函数并不是对多项式进行因式分解,而是将多项式变换成嵌套形式。 另外,为了使表达式的书写形式符合人们的习惯,Matlab提供了函数pretty,该函数能够将由Matlab得到的符号表达式的结果再做一个整理,比如,将例5-16的结果利用此函数重新表示如下: syms x; r=3+(5+(x+1)*x)*x; pretty(r) 3 + (5 + (x + 1) x) x,二、符号表达式替换,在Matlab中
18、,符号计算的结果往往比较复杂,这是由于某些表达式重复 出现。为了简化计算结果,Matlab提供了两个重要的函数:subexpr和 subs,用来实现符号表达式的替换,以得到一个简单的表达式。 1. subexpr函数 在Matlab中,subexpr函数的功能是将表达式中重复出现的字符串用变量 代替,其调用格式为: Y,SIGMA=subexpr(X,SIGMA) 用变量SIGMA(符号对象)的值来代 替符号表达式中重复出现的字符串,Y返回替换后的结果。 Y,SIGMA=subexpr(X,SIGMA) 与第一种形式的区别在于,SIGMA是字 符或字符串,用它来替换表达式中重复出现的字符串。,
19、2. subs函数 在Matlab中,subs函数的功能是使用指定符号替换符号表达式中的某一个特定符号,相对于subexper函数,subs函数是一个通用的替换命令,其调用格式为: R=subs(s) 使用工作空间中的变量来替换符号表达式s中的所有符号变量,如果没有指定某符号变量的值,该符号变量不会被替换。 R=subs(s,new) 使用新的符号变量new来替换原来符号表达式s中的默认变量。 R=subs(s,old,new) 使用新的符号变量new来替换原来符号表达式s中的变量old,当new是数值形式的符号时,就用数值替换old,所得结果仍是字符串形式。,【例5-18】 已知符号表达式,
20、试完成以下操作。 (1)将x换成t; (2)接着将b换成y; (3)当t=2时,计算(2)的值; (4)当y=3时,计算(3)的值。 syms a b c t x y f=(b2*x-4*a*c)(1/2)+(x+y)/(y+b); f1=subs(f,t) f1 =(b2*t-4*a*c)(1/2)+(t+y)/(y+b) f2=subs(f1,b,y) f2 =(y2*t-4*a*c)(1/2)+1/2*(t+y)/y f3=subs(f2,t,2) f3 =(2*y2-4*a*c)(1/2)+1/2*(2+y)/y f4=subs(f3,y,3) f4 =(18-4*a*c)(1/2)+
21、5/6,第三节 符号微积分,一、符号极限,函数极限是微积分的基础,极限的概念贯穿微积分的始终。在Matlab中,给出 了多种求极限的运算函数,使得原本复杂的极限求解变得简单、方便。 在Matlab中,极限的求解用limit函数实现,其常用的调用格式为: limit(F, x, a) 计算符号表达式F在xa条件下的极限。 limit(F, a) 计算符号表达式F在默认自变量趋向于a条件下的极限。 limit(F) 计算符号表达式F在默认自变量趋向于0时的极限。 limit(F, x, a, right) 计算符号表达式F在xa条件下的右极限。 limit(F,x, a, lift) 计算符号表达
22、式F在xa条件下的左极限。【例5-19】 在Matlab中,求解表达式,的极限数值。 syms x F=limit(tan(x)-sin(x)/x2) F =0,在例5-20中,采用Matlab的默认格式求解极限数值,也就是自变量为x,求解当x趋于0时的极限。 【例5-20】 在Matlab中,试证明表达式。 syms t x f=limit(1+x/t)t,t,inf) f =exp(x),【例5-21】 在Matlab中,已知,试求在点处的左右极限。 syms x fl=limit(x/abs(x),x,0,left) fl =-1 fr=limit(x/abs(x),x,0,right)
23、 fr =1,从结果可以看出,左极限的值为-1,右极限的值为1,左右极限不相等,故在点处的极限不存在。在Matlab中,可以通过绘制该函数的图形来形象地了解函数的属性,如: xl=-2:0.01:0; yl=xl/abs(xl); xr=0:0.01:2; yr=xr/abs(xr); plot(xl,yl,xr,yr) axis(-2 2 -1.5 1.5) % 设置坐标轴的刻度范围,图5-2 例5-21的图形,绘制图形如图5-2所示:,从图形中,可以清楚看到,函数在 处是间断的,在左侧值为-1,右侧值为1,故极限不存在(程序中的绘图函数参考后续章节)。,二、符号微分在符号数学工具箱中,表达
24、式的微分用函数diff实现,其调用格式为:diff(S) 求对于默认自变量的符号表达式S的微分;diff(S, v) 求对于自变量v的符号表达式S的微分;diff(S, n) 求对于默认自变量的符号表达式S的n次微分;diff(S,v,n) 求对于自变量v的符号表达式S的n次微分。,【例5-22】 试对表达式 求一阶偏导和二阶偏导。 syms x y f=x3-5*x2*y+y2; dfdx=diff(f,x) dfdx =3*x2-10*x*y dfdy=diff(f,y) dfdy =-5*x2+2*y dfdxdy=diff(dfdx,y) dfdxdy =-10*x dfdydx=di
25、ff(dfdy,x) dfdydx =-10*x 由此可见,使用函数diff可以很容易地实现微分计算,这和数 学求解相比,要简单得多。,【例5-23】 试对表达式 求一阶导数并化简。 syms x n f=diff(log(x+sqrt(x2+n2) f =(1+1/(x2+n2)(1/2)*x)/(x+(x2+n2)(1/2) f1=simple(f) f1 =1/(x2+n2)(1/2) 根据数学知识,我们可以得到表达式的一阶导数为:其结果与f1 =1/(x2+n2)(1/2)是等价的,只是两种环境下的不同表示结果。,【例5-24】 在Matlab中,求矩阵的微分。 syms x t A=
26、x*t x2*sin(t);exp(x*t) log(x+t); D1=diff(A,t) D1 = x, x2*cos(t) x*exp(x*t), 1/(x+t) D2=diff(A,2) D2 = 0, 2*sin(t) t2*exp(x*t), -1/(x+t)2, D3=diff(diff(A,t) % 以t为自变量对A求导后,再以x为自变量再对A求导 D3 = 1, 2*x*cos(t) exp(x*t)+x*t*exp(x*t), -1/(x+t)2 D4=diff(A) D4 = t, 2*x*sin(t) t*exp(x*t), 1/(x+t) D5=diff(A,x) D5
27、 = t, 2*x*sin(t) t*exp(x*t), 1/(x+t),三、符号积分,积分和微分可以看成一对互逆运算,然而积分的求解却难 于微分,原因在于积分不仅包括定积分、不定积分,而且 还包括重积分。在Matlab的符号数学工具箱中,提供函数 int来对符号积分进行求解,其调用格式为: int(S) 求符号表达式S对于默认自变量的不定积分。 int (S, v) 求符号表达式S对于自变量v的不定积分。 int (S, a, b) 求符号表达式S对于默认自变量从a到b 的定积分。 int(S,v,a,b)求符号表达式S对于自变量v从a到b的定积分。在int函数中,a和b不仅可以是常数变量,
28、也可以是符号表达式和其它数值表达式,分别表示积分表达式的上下限。,【例5-25】 计算积分。 syms x y z f1=int(x/(1+x2),x); % 求关于x的不定积分 f2=int(x*log(1-x),0,1); % 求关于x在0,1区间内的定积分 f3=int(int(x2+y2,y,x,1+x),x,0,1); % 求表达式在变量y=x,1+x,x=0,1时的积分 f1 f1 =(1/2)*log(x2+1) f2 f2 =-3/4 f3 f3 =3/2,【例5-26】 在Matlab中,求矩阵的积分结果。 syms t A=t sin(t);exp(t) log(1+t);
29、 I=int(A) I = 1/2*t2, -cos(t) exp(t), log(1+t)*(1+t)-t-1 pretty(I) 2 1/2 t -cos(t) exp(t) log(1 + t) (1 + t) - t 1 ,同数学中的积分相比,Matlab中的符号积分 简单的多,适应性较强,但是也存在缺点,运算的时 间较长,并且积分结果有时较为复杂,需要使用化 简命令来化简结果。除了int命令之外,Matlab还提供了一个交互 性的近似积分命令rsums,该命令可以计算一元函 数在有限的闭区间上的积分数值。其调用格式如 下: rsums(S,a,b) S是积分表达式,a和b分别为积分的
30、上下限。,【例5-27】 在Matlab中,试运用命令rsums求解函数在积分区间-2,2上的积分结果。 syms x f=(x+1)3+3*x2+2*x; rsums(f,-2,2),在命令窗口输入以上命令之后,按Enter键,Matlab会自动调用近似积分的交互界面,如图5-3所示。,图5-3 交互近似积分界面,在默认情况下,交互近似积分界面下方有一个“滑动键”,此滑动键用来设置函数曲线下方的矩形个数,缺省情况下,矩形个数是10,当滑键向左调节时,矩形个数减少;向右滑动时,矩形个数增加,最大的矩形个数为128。调整积分矩形个数,将其设置成90,查看近似积分结果,如图5-4所示:,图5-4
31、矩形个数为90时的积分界面,调整积分矩形个数,将其设置成128,查看近似积分数值,如图5-5所示。,图5-5 矩形个数为128时的积分界面,当然,也可以在命令窗口中输入直接输入 “int(f,-2,2)”,计算函数的准确积分数值,结果如下: int(f,-2,2) ans =36从上面结果可以看出,精确值为36,而近似 积分值为35.998047,精度可以达到一般要 求。,四、符号求和,在符号数学工具箱中,表达式的求和由函数symsum实现, 其调用格式为: symsum(S) 计算符号表达式S对于默认自变量的不定和。 symsum(S, v) 计算符号表达式S对于自变量v的不定和。 syms
32、um(S, a, b) 计算符号表达式S对于默认自变量从a到b的有限和。 symsum(S,v,a,b) 计算符号表达式S对于自变量v从a到b的有限和。,【例5-28】 试分别计算表达式的值。 syms x n symsum(n) % 对默认自变量n的不定和 ans =1/2*n2-1/2*n symsum(n2,0,10) % 对默认自变量从0到10的有限和 ans =385 symsum(xn/sym(n!),n,0,inf) % 对默认自变量从0到inf的有限和 ans =exp(x) symsum(xn/sym(n!),x,0,5) % 对自变量x从0到5的有限和 ans =1/n!+
33、2n/n!+3n/n!+4n/n!+5n/n!,第四节 符号方程求解,一、代数方程求解代数方程的求解一直都是数学分析中十分重要的 内容。一般代数方程包括线性方程、非线性方程以及 超越方程等。本节将主要介绍符号代数方程的命令和 实例。对于上述的方程类型的求解,Matlab符号数学工 具箱提供了求解命令solve,其调用格式为: g=solve(eq) 求解符号表达式eq=0的代数方程,自变 量为默认变量(以通过函数findsym来确定),其中eq可以 是符号表达式或不带符号的字符串表达式。,g=solve(eq, var) 求解符号表达式eq=0的代数方程,自变量为var。返回值g是由方程的所有
34、解构成的列向量。 g=solve(eq1, eq2, , eqn, var1, var2, ,varn) 求解符号表达式或不带符号的字符串表达式eq1, eq2,eqn组成的代数方程组,自变量分别为var1,var2,varn。当输出参数的个数和方程组的个数相等的时候,方程组的解将分别赋给每个输出参数,并且按照字母表的顺序进行排列。,【例5-29】 求线性代数方程的解。 syms x y z f1=x+y+z=10; f2=3*x+2*y+z=14; f3=2*x+3*y-z=1; x,y,z=solve(f1,f2,f3) x =1 y =2 z =7,结果中,x、y、z是分别输出的,若想整
35、体输出方程组 的数值解,需要在返回值中引入新的变量,如: syms x y z f1=x+y+z=10; f2=3*x+2*y+z=14; f3=2*x+3*y-z=1; x,y,z=solve(f1,f2,f3); g=x,y,z g = 1, 2, 7,【例5-30】 求解非线性方程组的数值解。 syms x y x,y=solve(x2-2*x*y+y2=3,x2-4*x+3=0); solution=x,y solution = 1, 1+3(1/2) 1, 1-3(1/2) 3, 3+3(1/2) 3, 3-3(1/2),【例5-31】 求解含有参数的非线性方程组的解。 syms a
36、 b x y f1=a+b+x=y; f2=2*a*x-b*y=-1; f3=(a+b)2=x+y; f4=a*y+b*x=4; a,b,x,y=solve(f1,f2,f3,f4); a=double(a),b=double(b),x=double(x),y=double(y) % 将解析解的符号常数形式转换为双精度形式,a =1.0000 23.6037 0.2537 - 0.4247i0.2537 + 0.4247i b =1.0000 -23.4337 -1.0054 - 1.4075i-1.0054 + 1.4075i x =1.0000 -0.0705 -1.0203 + 2.29
37、34i-1.0203 - 2.2934i y =3.0000 0.0994 -1.7719 + 0.4611i-1.7719 - 0.4611i,可见,方程组共有4组解,其中两组为实数解,两组为虚数解。一般来说,用函数solve得到的解是精确的符号表达式,显得不直观,通常要把所得的解化为数值型以使结果显得直观、简洁。读者可以查看一下未转换成数值型解之前的结果,一目了然。,【例5-32】 求解超越方程组的解。 syms x y S=solve(sin(x+y)-exp(x)=0,x2-y=2); S S = x: 2x1 symy: 2x1 sym 程序的结果中,并没有显示方程组的解,只是显示方
38、程结果的属性和维数。在本例中,变量x和y都是符号变量,维数都是2x1。 若要查看各个变量的具体数值,则输入: S.x ans =1.0427376369218101928864474535215-2.0427376369218101928864474535215 S.y ans =-.912698220546719140408029500044142.1727770532969012453648654069989,二、微分方程求解,同代数方程的求解相比,微分方程的求解相对复杂一点。但对于符号求解而言,不论是初值问题还是边值问题,其求解微分方程的指令都是很简单的。 在符号数学工具箱中,求表达式的
39、常微分方程的符号解由函数dsolve实现,其调用格式为: r=dsolve(eq1, eq2, , cond1, cond2, , v) 求由eq1,eq2,指定的常微分方程的符号解,参数cond1,cond2,为指定常微分方程的边界条件或初始条件,自变量v如果不指定,将为默认自变量。,在方程中,用大写字母D表示一次微分,D2和D3分别表示 二次及三次微分,D后面的字符为因变量。,【例5-33】 求常微分方程的通解。 clear S1=dsolve(Dy=-a*x,x) S1 =-1/2*a*x2+C1 其中C1表示所求出的解为通解。,【例5-34】 求解常微分方程的通解。 syms x y
40、S2=dsolve(D2y=cos(2*x)-y,y(0)=1,Dy(0)=0,x); S2 S2 =4/3*cos(x)-1/3*cos(2*x) 在上面的程序中,求解方程为y(x),而不是方程y(t),如果在命令中没有特别指明方程自变量x,得到的结果将是关于自变量t的表达式,如: syms x y S3=dsolve(D2y=cos(2*x)-y,y(0)=1,Dy(0)=0); S3 S3 =cos(t)*(-cos(2*x)+1)+cos(2*x),【例5-35】 求常微分方程组的通解。 clear syms x y y,x=dsolve(Dy=3*y+4*x,Dx=-4*y+3*x,
41、x(0)=1,y(0)=0); disp(y=);disp(y) y=exp(3*t)*cos(4*t) disp(x=);disp(x) x=exp(3*t)*sin(4*t)如果不使用符号微分方程组,而使用数值方程的方法来求解,相应的求解方法相比较而言则会相对复杂。,第五节 符号数学的简易绘图函数,一、二维绘图函数二维绘图函数plot是Matlab最基本和最 常用的绘图函数,其对应的简易绘图函数为 ezplot,前两个字母“ez”的含义是“Easy to”, 表示对应的命令是简易命令。这个命令的最大 特点就是,不需要用户对函数自变量进行赋值, 就可以直接画出字符串函数或者符号函数的图 形。
42、,ezplot的调用格式为: ezplot(f) 绘制表达式f的二维图形,x轴坐标的近似范围为-2,2 ezplot(f, xmin, xmax) 绘制表达式f的二维图形,x轴坐标的范围为xmin, xmax。其中,参数f可以是字符表达函数、符号函数、内联 函数等,但是所有的函数类型只能是一元函数。在默认情况下, ezplot命令会将函数表达式和自变量写成图形名称 和横坐标名称,用户可以根据需要使用title、xlabel 命令来给图形加标题和横坐标标识。,【例5-36】 绘制表达式的图形。 syms x y y=3*exp(-x)*(sin(x)-cos(x); ezplot(y),图5-6
43、 二维简易绘图,例5-37】 试绘制标准正态分布概率密度函数的函数曲线。 clear syms x ezplot(exp(-(x2/2)/sqrt(2*pi),-4,4) grid % 绘制网格命令,图5-7 加网格的二维简易绘图,ezpolar函数是极坐标下的二维绘图函数,其调用格式与ezplot相同。 【例5-38】 在极坐标下,绘制函数表达式的二维图形。 syms t ezpolar(sin(t)-cos(t)-0.4),图5-8 二维极坐标绘图,二、三维曲线绘图函数,三维曲线图的简易绘图函数为ezplot3,其调用格式为: ezplot3(x, y, z) 绘图由表达式x=x(t)、y
44、=y(t)和 z=z(t)定义的三维曲线,自变量t的变化范围为-2,2。 ezplot3(x, y, z, tmin, tmax) 绘制由表达式x=x(t)、y=y(t)和z=z(t)定义的三维曲线,自变量t的变化范围为tmin, tmax。 ezplot3(, animate) 如果在函数中增加animate 参数,则绘制三维动态轨迹图。,【例5-39】 根据表达式,绘制三维曲线。 syms t ezplot3(sin(t),cos(t),0.8*t,0,6*pi);,图5-9 三维曲线绘图,% 带有动画效果的三维曲线图 ezplot3(sin(t),cos(t),0.8*t,0,6*pi,
45、animate);,图5-10 带有动画效果的三维曲线绘图,例5-39分别画出了不加画效果和加动画效果的三维曲线图。在图5-10中,空间螺旋曲线顶端的红色小圆点,是从螺旋线的底端沿螺旋线轨迹运行到顶端的。左下角有一个重复运行的按钮(此按钮是自动生成的),当点击此按钮时,会重复此过程。,三、等高线绘图函数,等高线的简易绘图函数为ezcontour,其调用格式为: ezcontour(f) 绘制由表达式f(x, y)定义的等高线,自变量x 和y的变化范围均为-2,2。 ezcontour(f, domain) 绘制由表达式f(x, y)定义的等高线, 自变量x和y的变化范围由domain确定,do
46、main可以是41 阶的矢量xmin, xmax, ymin, ymax,也可以是21阶的矢 量min, max,当domain为21阶的矢量 时,minxmax,minymax。 ezcontour(, n) 绘制等高线时按nn的网格密度绘图, n的缺省值为60。,【例5-40】 绘制表达式的等高线。 syms x y f=2*(1-x)2*exp(-x2-(y+1)2)-8*(-x3+x/4-y5)*exp(-x2-y2)-1/2*exp(-(1+x)2-y2); ezcontour(f,-4,4,40),图5-11 等高线绘图,填充等高线的简易绘图函数为ezcontourf,其调用格式与
47、ezcontour相同。 【例5-41】 绘制表达式的填充等高线。 syms x y f=2*(1-x)2*exp(-x2-(y+1)2)-8*(-x3+x/4-y5)*exp(-x2-y2)-1/2*exp(-(1+x)2-y2); ezcontourf(f,-4,4,40),图5-12 填充等高线绘图,四、网格图绘图函数,网格图的简易绘图函数为ezmesh,其调用格式为: ezmesh(f) 绘制由表达式f(x, y)定义的网格图,自变量x和y的变化范围 均为-2,2。 ezmesh(f, domain) 绘制由表达式f(x, y)定义的网格图,自变量x和y 的变化范围由domain确定,
48、domain可以是41阶的矢量xmin, xmax,ymin, ymax,也可以是21阶的矢量min, max,当domain为21阶的 矢量时,minxmax, minymax。 ezmesh(x, y, z) 绘制由表达式x=x(s, t)、y=y(s, t)和z=z(s, t)定 义的参数表面网格图,自变量s和t的变化范围均为-2,2。 ezmesh(x, y, z, smin, smax, tmin, tmax) 绘制由表达式 x=x(s, t)、y=y(s, t)和z=z(s, t)定义的参数表面网格图,自变量 s和t的变化范围均为smin, smax, tmin, tmax。 ezmesh(, n) 绘制网格图时按nn的网格密度绘图,n的缺省值为60。 ezmesh(, circ) 以圆盘为自变量域绘制网格图。,