首页数学计算数学MATLAB基础与应用 04 第四章 MATLAB符号计算.pptx

04 第四章 MATLAB符号计算.pptx

页数:72页文件大小:547.4 KB来源: MATLAB基础与应用ppt课件

本课件讲解MATLAB符号计算工具箱的用法:从符号常量、符号变量与符号表达式的创建入手,依次介绍符号极限、符号微分、符号积分、级数求和与泰勒展开、代数方程与微分方程的符号求解,以及傅里叶、拉普拉斯、Z变换等积分变换的实现。

第4章MATLAB符号计算封面,标示本章主题为MATLAB符号数学工具箱的应用
第4章学习目标页,列出符号对象创建、极限微分积分级数、积分变换与方程求解等九项要求
第4章知识结构图,展示符号表达式建立、极限微积分级数、可视化、方程求解与积分变换各分支
查看本课件的文字版(共 72 页,供检索与复制)

第1页:第4章 MATLAB符号计算

本页为《MATLAB基础与应用》第4章 MATLAB符号计算的章节封面。

第2页:本章学习目标

学习目地

  • 掌握符号对象的创建和常见操作
  • 掌握符号极限的计算
  • 掌握符号微分的计算
  • 掌握符号积分的计算
  • 掌握符号级数的计算
  • 掌握常见积分变换的计算
  • 掌握符号方程的求解
  • 掌握符号函数的可视化
  • 掌握Maple函数的使用

第3页:本章知识结构

本章知识结构:MATLAB符号计算的内容分为以下几支。

  • 符号表达式的建立:符号常量、符号变量与符号表达式、符号矩阵
  • 符号表达式的代数运算与操作和转换
  • 符号极限、微积分和级数求和:符号极限、符号微分、符号积分、符号级数
  • 符号积分变换:Fourier变换、Laplace变换、Z变换
  • 符号方程的求解与符号函数的可视化、Maple函数的使用

第4页:4.1.1 创建符号常量

4.1 符号表达式的建立:Symbolic Math Toolbox规定在进行符号计算时,首先要定义基本的符号对象然后才能进行符号运算。

符号常量
不含变量的符号表达式,用 sym 命令来创建。
  • 语法 sym('常量') 创建符号常量
  • 语法 sym(常量,参数) 把常量按某种格式转换为符号常量
>> a=sym('sin(2)') a = sin(2)

第5页:表4-1 sym命令参数设置

参数可以选择为‘d’、‘f’、‘e’或‘r’四种格式,也可省略,其作用如表4-1所示。

sym命令参数设置
参数作用
d返回最接近的十进制数值(默认位数为32位)
f返回该符号值最接近的浮点表示
r返回该符号值最接近的有理数型(为系统默认方式),可表示为 p/q、p*q、10^q、pi/q、2^q 和 sqrt(p) 形式之一
e返回最接近的带有机器浮点误差的有理值
>> a=sym(sin(2)) % 按系统默认格式转换为符号常量 a = 8190223105242182*2^(-53)

第6页:例4-1 创建数值常量和符号常量

例4-1:创建数值常量和符号常量。

>> a1=2*sqrt(5)+pi % 创建数值常量 a1 = 7.6137 >> a2=sym('2*sqrt(5)+pi') % 创建符号表达式 a2 = 2*sqrt(5)+pi >> a3=sym(2*sqrt(5)+pi) % 按最接近的有理数型表示符号常量 a3 = 8572296331135796*2^(-50) >> a4=sym(2*sqrt(5)+pi,'d') % 按最接近的十进制浮点数表示符号常量 a4 = 7.6137286085893727261009189533070 >> a31=a3-a1 % 数值常量和符号常量的计算 a31 = 0

第7页:字符串常量与工作空间查看

>> a5='2*sqrt(5)+pi' % 字符串常量 a5 = 2*sqrt(5)+pi

可以通过查看工作空间来查看各变量的数据类型和存储空间,工作空间如图4.1所示。

第8页:4.1.2 创建符号变量和表达式

创建符号变量和符号表达式可以使用 sym 和 syms 命令。

1.使用 sym 命令 语法:sym('变量',参数) 把变量定义为符号对象。参数用来设置限定符号变量的数学特性,可选择为‘positive’、‘real’和‘unreal’:‘positive’表示「正、实」符号变量,‘real’表示「实」符号变量,‘unreal’表示「非实」符号变量,不限定则参数可省略。

例4-2:创建符号变量,用参数设置其特性。

>> syms x y real % 创建实数符号变量 >> z=x+i*y; % 创建z为复数符号变量 >> real(z) % 复数z的实部是实数x ans = x >> sym('x','unreal'); % 清除符号变量的实数特性 >> real(z) % 复数z的实部

第9页:例4-2(续)与syms命令语法

ans = 1/2*x+1/2*conj(x)

程序分析:设置x、y为实数型变量,可以确定z的实部和虚部。

语法 sym('表达式') 创建符号表达式。例4-3:创建符号表达式。

>> syms x y real >> f1=sym('a*x^2+b*x+c') f1 = a*x^2+b*x+c

2.使用 syms 命令 语法:syms('arg1','arg2',…,参数) 把字符变量定义为符号变量,syms arg1 arg2 …,参数 为其简洁形式。syms 用来创建多个符号变量,这两种方式创建的符号对象是相同的,参数设置和 sym 命令相同,省略时符号表达式直接由各符号变量组成。

第10页:4.1.3 符号矩阵

例4-4:使用 syms 命令创建符号变量和符号表达式。

