教      案
课题
名称
6.4  MATLAB
进  度
时  数
2
教学目
简单了解MATLAB符号表达式的基本运算函数和化简函数及替换函数。
会运用Matlab求符号微积分、符号方程、及级数
教材分
MATLAB的符号微积分和符号方程求解
MATLAB的泰勒级数
教学方法
讲授
教学资源
教材、网上资源
教具
投影仪
教学内
时间分配
一、符号对象
1、创建符号变量和符号矩阵
2、符号表达式的基本运算函数
3、符号表达式的化简函数
4、符号表达式的替换函数
二、符号微积分
1、符号极限
2、符号求导
3、符号积分
4、积分变换
三、符号方程求解
1、代数方程
2、符号微分方程求解
四、级数
1、级数的符号求和
2、函数的泰勒级数
10
5
5
5
5
5
10
10
10
10
10
5
教学后记
作业
备 注
6.4  MATLAB 符 号 计 算
一、符号对象
1、创建符号变量和符号矩阵
MATLAB的符号数学工具箱提供了两个sym和syms基本函数,用来创建符号变量和符号矩阵。
函数sym的调用格式为:
符号变量名=sym(‘表达式’)
说明:函数sym可创建一个符号变量,表达式可以是字符、字符串、数学表达式或字符表达式等。
函数syms的调用格式:
syms 符号变量名1  符号变量名2  符号变量名3  …
说明:函数syms可一次创建多个符号变量。
例6.25创建符号变量。
>> a=sym('matlab')
  a =
matlab
>> b=sym('3*x^2+4*x+7')
  b =
      3*x^2+4*x+7
在工作空间浏览器上可以看到A、B、C三个符号变量。使用sym函数和syms函数也可以创建符号矩阵。符号矩阵是一个数组,它的元素是符号表达式。MATLAB在内部把符号表达式表示成字符串,以与数字变量或运算相区别;否则,这些符号表达式几乎完全像基本的MATLAB命令。
例6.26 创建符号矩阵。
>> e=[1 3 5;2 4 6;7 9 11];    %建立数值矩阵
>> m=sym(e)              %创建符号矩阵
m =
[  1,  3,  5]
[  2,  4,  6]
[  7,  9, 11]
在命令窗口的显示中,数值矩阵只显示元素的数值,而符号矩阵的每行元素放在一对方括号内;在工作空间窗口显示的变量图标两者也不同,数值矩阵的图标为  ,符号矩阵(也称为符号对象)的图标为  ,二者很容易区分。
2、符号表达式的基本运算函数
符号表达式的运算与普通数值运算的方式不同,它的运算结果是符号表达式或符号矩阵。在MATLAB运算中,浮点运算速度最快,而符号计算占用时间和内存都比较多,但它的计算结果最精确。在默认情况下,当用函数sym生成符号变量后,MATLAB将对这些变量进行符号计算。在MATLAB符号计算工具箱中提供来了很多函数用于符号计算。下面将介绍一些常用的符号运算函数,如表6-6所示。
表6-6  常用的符号函数
函数格式
说明
symadd(S1S2)
符号表达式S1加上符号表达式S2
symsub(S1S2)
符号表达式S1减去符号表达式S2
symmul(S1S2)
符号表达式S1乘上符号表达式S2
symdiv(S1S2)
符号表达式S1除符号表达式S2
sympow(Sp)
符号表达式S1p次幂,p可以是表达式
例6.27 计算表达式x3-1与表达式x-1的和、差、积、商和乘方。
>> syms x
>> s1=x^3-1;
>> s2=x-1;
>> symadd(s1,s2)
ans =
    x^3-2+x
>> symsub(s1,s2)
ans =
x^3-x
>> symmul(s1,s2)
ans =
(x^3-1)*(x-1)
>> symdiv(s1,s2)
ans =
      (x^3-1)/(x-1)
>> sympow(s1,s2)
ans =
      (x^3-1)^(x-1)