>> syms a b c x % 创建多个符号变量 >> f2=a*x^2+b*x+c % 创建符号表达式 f2 = a*x^2+b*x+c >> syms('a','b','c','x') >> f3=a*x^2+b*x+c; % 创建符号表达式

程序分析:既创建了符号变量a、b、c、x,又创建了符号表达式,f2、f3和f1符号表达式相同。

4.1.3 符号矩阵:用 sym 和 syms 命令也可以创建符号矩阵。

>> A=sym('[a,b;c,d]') A = [ a, b] [ c, d] >> syms a b c d >> A=[a b;c d] A = [ a, b] [ c, d]

第11页:例4-5 符号矩阵与字符串矩阵

例4-5:比较符号矩阵与字符串矩阵的不同。

>> A=sym('[a,b;c,d]') % 创建符号矩阵 A = [ a, b] [ c, d] >> B='[a,b;c,d]' % 创建字符串矩阵 B = [a,b;c,d] >> C=[a,b;c,d] % 创建数值矩阵 ??? Undefined function or variable 'a'.

第12页:例4-5(续)转换与变量信息

程序分析:由于数值变量a、b、c、d未事先赋值,MATLAB给出错误信息。

>> C=sym(B) % 转换为符号矩阵 C = [ a, b] [ c, d] >> whos Name Size Bytes Class A 2x2 312 sym object B 1x9 18 char array C 2x2 312 sym object Grand total is 25 elements using 642 bytes

程序分析:查看符号矩阵A,可以看到为2×2的符号矩阵,占用较多的字节。

第13页:4.2 符号运算与数值运算的区别

4.2 符号表达式的代数运算:符号运算与数值运算的区别主要有以下几点。

  1. 传统的数值型运算受计算机所保留的有效位数限制,内部表示法采用硬件提供的8位浮点表示法,每一次运算都会有一定的截断误差,重复的多次数值运算可能造成很大的累积误差;符号运算不需要进行数值运算,不会出现截断误差,因此符号运算是非常准确的
  2. 符号运算可以得出完全的封闭解或任意精度的数值解
  3. 符号运算的时间较长,而数值型运算速度快

第14页:4.2.1 符号运算中的运算符

4.2.1 符号表达式的代数运算:符号表达式的运算符和基本函数都与数值计算中的几乎完全相同。

1.符号运算中的运算符

  • 基本运算符「+」「-」「*」「\」「/」「^」分别实现符号矩阵的加、减、乘、左除、右除、求幂运算
  • 运算符「.*」「./」「.\」「.^」分别实现符号数组的乘、除、求幂,即数组间元素与元素的运算
  • 运算符「′」「.′」分别实现符号矩阵的共轭转置、非共轭转置

(2)关系运算符:在符号对象的比较中,没有「大于」「大于等于」「小于」「小于等于」的概念,而只有是否「等于」的概念;运算符「==」「~=」分别对运算符两边的符号对象进行「相等」「不相等」的比较。

第15页:2.符号运算中的函数运算

2.函数运算

(1)三角函数和双曲函数
三角函数包括 sin、cos、tan;双曲函数包括 sinh、cosh、tanh;三角反函数除 atan2 仅能用于数值计算外,其余 asin、acos、atan 在符号运算中与数值计算的使用方法相同。
(2)指数和对数函数
指数函数 sqrt、exp、expm 的使用方法与数值计算完全相同;对数函数在符号计算中只有自然对数 log(表示ln),而没有数值计算中的 log2 和 log10。
(3)复数函数
复数的共轭 conj、求实部 real、求虚部 imag 和求模 abs 与数值计算中的使用方法相同;但注意在符号计算中MATLAB没有提供求相角的命令。
(4)矩阵代数命令
常用矩阵代数命令有 diag、triu、tril、inv、det、rank、poly、expm、eig 等,用法几乎与数值计算中的情况完全一样。

第16页:例4-6 符号矩阵的行列式与转置

例4-6:求矩阵的行列式值、非共轭转置和特征值。

>> syms a11 a12 a21 a22 >> A=[a11 a12;a21 a22] % 创建符号矩阵 A = [ a11, a12] [ a21, a22] >> det(A) % 计算行列式 ans = a11*a22-a12*a21 >> A.' % 计算非共轭转置 ans = [ a11, a21] [ a12, a22]

第17页:例4-6(续)与例4-7 表达式代数运算

>> eig(A) % 计算特征值 ans = [ 1/2*a11+1/2*a22+1/2*(a11^2-2*a11*a22+a22^2+4*a12*a21)^(1/2)] [ 1/2*a11+1/2*a22-1/2*(a11^2-2*a11*a22+a22^2+4*a12*a21)^(1/2)]

例4-7:符号表达式 f=2x2+3x+4 与 g=5x+6 的代数运算。

>> f=sym('2*x^2+3*x+4') f = 2*x^2+3*x+4 >> g=sym('5*x+6') g = 5*x+6 >> f+g % 符号表达式相加 ans = 2*x^2+8*x+10 >> f*g % 符号表达式相乘

第18页:4.2.2 任意精度控制

ans = (2*x^2+3*x+4)*(5*x+6)

4.2.2 符号数值任意精度控制和运算 1.Symbolic Math Toolbox中的算术运算方式有三种不同的算术运算。

  • 数值型:MATLAB的浮点运算
  • 有理数型:Maple的精确符号运算
  • VPA型:Maple的任意精度运算

2.任意精度控制:任意精度的VPA型运算可以使用 digits 和 vpa 命令来实现。

  • 语法 digits(n) 设定默认的精度,n为所期望的有效位数;digits函数可以改变默认的有效位数来改变精度,随后的每个Maple函数计算都以新精度为准,有效位数增加时计算时间和占用内存也增加
  • 命令「digits」用来显示默认的有效位数,默认为32位

第19页:例4-8 任意精度控制的比较

语法 S=vpa(s,n):将s表示为n位有效位数的符号对象。s可以是数值对象或符号对象,但计算结果S一定是符号对象;当参数n省略时则以给定的 digits 指定精度。vpa 命令只对指定的符号对象s按新精度进行计算,并以同样的精度显示计算结果,但并不改变全局的 digits 参数。

例4-8:对表达式进行任意精度控制的比较。

>> a=sym('2*sqrt(5)+pi') a = 2*sqrt(5)+pi >> digits % 显示默认的有效位数 Digits = 32 >> vpa(a) % 用默认的位数计算并显示 ans = 7.6137286085893726312809907207421 >> vpa(a,20) % 按指定的精度计算并显示

第20页:例4-8(续)三种运算方式比较

ans = 7.6137286085893726313 >> digits(15) % 改变默认的有效位数 >> vpa(a) % 按digits指定的精度计算并显示 ans = 7.61372860858937

3.Symbolic Math Toolbox中的三种运算方式的比较 例4-8续:用三种运算方式表达式比较 2/3 的结果。

>> a1 =2/3 % 数值型 a1 = 0.6667 >> a2 = sym(2/3) % 有理数型 a2 = 2/3 >> a3 =vpa('2/3',32) % VPA型 a3 = 0.66666666666666666666666666666667

第21页:三种运算方式的比较分析

程序分析

  1. 三种运算方式中数值型运算的速度最快
  2. 有理数型符号运算的计算时间和占用内存是最大的,产生的结果是非常准确的
  3. VPA型的任意精度符号运算比较灵活,可以设置任意有效精度,当保留的有效位数增加时,每次运算的时间和使用的内存也会增加
  4. 数值型变量a1结果显示的有效位数并不是存储的有效位数,显示的有效位数由「format」命令控制

如下面修改「format」命令就改变了显示的有效位数:

>> format long >> a1 a1 = 0.66666666666667

第22页:4.2.3 符号对象与数值对象的转换

4.2.3 符号对象与数值对象的转换 1.将数值对象转换为符号对象:sym 命令可以把数值型对象转换成有理数型符号对象,vpa 命令可以将数值型对象转换为任意精度的VPA型符号对象。

2.将符号对象转换为数值对象:使用 double、numeric 函数可以将有理数型和VPA型符号对象转换成数值对象。

  • N=double(S) 将符号变量S转换为数值变量N
  • N=numeric(S) 将符号变量S转换为数值变量N

例4-9:将符号变量与数值变量进行转换。

>> clear >> a1=sym('2*sqrt(5)+pi') a1 = 2*sqrt(5)+pi >> b1=double(a1) % 转换为数值变量 b1 = 7.6137

第23页:例4-9(续)符号转数值

>> a2=vpa(sym('2*sqrt(5)+pi'),32) a2 = 7.6137286085893726312809907207421 >> b2=numeric(a2) % 转换为数值变量 b2 = 7.6137

由符号变量得出数值结果。

>> b3=eval(a1) b3 = 7.6137

用「whos」命令查看变量的类型,可以看到b1、b2、b3都转换为双精度型:

>> whos Name Size Bytes Class a1 1x1 148 sym object a2 1x1 190 sym object b1 1x1 8 double array

第24页:例4-9(续)变量类型一览

 b2 1x1 8 double array b3 1x1 8 double array Grand total is 50 elements using 362 bytes

第25页:4.3.1 自由变量的确定

4.3 符号表达式的操作和转换 4.3.1 符号表达式中自由变量的确定 1.自由变量的确定原则:MATLAB将基于以下原则选择一个自由变量。

  • 小写字母 i 和 j 不能作为自由变量
  • 符号表达式中如果有多个字符变量,则按以下顺序选择自由变量:首先选择 x 作为自由变量;如果没有 x,则选择在字母顺序中最接近 x 的字符变量;如果与 x 相同距离,则在 x 后面的优先
  • 大写字母比所有的小写字母都靠后

2.findsym函数:如果不确定符号表达式中的自由符号变量,可以用 findsym 函数来自动确定,语法 findsym(EXPR,n)。

第26页:例4-10 findsym确定符号变量

说明:EXPR可以是符号表达式或符号矩阵;n为按顺序得出符号变量的个数,当n省略时,则不按顺序得出EXPR中所有的符号变量。

例4-10:得出符号表达式中的符号变量。

>> f=sym('a*x^2+b*x+c') f = a*x^2+b*x+c >> findsym(f) % 得出所有的符号变量 ans = a, b, c, x >> g=sym('sin(z)+cos(v)') g = sin(z)+cos(v) >> findsym(g,1) % 得出第一个符号变量 ans = z

程序说明:符号变量 z 和 v 距离 x 相同,以在 x 后面的 z 为自由符号变量。

第27页:4.3.2 符号表达式的化简

4.3.2 符号表达式的化简:同一个数学函数的符号表达式可以表示成三种形式,例如以下的 f(x) 就可以分别表示为。

  1. 多项式形式:f(x)=x3+6x2+11x-6
  2. 因式形式:f(x)=(x-1)(x-2)(x-3)
  3. 嵌套形式:f(x)=x(x(x-6)+11)-6

例4-11:三种形式的符号表达式的表示。

>> f=sym('x^3-6*x^2+11*x-6') % 多项式形式 f = x^3-6*x^2+11*x-6 >> g= sym('(x-1)*(x-2)*(x-3)') % 因式形式 g = (x-1)*(x-2)*(x-3) >> h= sym(' x*(x*(x-6)+11)-6') % 嵌套形式 h = x*(x*(x-6)+11)-6