3、符号表达式的化简函数
符号数学工具箱提供了符号表达式的因式分解、展开、合并、化简、通分等函数,见表6-7所示。
表6-7  符号表达式的化简函数
函数格式
说明
函数格式
说明
collect(sx)
合并自变量x的同幂系数
simple(s)
寻表达式的最简型
expand(s)
符号表达式s的展开
simplify(s)
符号表达式的化简
factor(s)
因式分解
radsimp(s)
对含根式的表达式s化简
numden(s)
符号表达式s的分式通分
horner(s)
符号表达式s的嵌套形式
例6.28 对表达式 进行因式分解。
>> syms x              %在命令窗口创建符号变量x
>> f=factor(x^3-1)       
f =
    (x-1)*(x^2+x+1)
例6.29 展开三角表达式sin(a+b)。
>> s=sym('sin(a+b)');      %sym函数创建符号变量
>> expand(s)
ans =
sin(a)*cos(b)+cos(a)*sin(b)
例6.30化简分式(4x2+8x+3)/(2x+1)。
>> syms x
>> s=(4*x^2+8*x+3)/(2*x+1);
>> simplify(s)
ans =
      2*x+3
4、符号表达式的替换函数
MATLAB的符号数学工具箱提供了两个符号表达式的替换函数subexpr和subs,可以通过符号替换使表达式的输出形式化简,得到一个简单的表达式。
函数Subexpr的调用格式为:
    [R,SYM]=subexpr(S,SYM)
说明:此函数用变量SYM(字符或字符串)的值代替符号表达式S中重复出现的字符串,R是返回替换后的结果。
函数subs的调用格式:
R=subs(S,old,new)
说明:该函数是用新的符号变量new替换原来符号表达式S中的变量old,R是替换后的符号表达式。需要注意的,当变量new是数值形式时,显示的结果虽然是数值,但它事实上是符号变量。要强制地求值需要用vpa函数。
例6.31 求表达式在x=1时的代数值。
>>clear
>>clc
>> syms x
>> s=(3*x^3+x^2-1)/(x^2+1);
>> r=subs(s,'x','1')
    r =
        (3*(1)^3+(1)^2-1)/((1)^2+1)
>> vpa(r)          %强制求值
    ans =
          1.5000000000000000000000000000000
二、符号微积分
1、符号极限
极限是微积分的基础,在MATLAB中,极限的求解是由limit函数实现的,其主要格式如表6-8所示。
表6-8  符号极限的函数格式
函数格式
说明
limit(s)
s为符号表达式。在系统默认表达式中的自变量趋向于0时的极限。
limit(sa)
a为常数。计算符号表达式s中由默认自变量趋向于a条件下的极限。
limit(sxa)
计算符号表达式sx趋向于a条件下的极限。
limit(sxa,‘right)
计算符号表达式sx趋向于a条件下的右极限
limit(Fxa,‘left)
计算符号表达式sx趋向于a条件下左的极限
例6.32 分别计算表达式
先在命令窗口创建符号变量a和x,再分别计算上面各表达式的极限。
>>clear
>>clc
>> syms x a;
>> limit(1/x,x,0, 'right')
  ans =
        inf
>> limit(1/x,x,0, 'left' )
  ans =
        -inf
>> limit (sin(x)/x)
  ans =
        1
>> limit((1+1/x)^x,x,inf,'left')
  ans =
        exp(1)
>> limit(exp(-x),x,0,'left')
  ans =
        1
2、符号求导
在符号数学工具箱中,表达式的导数由函数diff实现,其调用格式为:
diff(s,x,n)
说明:其中s为符号表达式,x为自变量,n为求导的阶数。
例6.33 分别计算表达式x5的一阶导数和三阶导数。
>>clear
>>clc
>> syms x
>> diff(x^5)
  ans =
        5*x^4
>> diff(x^5,3)
ans =
        60*x^2
3、符号积分
积分算法是非结构性的,许多函数的原函数存在,但不可用有限解析式表达式表示,即使可以求积分的函数,其求积分过程也可能很复杂,但利用MATLAB求积分就非常容易。在MATLAB的符号数学工具箱中,表达式的积分由函数int实现,该函数可求不定积分和定积分,其调用格式如表6-9所示。
表6-9  符号积分的函数格式
函数格式
说明
int(s)
求符号表达式s对于默认自变量的不定积分。
int(sx)
求符号表达式s对于自变量x的不定积分
int(sab)
求符号表达式s对于默认自变量从ab的定积分。
int(sxab)
求符号表达式s对于自变量xab的定积分。
例6.34 分别计算下列表达式的积分:
(1)  (2)  (3)  (4)
在命令窗口创建符号变量x和y,分别计算上面各表达式的积分。
>>clear
>>clc
>> syms x y
>> s=(4-3*x^2)^2;
>> int(s)
  ans =
        9/5*x^5-8*x^3+16*x