第28页:pretty与collect函数

1.pretty函数:给出例4-11相应的符号表达式形式。

>> pretty(f) 3 2 x - 6 x + 11 x - 6

2.collect函数:给出例4-11相应的符号表达式形式。

>> collect(g) ans = x^3-6*x^2+11*x-6

当有多个符号变量,可以指定按某个符号变量来合并同类项。下面有x、y符号变量的表达式:

>> f1=sym('x^3+2*x^2*y+4*x*y+6') f1 = x^3+2*x^2*y+4*x*y+6 >> collect(f1,'y') % 按y来合并同类项 ans = (2*x^2+4*x)*y+x^3+6

第29页:expand、horner、factor与simplify

3.expand函数

>> expand(g) ans = x^3-6*x^2+11*x-6

4.horner函数

>> horner(f) ans = x*(x*(x-6)+11)-6

5.factor函数

>> factor(f) ans = (x-1)*(x-2)*(x-3)

6.simplify函数:例4-11中利用三角函数来简化符号表达式 cos2x-sin2x。

>> y=sym('cos(x)^2-sin(x)^2') y = cos(x)^2-sin(x)^2 >> simplify(y) ans = 2*cos(x)^2-1

第30页:simple函数给出多种简化形式

7.simple函数:simple函数给出多种简化形式,给出除了 pretty、collect、expand、factor、simplify 简化形式之外的 radsimp、combine、combine(trig)、convert 形式,并寻求包含最少数目字符的表达式简化形式。例4-11中利用 simple 简化符号表达式 cos2x-sin2x。

>> simple(y) simplify: 2*cos(x)^2-1 radsimp: cos(x)^2-sin(x)^2 combine(trig):

第31页:simple函数输出形式(续)

cos(2*x) factor: (cos(x)-sin(x))*(cos(x)+sin(x)) expand: cos(x)^2-sin(x)^2 combine: cos(2*x) convert(exp): (1/2*exp(i*x)+1/2/exp(i*x))^2+1/4*(exp(i*x)-1/exp(i*x))^2 convert(sincos): cos(x)^2-sin(x)^2 convert(tan): (1-tan(1/2*x)^2)^2/(1+tan(1/2*x)^2)^2-4*tan(1/2*x)^2/(1+tan(1/2*x)^2)^2 collect(x):

第32页:4.3.3 符号表达式的替换

cos(x)^2-sin(x)^2 ans = cos(2*x)

程序分析:得出最简化的符号表达式为「cos(2*x)」。

4.3.3 符号表达式的替换 1.subexpr函数 语法:subexpr(s,s1) 用符号变量s1来置换s中的子表达式。subexpr函数对子表达式是自动寻找的,只有比较长的子表达式才被置换,比较短的子表达式即使重复出现多次也不被置换。

例4-12:用 subexpr 函数使的特征值表达式简洁。

>> syms a b c d x >> s=eig([a b;c d]) % 计算特征值

第33页:subexpr与subs函数

s = [ 1/2*a+1/2*d+1/2*(a^2-2*a*d+d^2+4*b*c)^(1/2)] [ 1/2*a+1/2*d-1/2*(a^2-2*a*d+d^2+4*b*c)^(1/2)] >> subexpr(s,x) % 用x替换子表达式 ans = [ 1/2*a+1/2*d+1/2*(a^2-2*a*d+d^2+4*b*c)^(1/2)] [ 1/2*a+1/2*d-1/2*(a^2-2*a*d+d^2+4*b*c)^(1/2)]

2.subs函数:subs函数可用来对符号表达式中符号变量进行替换。

  • subs(s) 用给定值替换符号表达式s中的所有变量
  • subs(s,new) 用new替换符号表达式s中的自由变量
  • subs(s,old,new) 用new替换符号表达式s中的old变量

例4-13:用 subs 函数对符号表达式 (x+y)2+3(x+y)+5 进行替换。

>> f=sym('(x+y)^2+3*(x+y)+5') % 创建符号表达式 f = (x+y)^2+3*(x+y)+5 >> x=5; >> f1=subs(f) % 用工作空间的给定值替换x

第34页:4.3.4 求反函数和复合函数

f1 = (5+y)^2+20+3*y >> f2=subs(f,'x+y','s') % 用s替换x+y f2 = ((s))^2+3*((s))+5 >> f3=subs(f,'x+y',5) % 用常数5替换x+y f3 = 45 >> f4=subs(f,'x','z') % 用z替换x f4 = ((z)+y)^2+3*((z)+y)+5

4.3.4 求反函数和复合函数:在MATLAB中 finverse 函数可以求得符号函数的反函数。语法 finverse(f,v) 对指定自变量v的函数f(v)求反函数;当v省略,则对默认的自由符号变量求反函数。

第35页:例4-14 求反函数

1.求反函数 例4-14:求 t*ex 的反函数。

>> f=sym('t*e^x') % 原函数 f = t*e^x >> g=finverse(f) % 对默认自由变量求反函数 g = log(x/t)/log(e) >> g=finverse(f,'t') % 对t求反函数 g = t/(e^x)

程序分析:如果先定义t为符号变量,则参数‘t’的单引号可去掉。

>> syms t >> g=finverse(f,t)

第36页:例4-15 求复合函数

2.求复合函数 例4-15:计算 t*ex 与 a*y2+b*y+c 的复合函数。

>> f=sym('t*e^x'); % 创建符号表达式 >> g=sym('a*y^2+b*y+c'); % 创建符号表达式 >> h1=compose(f,g) % 计算f(g(x)) h1 = t*e^(a*y^2+b*y+c) >> h2=compose(g,f) % 计算g(f(x)) h2 = a*t^2*(e^x)^2+b*t*e^x+c >> h3=compose(f,g,'z') % 计算f(g(z)) h3 = t*e^(a*z^2+b*z+c)

计算得出 t*ex 与 y2 的复合函数。

>> f1=sym('t*e^x'); >> g1=sym('y^2'); >> h1=compose(f1,g1)

第37页:例4-15(续)compose与subs

h1 = t*e^(y^2) >> h2=compose(f1,g1,'z') % 计算f(g(z)) h2 = t*e^(z^2) >> h3=compose(f1,g1,'t','y') % 以t为自变量计算f(g(z)) h3 = y^2*e^x >> h4=compose(f1,g1,'t','y','z') % 以t为自变量计算f(g(z)),并用z替换y h4 = z^2*e^x >> h5=subs(h3,'y','z') % 用替换的方法实现h5与h4相同结果 h5 = (z)^2*e^x

第38页:4.3.5 符号表达式与多项式的转换

4.3.5 符号表达式的转换 1.符号表达式与多项式的转换:构成多项式的符号表达式 f(x) 可以与多项式系数构成的行向量进行相互转换,MATLAB提供了函数 sym2poly 和 poly2sym 实现相互转换。

(1)sym2poly函数 例4-16:将符号表达式 2x+3x2+1 转换为行向量。

>> f=sym('2*x+3*x^2+1') f = 2*x+3*x^2+1 >> sym2poly(f) % 转换为按降幂排列的行向量 ans = 3 2 1 >> f1=sym('a*x^2+b*x+c') f1 = a*x^2+b*x+c

第39页:poly2sym与numden函数

>> sym2poly(f1) ??? Error using ==> sym/sym2poly Input has more than one symbolic variable.

程序分析:只能对含有一个变量的符号表达式进行转换。

(2)poly2sym函数 例4-16续:将行向量转换为符号表达式。

>> g=poly2sym([1 3 2]) % 默认x为符号变量的符号表达式 g = x^2+3*x+2 >> g=poly2sym([1 3 2],sym('y')) % y为符号变量的符号表达式 g = y^2+3*y+2

2.提取分子和分母:如果符号表达式是一个有理分式(两个多项式之比),可以利用 numden 函数来提取分子或分母,还可以进行通分。语法 [n,d]=numden(f);n为分子,d为分母,f为有理分式。

第40页:例4-17 提取分子和分母

例4-17:用 numden 函数来提取符号表达式的分子、分母。

>> f1=sym('1/(s^2+3*s+2)') f1 = 1/(s^2+3*s+2) >> f2=sym('1/s^2+3*s+2') f2 = 1/s^2+3*s+2 >> [n1,d1]=numden(f1) n1 = 1 d1 = s^2+3*s+2 >> [n2,d2]=numden(f2) n2 = 1+3*s^3+2*s^2 d2 = s^2

第41页:表4-2 limit函数的用法

4.4 符号极限、微积分和级数求和 4.4.1 符号极限:假定符号表达式的极限存在,Symbolic Math Toolbox提供了直接求表达式极限的函数 limit,函数 limit 的基本用法如表4-2。

limit函数的用法
表达式说明
limit(f)对x求趋近于0的极限
limit(f,x,a)对x求趋近于a的极限,当左右极限不相等时极限不存在
limit(f,x,a,'left')对x求左趋近于a的极限
limit(f,x,a,'right')对x求右趋近于a的极限

说明:源文件中该函数名多处写作 limt,MATLAB标准函数名是 limit,表中按标准函数名列出。

第42页:例4-18 求1/x在0处的极限

例4-18:分别求 1/x 在0处从两边趋近、从左边趋近和从右边趋近的三个极限值。

>> f=sym('1/x') f = 1/x >> limit(f) % 对x求趋近于0的极限 ans = NaN >> limit(f,'x',0) % 对x求趋近于0的极限 ans = NaN >> limit(f,'x',0,'left') % 左趋近于0 ans = -inf >> limit(f,'x',0,'right') % 右趋近于0 ans = inf

程序分析:当左右极限不相等,表达式的极限不存在为NaN。

第43页:4.4.2 符号微分与diff函数

4.4.2 符号微分:求例4-18函数 cos(x) 的导数。

>> syms t x >> limit((cos(x+t)-cos(x))/t,t,0) ans = -sin(x)

函数 diff 是用来求符号表达式的微分的。

  • diff(f) 求f对自由变量的一阶微分
  • diff(f,t) 求f对符号变量t的一阶微分
  • diff(f,n) 求f对自由变量的n阶微分
  • diff(f,t,n) 求f对符号变量t的n阶微分

第44页:例4-19 求符号表达式的微分

例4-19:已知 f(x)=ax2+bx+c,求 f(x) 的微分。

>> f=sym('a*x^2+b*x+c') f = a*x^2+b*x+c >> diff(f) % 对默认自由变量x求一阶微分 ans = 2*a*x+b >> diff(f,'a') % 对符号变量a求一阶微分 ans = x^2 >> diff(f,'x',2) % 对符号变量x求二阶微分 ans = 2*a >> diff(f,3) % 对默认自由变量x求三阶微分 ans = 0

微分函数 diff 也可以用于符号矩阵,其结果是对矩阵的每一个元素进行微分运算。

第45页:例4-19(续)符号矩阵求微分

例4-19中对符号矩阵求微分。