>> int(x/(x+y),x)
  ans =
        x-y*log(x+y)
>> int(x/(x+y),y)
ans =
        x*log(x+y)
>> int(x^2/(x+2),x,1,3)
    ans =
        4*log(5)-4*log(3)
>> double(ans)
ans =
    2.0433
4、积分变换
积分变换就是通过积分运算把一个函数f(原函数)变成另外一个函数F(像函数)。变化的过程是:
                     
其中二元函数称为变换的核,变换的核决定了变换的不同名称。在一定的条件下原函数和像函数之间是一一对应的,可以相互转化。积分变换的意义是换一个角度来认识函数,积分变换的一项基本应用是解微分方程,求解过程是基于这样一种想法:假如不容易从原方程直接求得解f,则对原方程进行变换,如果能从变换后的方程中求得解F,则对F进行逆变换,即可求得原方程的解f,当然,在选择变换的核时,应该使得变换以后的方程比原方程容易求解。MATLAB提供的变换函数如表6-10所示。
表6-10  常用的积分变换函数
函数名称
函数格式
说明
傅立叶变换
fourier(fxxt)
Fx为函数f(x)的符号表达式、x为自变量、t像函数F(t)的自变量。结果为函数f(x)的傅立叶像函数F(t)
ifourier(Fwtx)
Fw为函数F(t)的符号表达式、t为自变量、x为原函数f(x)的自变量。结果为函数F(t)的傅立叶原函数f(x)
拉普拉斯变换
laplace(fxxt)
结果为函数f(x)的拉普拉斯像函数F(t)
ilaplace(Fwtx)
结果为函数F(t)的拉普拉斯原函数f(x)
Z变换
ztrans(fxxt)
结果为函数f(x)Z变换像函数F(t)
iztrans(Fwtx)
结果为函数F(t)matlab求导Z变换原函数f(x)
例6.35 求函数的傅立叶变换及其逆变换。
>> syms x t
>> y=exp(-x^2);
>> Ft=fourier(y,x,t)        %傅立叶变换
Ft =
pi^(1/2)*exp(-1/4*t^2)
>> fx=ifourier(Ft,t,x)      %傅立叶逆变换
fx =
1/2*4^(1/2)*exp(-x^2)
三、符号方程求解
1、代数方程
代数方程是指未涉及微积分运算的方程,相对比较简单。在MATLAB符号数学工具箱中,求解用符号表达式表示的代数方程可由函数solve实现,其调用格式如表6-11所示。
表6-11 符号方程的函数
函数格式
说明
solve(s)
求解符号表达式s=0的代数方程,自变量为默认自变量
solve(sx)
求解符号表达式s=0的代数方程,自变量为x
solve(s1,s2,…snx1,x2,...xn)
求解由符号表达式s1,s2,…sn组成的代数方程组,自变量分别为x1,x2,...xn
例6.36 分别求解代数方程ax2+bx+c=0。
在命令窗口创建符号变量a、b、c和x。
>>clear
>>clc
>> syms  a  b  c  x
>> s=a*x^2+b*x+c;
>> solve(s)
  ans =
        [ 1/2/a*(-b+(b^2-4*a*c)^(1/2))]
[ 1/2/a*(-b-(b^2-4*a*c)^(1/2))]
例6.37 求解代数方程组:
在命令窗口创建符号变量x、y、z,求解方程组。
>> syms x y z
>> s1=2*x^2+y^2-3*z-4;
>> s2=y+z-3;
>> s3=x-2*y-3*z;
>> [x,y,z]=solve(s1,s2,s3)
x =
[ 7/2+1/6*i*699^(1/2)]
[ 7/2-1/6*i*699^(1/2)]
y =
    [ 11/2-1/6*i*699^(1/2)]