>> syms t x >> g=[2*x t^2;t*sin(x) exp(x)] % 创建符号矩阵 g = [ 2*x, t^2] [ t*sin(x), exp(x)] >> diff(g) % 对默认自由变量x求一阶微分 ans = [ 2, 0] [ t*cos(x), exp(x)] >> diff(g,'t') % 对符号变量t求一阶微分 ans = [ 0, 2*t] [ sin(x), 0] >> diff(g,2) % 对默认自由变量x求二阶微分 ans =

第46页:例4-19(续)二阶微分与元素差值

ans = [ 0, 0] [ -t*sin(x), exp(x)]

4.4.3 符号积分 注意:diff 还可以用于对数组中的元素进行逐项求差值。例4-19中使用 diff 计算向量间元素的差值。

>> x1=0:0.5:2; >> y1=sin(x1) y1 = 0 0.4794 0.8415 0.9975 0.9093 >> diff(y1) % 计算元素差 ans = 0.4794 0.3620 0.1560 -0.0882

程序分析:计算出的差值比原来的向量少一列。

第47页:例4-20 求符号积分

积分有定积分和不定积分,运用函数 int 可以求得符号表达式的积分。

  • int(f,'t') 求符号变量t的不定积分
  • int(f,'t',a,b) 求符号变量t的积分
  • int(f,'t','m','n') 求符号变量t的积分

例4-20:求积分和。

>> f=sym('cos(x)'); >> int(f) % 求不定积分 ans = sin(x) >> int(f,0,pi/3) % 求定积分 ans = 1/2*3^(1/2) >> int(f,'a','b') % 求定积分 ans = sin(b)-sin(a) >> int(int(f)) % 求多重积分

第48页:例4-20(续)符号矩阵求积分

ans = -cos(x)

diff 和 int 命令也可以直接对字符串 f 进行运算:>> f='cos(x)';

例4-20中求符号矩阵的积分。

>> syms t x >> g=[2*x t^2;t*sin(x) exp(x)] % 创建符号矩阵 g = [ 2*x, t^2] [ t*sin(x), exp(x)] >> int(g) % 对x求不定积分 ans = [ x^2, t^2*x] [ -t*cos(x), exp(x)] >> int(g,'t') % 对t求不定积分 ans = [ 2*x*t, 1/3*t^3] [ 1/2*t^2*sin(x), exp(x)*t]

第49页:4.4.4 符号级数与symsum函数

>> int(g,sym('a'),sym('b')) % 对x求定积分 ans = [ b^2-a^2, t^2*(b-a)] [ -t*cos(b)+t*cos(a), exp(b)-exp(a)]

4.4.4 符号级数 1.symsum函数 语法:symsum(s,x,a,b) 计算表达式s的级数和。x为自变量,x省略则默认为对自由变量求和;s为符号表达式;[a,b]为参数x的取值范围。

例4-21:求级数和 1+x+x2+…+xk+… 的和。

>> syms x k >> s1=symsum(1/k^2,1,10) % 计算级数的前10项和 s1 = 1968329/1270080

第50页:symsum与taylor级数展开

>> s2=symsum(1/k^2,1,inf) % 计算级数和 s2 = 1/6*pi^2 >> s3=symsum(x^k,'k',0,inf) % 计算对k为自变量的级数和 s3 = -1/(x-1)

2.taylor函数 语法:taylor(F,x,n) 求泰勒级数展开。x为自变量,F为符号表达式;对F进行泰勒级数展开至n项,参数n省略则默认展开前5项。例4-21中求 ex 的泰勒展开式。

>> syms x >> s1=taylor(exp(x),8) % 展开前8项 s1 = 1+x+1/2*x^2+1/6*x^3+1/24*x^4+1/120*x^5+1/720*x^6+1/5040*x^7

第51页:taylor默认展开前5项

>> s2=taylor(exp(x)) % 默认展开前5项 s2 = 1+x+1/2*x^2+1/6*x^3+1/24*x^4+1/120*x^5

第52页:4.5.1 傅里叶变换及其反变换

4.5 符号积分变换:Fourier变换和反变换可以利用积分函数 int 来实现,也可以直接使用 fourier 或 ifourier 函数实现。

1.fourier变换
语法 F=fourier(f,t,w) 求时域函数f(t)的fourier变换F;返回结果F是符号变量w的函数,当参数w省略,默认返回结果为w的函数;f为t的函数,当参数t省略,默认自由变量为x。
2.fourier反变换
语法 f=ifourier(F) 求频域函数F的fourier反变换f(t);f=ifourier(F,w,t),ifourier函数的用法与fourier函数相同。

第53页:例4-22 Fourier变换与反变换

例4-22:计算 f(t)=1/t 的 fourier 变换F以及F的fourier反变换。

>> syms t w >> F=fourier(1/t,t,w) % fourier变换 F = i*pi*(Heaviside(-w)-Heaviside(w)) >> f=ifourier(F,t) % fourier反变换 f = 1/t >> f=ifourier(F) % fourier反变换默认x为自变量 f = 1/x

例4-22中单位阶跃函数的fourier变换。

>> fourier(sym('Heaviside(t)')) ans = pi*Dirac(w)-i/w

程序分析:Dirac函数为单位脉冲函数,Heaviside(t) 是单位阶跃函数。

第54页:4.5.2 拉普拉斯变换及其反变换

4.5.2 拉普拉斯(Laplace)变换及其反变换 1.Laplace变换 语法:F=laplace(f,t,s) 求时域函数f的Laplace变换F;返回结果F为s的函数,当参数s省略,返回结果F默认为‘s’的函数;f为t的函数,当参数t省略,默认自由变量为‘t’。

例4-23:求 sin(at) 和阶跃函数的Laplace变换。

>> syms a t s >> F1=laplace(sin(a*t),t,s) % 求sin(at)的Laplace变换 F1 = a/(s^2+a^2) >> F2=laplace(sym('Heaviside(t)')) % 求阶跃函数的Laplace变换 F2 = 1/s

2.Laplace反变换 语法:f=ilaplace(F,s,t) 求F的Laplace反变换f。

第55页:4.5.3 Z变换及其反变换

例4-23中求 1/(s+a) 和 1 的Laplace反变换。

>> syms s a t >> f1=ilaplace(1/(s+a),s,t) % 求1/(s+a)的Laplace反变换 f1 = exp(-a*t) >> f2=ilaplace(1,s,t) % 求1的Laplace反变换是脉冲函数 f2 = Dirac(t)

4.5.3 Z变换及其反变换 1.ztrans函数 语法:F=ztrans(f,n,z) 求时域序列f的Z变换F;返回结果F是以符号变量z为自变量,当参数n省略默认自变量为‘n’,当参数z省略返回结果默认为‘z’的函数。

第56页:例4-24 求Z变换

例4-24:求阶跃函数、脉冲函数和 e-at 的Z变换。

>> syms a n z t >> Fz1=ztrans(sym('Heaviside(t)'),n,z) % 求阶跃函数的Z变换 Fz1 = Heaviside(t)*z/(z-1) >> Fz2=ztrans(sym('Dirac(t)'),n,z) % 求脉冲函数的Z变换 Fz2 = Dirac(t)*z/(z-1) >> Fz3=ztrans(exp(-a*t),n,z) % 求e^-at的Z变换 Fz3 = exp(-a*t)*z/(z-1)

2.iztrans函数 语法:f=iztrans(F,z,n) 求F的z反变换f。例4-24中用Z反变换验算阶跃函数、脉冲函数和 e-at 的Z变换。

>> syms n z t

第57页:例4-24(续)Z反变换验算

>> f1=iztrans(Fz1,z,n) f1 = Heaviside(t) >> f2=iztrans(Fz2,z,n) f2 = Dirac(t) >> f3=iztrans(Fz3,z,n) f3 = exp(-a*t)

第58页:4.6.1 代数方程的求解

4.6 符号方程的求解:当方程不存在解析解又无其他自由参数时,MATLAB可以用 solve 命令给出方程的数值解。

  • solve('eq','v') 求方程关于指定变量的解
  • solve('eq1','eq2','v1','v2',…) 求方程组关于指定变量的解

说明:eq可以是含等号的符号表达式的方程,也可以是不含等号的符号表达式,但所指的仍是令 eq=0 的方程;当参数v省略时,默认为方程中的自由变量;其输出结果为结构数组类型。

例4-25:求方程 ax2+bx+c=0 和 sinx=0 的解。

>> f1=sym('a*x^2+b*x+c') % 无等号 f1 = a*x^2+b*x+c >> solve(f1) % 求方程的解 x ans =

第59页:例4-25、例4-26 方程与方程组求解

ans = [ 1/2/a*(-b+(b^2-4*a*c)^(1/2))] [ 1/2/a*(-b-(b^2-4*a*c)^(1/2))] >> f2=sym('sin(x)') f2 = sin(x) >> solve(f2,'x') ans = 0

程序分析:当 sinx=0 有多个解时,只能得出0附近的有限几个解。

例4-26:求三元非线性方程组的解。

>> eq1=sym('x^2+2*x+1'); >> eq2=sym('x+3*z=4'); >> eq3=sym('y*z=-1'); >> [x,y,z]=solve(eq1,eq2,eq3) % 解方程组并赋值给x,y,z x = -1

第60页:4.6.2 符号常微分方程

y = -3/5 z = 5/3

程序分析:输出结果为「结构对象」,如果最后一句为「S=solve(eq1,eq2,eq3)」,则结果为:S = x: [1x1 sym] y: [1x1 sym] z: [1x1 sym]。

4.6.2 符号常微分方程:MATLAB提供了 dsolve 命令可以用于对符号常微分方程进行求解。

  • dsolve('eq','con','v') 求解微分方程
  • dsolve('eq1,eq2…','con1,con2…','v1,v2…') 求解微分方程组

第61页:例4-27 求微分方程的通解与特解

说明:‘eq’为微分方程;‘con’是微分初始条件,可省略;‘v’为指定自由变量,省略时则默认为x或t为自由变量;输出结果为结构数组类型。

  1. 当y是因变量时,微分方程‘eq’的表述规定为:y的一阶导数表示为 Dy;y的n阶导数表示为 Dny
  2. 微分初始条件‘con’应写成‘y(a)=b,Dy(c)=d’的格式;当初始条件少于微分方程数时,在所得解中将出现任意常数符 C1、C2……,解中任意常数符的数目等于所缺少的初始条件数

例4-27:求微分方程的解。

>> y=dsolve('x*D2y-3*Dy=x^2','x') % 求微分方程的通解 y = -1/3*x^3+C1+C2*x^4 >> y=dsolve('x*D2y-3*Dy=x^2','y(1)=0,y(5)=0','x') % 求微分方程的特解 y =

第62页:例4-28 求微分方程组的解

例4-28:求微分方程组的解。

>> [x,y]=dsolve('Dx=y,Dy=-x') x = cos(t)*C1+sin(t)*C2 y = -sin(t)*C1+cos(t)*C2

程序分析:默认的自由变量是t,C1、C2为任意常数,程序也可指定自由变量,结果相同:[x,y]=dsolve('Dx=y,Dy=-x','t')。