[ 11/2+1/6*i*699^(1/2)]
z =
[ -5/2+1/6*i*699^(1/2)]
[ -5/2-1/6*i*699^(1/2)]
2、符号微分方程求解
在MATLAB中,用大写字母D来表示微分方程的导数。例如:Dy表示,D2y表示。D2y+Dy+x-10=0表示微分方程。Dy(0)=3表示
在符号数学工具箱中,求解表达式微分方程的符号解由函数dsolve实现,其调用格式为:
r=dsolve(eq,cond, var)
说明:式中eq代表常微分方程,cond代表常微分方程的边界条件或初始条件,var代表自变量,缺省是按系统默认原则处理。该函数可求解微分方程的特解。
r=dsolve(eq1, eq2eqN,cond1, cond2condN, var1varN)
说明:该函数求解由eq1,eq2,指定的常微分方程组在条件cond1,cond2,,condN下的符号解,若不给出初始条件,则求方程组的通解。var1,,varN为求解变量,如果不指定,将为默认自变量。
例6.38 求微分方程的通解。
在命令窗口分别输入表达式,求解方程。
>> y=dsolve('Dy-(t^2+y^2)/t^2/2','t')    %方程右端的零可以不写
    y =
      t*(-log(t)+2+C1)/(-log(t)+C1)          %通解
例6.39 求微分方程的通解,和当y(0)=1时的特解。
在命令窗口输入表达式,求解方程。
>> y=dsolve('Dy=2*x*y^2','x')            %求通解
y =
  -1/(x^2-C1)
>> y=dsolve('Dy=2*x*y^2','y(0)=1','x')    %求特解
y =
-1/(x^2-1)
四、级数
1、级数的符号求和
数值级数和函数级数是高等数学的重点研究内容,也是物理学以及其他工程技术学科的重要理论基础和分析工具。在MATLAB符号数学工具中,级数表达式的求和由函数symsum实现,其调用格式如表6-12。
表6-12  级数求和函数
函数格式
说明
symsum(S)
计算符号表达式S(表示级数的通项)对于默认自变量的不定和。
symsum(S,x)
计算符号表达式S对于自变量x的不定和。
symsum(S,a,b)
计算符号表达式S对于默认自变量从a到b的有限和。
symsum(S,x,a,b)
计算符号表达式S对于自变量x从a到b的有限和。
6.40 分别计算表达式
在命令窗口创建符号变量k和x,分别计算上面各表达式。
>>clear
>>clc
>> syms x k
>> symsum(k)
  ans =
        1/2*k^2-1/2*k
>> symsum(k^2-3,0,10)
    ans =
          352
>> symsum(x^k/k,k,1,inf)
    ans =
          -log(1-x)
2、函数的泰勒级数
泰勒级数可以将一个任意函数表示为一个幂级数,并且,在许多情况下,只需要取幂级数的前有限项来表示该函数,这对于大多数工程应用问题来说,精度已经足够。在MATLAB符号数学工具中,表达式的Taylor级数展开由函数taylor实现,其调用格式如表6-13所示。
表6-13  泰勒级数函数格式
函数格式
说明
taylor(s)
计算符号表达式s在默认自变量等于0处的5阶Taylor级数展开式。
taylor(s,n)
计算符号表达式s在默认自变量等于0处的n-1阶Taylor级数展开式。
taylor(f,n,a)
计算符号表达式s在默认自变量等于a处的n-1阶Taylor级数展开式
taylor(f,x,n,a)
计算符号表达式s在自变量x等于a处的n-1阶Taylor级数展开式
6.41 分别计算表达式的5阶泰勒级数展开式和12阶泰勒级数展开式。
在命令窗口创建符号变量,分别计算上面各表达式。
>>clear
>>clc
>> syms x
>> s=(1-x+x^2)/(1+x+x^2);
>> taylor(s)
ans =
      1-2*x+2*x^2-2*x^4+2*x^5
>> taylor(s,x,12)
ans =
      1-2*x+2*x^2-2*x^4+2*x^5-2*x^7+2*x^8-2*x^10+2*x^11