第63页:4.7.1 符号函数的绘图命令

4.7 符号函数的可视化 1.ezplot和ezplot3命令:ezplot命令是绘制符号表达式的自变量和对应各函数值的二维曲线,ezplot3命令用于绘制三维曲线。

语法:ezplot(F,[xmin,xmax],fig) 画符号表达式的图形。F是将要画的符号函数;[xmin,xmax]是绘图的自变量范围,省略时默认值为[-2π,2π];fig是指定的图形窗口,省略时默认为当前图形窗口。

例4-29:画出上一小节例4.27中 y(x) 特解的图形,先将y的表达式写出,然后用 ezplot 得到其图形,如图4.2所示。

>> y =sym('-1/3*x^3+1/3*x^4') y = -1/3*x^3+1/3*x^4

第64页:例4-29、例4-30 符号函数绘图

(a)y(x)在[-2π,2π]的图形 (b)y(x)在[0,100]的图形 图4.2 符号计算画图

>> ezplot(y) >> ezplot(y,[0,100]) % 绘制符号函数y在[0,100]中的图形

例4-30:用 ezplot3 绘制三维符号表达式曲线,如图4.3所示。

>> x=sym('sin(t)'); z=sym('t'); >> y=sym('cos(t)'); >> ezplot3(x,y,z,[0,10*pi],'animate') % 绘制t在[0,10*pi]范围的三维曲线

第65页:表4-3 符号表达式和字符串的绘图命令

2.其它绘图命令:MATLAB提供的较常用绘图命令还有如表4-3所示。

符号表达式和字符串的绘图命令
命令名举例含义
ezcontourezcontour('x*sin(t)',[-4,4])画等高线
ezcontourfezcontourf('x*sin(t)',[-4,4])画带填充颜色等高线
ezmeshezmesh('sin(x)*exp(-t)','cos(x)*exp(-t)','x',[0,2*pi])画三维网线图
ezmeshcezmeshc('sin(x)*t',[-pi,pi])画带等高线的三维网线图
ezpolarezpolar('sin(t)',[0,pi/2])画极坐标图
ezsurfezsurf('x*sin(t)','x*cos(t)','t',[0,10*pi])画三维曲面图
ezsurfcezsurfc('x*sin(t)','x*cos(t)','t',[0,pi,0,2*pi])画带等高线的三维曲面图

第66页:4.7.2 图形化的符号函数计算器

4.7.2 图形化的符号函数计算器:图4.3 符号表达式绘制三维曲线。

Symbolic Math Toolbox还提供了另一种符号计算方式即图形化的符号函数计算器,由 funtool.m 文件生成。funtool 是一个计算和显示一元函数图形的可视化函数计算器。例如,点击某一个按钮,funtool 可以绘制一个表示两个函数和、差或比例的图形。在MATLAB命令窗口输入命令「funtool」,就会出现该图形化函数计算器,如图4.4所示。

第67页:图4.4 图形化符号计算界面

(a)Figure No. 1窗口 (b)Figure No. 3窗口 图4.4 图形化符号计算

在图形化函数计算器中可以方便地查看函数的计算结果和显示的曲线。

第68页:4.8.1 访问Maple函数

4.8 Maple函数的使用:MATLAB的符号运算实际上是由Maple软件所支持的符号数学工具箱完成的,Maple软件有2000多条符号运算命令。

4.8.1 访问Maple函数 1.maple函数:maple函数用于进行符号运算,并将计算结果返回到MATLAB的工作空间。

  • maple(MapleStatement) 运行Maple格式的语句
  • maple(fun,arg1,arg2…) 运行以arg1、arg2…为参数的Maple的fun函数

例4-31:利用Maple的 discrim 函数,计算多项式的判别式。

第69页:例4-31 与 mfun函数

>> maple('discrim(a*x^2+b*x+c,x)') ans = -4*a*c+b^2

也可以用以下语句实现:

>> syms a b c x >> maple('discrim',a*x^2+b*x+c,'x') ans = -4*a*c+b^2

程序分析:MapleStatement必须符合Maple语法规则,因此一般应先用 mhelp 命令获得maple函数的命令格式。

2.mfun函数:mfun函数用于对Maple中的经典函数进行数值运算。语法 mfun('fun',p1,p2,…);‘fun’为函数名,p1、p2…为函数的参数。例4-32:利用 gcd 函数计算最大公约数。

>> mfun('gcd',20,30) ans = 10

第70页:4.8.2 获得Maple的帮助

4.8.2 获得Maple的帮助 1.mfunlist命令:用来列出能被「mfun」命令计算的经典特殊Maple函数。

2.mhelp命令:用来寻求关于Maple库函数及其调用方法的帮助。

  • 使用「mhelp index」可以查看Maple的索引目录
  • 使用「mhelp index [分类名]」可以进一步深入查看Maple的某个具体类别
Maple的函数类别
类别名描述
expression表达式命令集
function函数命令集

例4-32中查看求最大公约数的函数 gcd:>> mhelp gcd

第71页:本章小结

本章小结

  • 首先介绍了符号表达式的基础知识
  • 而后重点介绍了:符号极限的计算;符号微分的计算;符号积分的计算;符号级数的计算;常见积分变换的计算;符号方程的求解;符号函数的可视化;Maple函数的使用
  • 通过常用符号表达式的计算,初步掌握符号数学工具箱(Symbolic Math Toolbox),了解MATLAB中强大的符号计算功能

第72页:谢谢

谢谢!——第4章 MATLAB符号计算 内容到此结束。

顶部目录