第 3 章 符号计算

40
MATLAB @SDU 1 第 3 第 第第第第 —— matlab 第第第第第第第第第第第第第第第 matlab 第第第第第第第第第第 第第第 Symbolic Math Toolbox

description

第 3 章 符号计算. —— matlab 不仅具有数值运算功能,还开发了在 matlab 环境下实现符号计算的工具包 Symbolic Math Toolbox. 一、符号运算的基本操作. 什么是符号运算 与数值运算的区别 ※ 数值运算中必须先对变量赋值 ,然后才能参与运算。 ※ 符号运算无须事先对独立变量赋值 ,运算结果以标准的符号形式表达。. 特点:  运算对象可以是没赋值的符号变量  可以获得任意精度的解 Symbolic Math Toolbox—— 符号运算工具包通过调用 Maple 软件实现符号计算的。 - PowerPoint PPT Presentation

Transcript of 第 3 章 符号计算

Page 1: 第 3 章 符号计算

MATLAB @SDU 1

第 3 章 符号计算—— matlab 不仅具有数值运算功能,还开发了在 matlab环境下实现符号计算的工具包

Symbolic Math Toolbox

Page 2: 第 3 章 符号计算

MATLAB @SDU 2

一、符号运算的基本操作一、符号运算的基本操作1. 什么是符号运算• 与数值运算的区别 ※ 数值运算中必须先对变量赋值,然后才能参与运算。  ※ 符号运算无须事先对独立变量赋值,运算结果以标准的符号形式表达。

Page 3: 第 3 章 符号计算

MATLAB @SDU 3

• 特点: 运算对象可以是没赋值的符号变量 可以获得任意精度的解• Symbolic Math Toolbox—— 符号运算工具包通过调用 Maple 软件实现符号计算的。• maple 软件——主要功能是符号运算,它占据符号软件的主导地位。 

 

Page 4: 第 3 章 符号计算

MATLAB @SDU 4

本章提纲本章提纲

• 数据类型和符号对象• 符号对象基本操作• 微积分以及 MAPLE 函数的访问

Page 5: 第 3 章 符号计算

MATLAB @SDU 5

数据类型数据类型

复习:第 2 章提到字符 (character) 字符串 (string)与字符矩阵 String 表示方法: ‘ ’ 1 字符占 2 字节 字符矩阵 各行字符数相同 - char 用法 字符串的寻址

数组类型 基本组分 组分内涵 基本组分占用字节数数值数组 元素 双精度实数标量或双精度复数标量 8

16

字符串数组 元素 字符 2

元胞数组 元胞 可以存放任何类型、任何大小的数据。 不定结构数组 结构 只有挂接在结构上的“域”才能存放数据。数据可以是任何类型、任何大小。 不定

Page 6: 第 3 章 符号计算

MATLAB @SDU 6

串的基本属性、标识和简单操作 串的基本属性、标识和简单操作 • 例:• a='This is an example.' • size(a) • a14=a(1:4) • ra=a(end:-1:1)

Page 7: 第 3 章 符号计算

MATLAB @SDU 7

复杂串数组的创建复杂串数组的创建• 多行串数组的直接创建:要求必须每行的字符个数必须相等,如果不等要用空白字符补齐 S=['This string array ' 'has multiple rows.'] • 用串操作函数创建多行串数组• 用专门函数 char , str2mat , strvcat 创建多行串数组示例 [help]• 转换函数产生数码字符串最常用的数组 / 字符

串转换函数 int2str , num2str , mat2str

Page 8: 第 3 章 符号计算

MATLAB @SDU 8

例题:例题:• 在 MATLAB 计算生成的图形上标出图名和最大值点坐标。 T=[0,10],

y=exp(-a*t).*sin(w*t); a=2,w=3

» a=2;» w=3;» t=0:0.01:10;» y=exp(-a*t).*sin(w*t);» [y_max,i_max]=max(y);» t_text=[‘t=’,num2str(t(i_max))]; % 定义 t 字符串» y_text=[‘y=’,num2str(y_max)]; % 定义 y 字符串» max_text=char(‘maximum’,t_text,y_text); % 定义标识多行串数组» tit=[‘y=exp(-’,num2str(a),‘t)*sin(’,num2str(w),‘t)’]; % 定义标题字符串» plot(t,y,'b') » hold on» plot(t(i_max),y_max,'r.','MarkerSize',20)» text(t(i_max)+0.3,y_max+0.05,max_text)» title(tit),xlabel('t'),ylabel('y')

Page 9: 第 3 章 符号计算

MATLAB @SDU 9

串操作函数串操作函数• Cellstr: 字符数组转换成元胞数组• 字符串的比较 : strcmp• strncmp• 字符串分类逻辑判断: isletter • isspace• 字符串查找替换: findstr• strrep• 字符串 , 数值 , 数组转换: int2str , num2str ,

mat2str , eval

Page 10: 第 3 章 符号计算

MATLAB @SDU 10

元胞数组元胞数组1. 元胞数组的创建和显示 单元索引 内容索引 { } 设定所有元素内容 cell 命令创建空元胞数组 cell(n),cell(m,n)

cellplot 图形形象化地表示元胞数组的内容 celldisp 显示元胞数组各元素实际内容 {:}

Page 11: 第 3 章 符号计算

MATLAB @SDU 11

举例举例» C_str=char(‘here I am');» R=reshape(1:9,3,3);» Cn=[1+2i]; » ( 1 )直接创建法之一» A(1,1)={C_str};A(1,2)={R};A(2,1)={Cn};A(2,2)={{‘tom’,’jerry’}};» A

» ( 2 )直接创建法之二» B{1,1}=C_str;B{1,2}=R;B{2,1}=Cn;B{2,2}={‘tom’,’jerry’};» celldisp(B)

Page 12: 第 3 章 符号计算

MATLAB @SDU 12

• 2 元胞数组的内容调用 { } 例子:注意区分 A{1,2} 和 A(1,2)的不同

Page 13: 第 3 章 符号计算

MATLAB @SDU 13

元胞数组元胞数组3. 元胞数组的扩充、收缩和重组• 举例:» C=cell(2); » C(:,1)={char('Another','text string');10:-1:1} » AC=[A C] » A_C=[A;C] » A_C(3,:)=[ ]» R_A_C=reshape(A_C,2,3)

4. 元胞数组转换函数 num2cell, mat2cell,cell2mat---

Page 14: 第 3 章 符号计算

MATLAB @SDU 14

结构数组结构数组结构数组 包含数个字段 , 每个字段都可包含各个不同类型的数据 .结构数组的创建和显示• 1. 直接创建法及显示» green_house.name=‘No.1 room';» green_house.volume='2000m2';» green_house.parameter.temperature=[31.2 30.4 31.6 28.7

29.7 31.1 30.9 29.6];» green_house.parameter.humidity=[62.1 59.5 57.7 61.5 62.0 61.9 59.2 57.5];显示结构和内容 » green_house» green_house.parameter» green_house.parameter.temerature

» green_house(2,3).name=‘No.6 room';

Page 15: 第 3 章 符号计算

MATLAB @SDU 15

结构数组结构数组2. 利用结构函数创建结构数组• Struct 例子:• ( 1 )• a=cell(2,3);• green_house_1=struct('name',a,'volume',a,'parameter',a(1,2)) • ( 2 )• green_house_2=struct('name',a,'volume',[],'parameter',[]) • ( 3 )• green_hopuse_3(2,3)=struct('name',[],'volume',[],'parameter',[])• ( 4 )• a1={‘No.6 room'};a2={'3200m2'};• green_house_4(2,3)=struct('name',a1,'volume',a2,'parameter',[]);• T6=[31.2,30.4,31.6,28.7;29.7,31.1,30.9,29.6];• green_house_4(2,3).parameter.temperature=T6;

Page 16: 第 3 章 符号计算

MATLAB @SDU 16

1. 结构数组和元胞数组之间的转换 指令 struct2cell 和 cell2struct 的使用。2. 更改个别字段数据,直接调用付给新值 也可以用 getfield, setfield 来取得和改变结构数组中某个字段的数据3. Rmfield 删除结构数组的字段 结构数组的字段增加:直接增加

Page 17: 第 3 章 符号计算

MATLAB @SDU 18

符号运算的功能符号运算的功能• 符号表达式、符号矩阵的创建• 符号线性代数• 因式分解、展开和简化• 符号代数方程求解• 符号微积分• 符号微分方程

Page 18: 第 3 章 符号计算

MATLAB @SDU 19

符号对象和符号表达式符号对象和符号表达式 • 在 MATLAB 中,数值和数值变量用于数值的存储和各种数值计算,而符号常数、符号变量、符号函数、符号操作等则是用来形成符号表达式,严格按照代数、微积分等课程中的规则、公式进行运算,并尽可能给出解析表达式结果。

Page 19: 第 3 章 符号计算

MATLAB @SDU 20

符号对象的生成和使用符号对象的生成和使用• 凡进行过数值计算的人都知道:数值表达式所用的变量必须事先被赋过值,否则该表达式无法计算。• Symbolic Math Toolbox 2.1 版沿用数值计算的这种模式,规定:在进行符号计算时,首先要定义基本的符号对象(可以是常数、变量、表达式),然后利用这些基本符号对象去构成新的表达式,进而从事所需的符号运算。• 在运算中,凡是由包含符号对象的表达式所生成的衍生对象也都是符号对象。• 定义基本符号对象的指令

Page 20: 第 3 章 符号计算

MATLAB @SDU 21

定义基本符号对象的指令定义基本符号对象的指令• 定义基本符号对象的指令有两个: sym

syms• 它们的常用使用格式如下:f=sym(arg) 把数字、字符串或表达式 arg 转换为符号对象 ff=sym(argn,flagn)把数值或数值表达式 argn 转换为 flagn 格式的符号对象argv=sym(‘argv’,flagv)

按 flagv 指定的要求把字符串‘ argv’ 定义为符号对象 argvsyms(‘argv1’,’argv2’,’argvk’)把字符 argv1,argv2,argvk 定义为基本符号对象syms argv1 argv2 argvk 上述格式的简洁形式

Page 21: 第 3 章 符号计算

MATLAB @SDU 22

例例 • 例 1 :符号常数形成中的差异 a1=[1/3,pi/7,sqrt(5),pi+sqrt(5)]a2=sym([1/3,pi/7,sqrt(5),pi+sqrt(5)])a3=sym('[1/3,pi/7,sqrt(5),pi+sqrt(5)]')

根。的行列式值、逆和特征:求矩阵例

22211211aaaa

A3

例 2 :把字符表达式转换为符号变量y=sym('2*sin(x)*cos(x)')y=simple(y)

Page 22: 第 3 章 符号计算

MATLAB @SDU 23

符号计算中的算符和基本函数符号计算中的算符和基本函数 • 基本运算符

– 算符“ +” 、“ -” 、“ * ” 、“ \ ” 、“ / ” 、“ ^ ” 分别实现矩阵的加、减、乘、左除、右除、求幂运算。– 算符 “ .* ” 、“ .\ ” 、“ ./ ” 、“ .^ ” 分别实现“元素对元素”的数组乘、左除、右除、求幂运算。– 算符“ ’ ”、“ .’ ” 分别实现矩阵的共轭转置、非共轭转置。

• 关系运算符– 算符“ == ” 、“ ~= ” 分别对算符两边的对象进行“相等”、“不等”的比较。当事实为“真”时,比较结果

用 1 表示;当事实为“假”时,比较结果则用 0 表示。

Page 23: 第 3 章 符号计算

MATLAB @SDU 24

• 三角函数、双曲函数及它们的反函数– 除 atan2 仅能用于数值计算外,其余的三角函数(如 sin )、双曲函数(如 cosh )及它们的反函数(如 asin,acosh ),无论在数值计算还是符号计算中,它们的使用方法相同。

• 指数、对数函数– 在数值、符号计算中,函数 sqrt 、 exp 、 expm 的使用方法完全相同。至于对数函数,符号计算中只有自然对数 log (在一般教科书中用 ln ),而没有数值计算中的 log2,log10 。

• 复数函数– 涉及复数的共轭 conj 、求实部 real 、求虚部 imag 和求模 abs函数,在符号、数值计算中的使用方法相同。但注意,在符号计算中, MATLAB没有提供求相角的指令。

• 矩阵代数指令– 在符号计算中, MATLAB提供的常用矩阵代数指令有 diag,

triu,tril,inv,det,rank,rref,null,colspace,poly,expm,eig,svd 。它们的用法几乎与数值计算中的情况完全一样,只有 svd稍微不同。

Page 24: 第 3 章 符号计算

MATLAB @SDU 25

识别对象类别的指令识别对象类别的指令 • 数值计算对象、符号计算对象、字符串是

MATLAB 中最常遇到的数据对象。它们遵循着各自不同的运算法则,但有时在外形上却十分相似。为管理和使用方便, MATLAB提供了一些识别不同数据对象的指令,常用的有 class,isa,whos等。

Page 25: 第 3 章 符号计算

MATLAB @SDU 26

符号表达式中默认符号变量符号表达式中默认符号变量(自由变量)的确定(自由变量)的确定 • 为符号操作和计算的需要, MATLAB提供一个

findsym 指令,可实现对表达式中所有自由符号变量或指定数目的独立自变量的自动认定。findsym(EXPR) 确认表达式 EXPR 中所有“自由”符号“变量”findsym(EXPR,N) 从表达式 EXPR 中确认出靠 x 最近的 N 个独立自变量。• 注:

– EXPR 可以是符号矩阵。此时,该指令对自由变量的确认是对整个矩阵进行的,而不是对矩阵元素逐个进行的。– 按照自然科学中的习惯, findsym(EXPR,N) 把 EXPR 表达式中 N 个最靠近 x 的自由符号变量确认为“独立自由变量”。注意字母的大小写。在此认为大写字母离小写 x 的距离总大于所有小写字母离 x 的距离。

Page 26: 第 3 章 符号计算

MATLAB @SDU 27

二、符号对象的操作和转换二、符号对象的操作和转换 • (一)符号表达式的操作

– 符号运算中有许多操作指令,如 collect (合并同类项)、 expand (对指定项展开)、 factor (进行因式或因子分解)、 horner (转换成嵌套形式)、 numden (提取公因式)、 simplify (恒等式简化)、 pretty(习惯方式显示)等,其中最常用的是simplyfy

。例:简化 323 81261

xxx

f

Page 27: 第 3 章 符号计算

MATLAB @SDU 28

置换操作置换操作 • 子表达式置换操作

– 符号计算结果显得烦冗的一个重要原因是:有些子表达式会多次出现在不同地方。– 为了使表达式简洁易读, MATLAB提供了如下指令:[RS,ssub]=subexpr(S,ssub)

运用符号变量 ssub 置换子表达式,重写 S 为 RS 。例:把复杂表达式中所含的多个相同子表达式用一个符号代替,使表达简洁。• 通用置换指令

RES=subs(ES,old,new) 用 new 置换 ES 中的 old 后产生 RESRES=subs(ES, new) 用 new 置换 ES 中的自由变量后产生 RES

Page 28: 第 3 章 符号计算

MATLAB @SDU 30

符号对象的转换• sym 函数的反操作: Numeric 把一个符号常数变换为一个数值 Eval 把符号函数变换为数字会计算表达式Sym2poly 将符号多项式变成多项式等价系数向量Poly2sym 反操作

Page 29: 第 3 章 符号计算

MATLAB @SDU 31

符号微积分符号微积分 •与数值计算相比,一般说来,符号计算需要消耗更多的计算机资源,但这并不意味着符号计算可有可无。在某些场合,符号计算处理问题反比数值计算更为简明快捷。• 符号极限 • 符号微分• 符号积分• 符号序列的求和• Taylor级数展开

Page 30: 第 3 章 符号计算

MATLAB @SDU 32

符号极限符号极限• 极限是微积分的基础。在 MATLAB 中,极限的求解由

limit 函数实现。• limit(F,x,a) 计算符号表达式 F 在 x→a条件下的极限• limit(F, a)

计算符号表达式 F 中默认自变量趋向于 a条件下的极限• limit(F)

计算符号表达式 F 在默认自变量趋向于 0 时的极限• limit(F,x,a,’right’) 和 limit(F,x,a,’left’)

计算符号表达式 F 在 x→a条件下的右极限和左极限

Page 31: 第 3 章 符号计算

MATLAB @SDU 33

符号微分符号微分• 求导数、高阶导数、偏导数是数学分析的重要内容。由机器实现求导的 MATLAB 指令如下:dfdvn=diff(f,v,n)求 。• 注:

– f 是矩阵时,求导对元素逐个进行,但自变量定义在整个矩阵上。– v确省时,自变量会自动由 findsym确认; n缺省时,默认 n=1 。– 注意:在数值计算中,指令 diff 是用来求差分的。

n

n

dvvfd )(

Page 32: 第 3 章 符号计算

MATLAB @SDU 34

符号积分符号积分 • 积分有不定积分、定积分、旁义积分和重积分等。一般说来,积分比微分更难求取。 MATLAB 的 int 指令能够接通MAPLE ,并进行十分有效的机器求积。• 与数值积分相比,符号积分指令简单,适应性强,但可能占用机器时间很长。• 有时符号积分也可能给出相当冗长而生疏的“闭”符号表达式,有时可能给不出 “闭”解。凡 MATLAB求积不能给出“闭”解时, int 运行结束将给出警告提示和积分的原式。intf=int(f,v) 给出 f 对指定变量 v 的(不带积分常数的)不定积分Intf=int(f,v,a,b) 给出 f 对指定变量 v 的定积分

Page 33: 第 3 章 符号计算

MATLAB @SDU 35

符号序列的求和符号序列的求和• 对于数学上的通式求和 问题,可用 MATLAB的求和指令解决。s=symsum(f,v,a,b)

求通式 f 在指定变量 v取遍 [a,b] 中所有整数时的和• 注:

– f 是矩阵时,求和对元素逐个进行,但自变量定义在整个矩阵上。– v确省时, f 中的自变量由 findsym自动辨识; b 可以取有限整数,也可以取无穷大。– a,b 可同时缺省,此时默认求和的自变量区间为 [0,v-1] 。

b

av

vf )(

Page 34: 第 3 章 符号计算

MATLAB @SDU 36

TaylorTaylor 级数展开级数展开taylor(f)

计算符号表达式 f 在默认自变量等于 0处的 5 阶 Taylor级数展开式taylor(f,n,v)

计算符号表达式 f 在指定变量 v=0处的 n-1 阶 Taylor级数展开式taylor(f,n,v,a)

计算符号表达式 f 在指定变量 v=a处的 n-1 阶 Taylor级数展开式

Page 35: 第 3 章 符号计算

MATLAB @SDU 37

积分变换积分变换常见的积分变换有傅立叶变换、拉普拉斯变换和 Z变换。1.傅立叶 (Fourier) 变换在 MATLAB 中,进行傅立叶变换的函数是:fourier(f,x,t) :求函数 f(x) 的傅立叶像函数 F(t) 。ifourier(F,t,x) :求傅立叶像函数 F(t) 的原函数 f(x) 。例 P103 求函数 y=cosx*exp(x^2) 的傅立叶变换及其逆变换。

Page 36: 第 3 章 符号计算

MATLAB @SDU 38

2.拉普拉斯 (Laplace) 变换在 MATLAB 中,进行拉普拉斯变换的函数是:laplace(fx,x,t) :求函数 f(x) 的拉普拉斯像函数 F(t) 。ilaplace(Fw,t,x) :求拉普拉斯像函数 F(t) 的原函数 f(x) 。例 计算 y=x3 的拉普拉斯变换及其逆变换。

Page 37: 第 3 章 符号计算

MATLAB @SDU 39

3. Z 变换当函数 f(x)呈现为一个离散的数列 f(n) 时,对数列 f(n) 进行 z 变换的 MATLAB 函数是:ztrans(fn,n,z) :求 fn 的 Z 变换像函数 F(z) 。iztrans(Fz,z,n) :求 Fz 的 z 变换原函数 f(n) 。例 求数列 fn=e-2n 的 Z 变换及其逆变换。

Page 38: 第 3 章 符号计算

MATLAB @SDU 40

符号代数方程的求解符号代数方程的求解 • 线性方程组的符号解

– 矩阵计算是求解线性方程组最简便有效的方法。在 MATLAB 和Symbolic Toolbox 中,不管数据对象是数值还是符号,实现矩阵运算的指令形式几乎完全相同。因此,对于求解线性方程组符号解的问题,可套用求数值解的方法进行。

– 例:求线性方程组 d+n/2+p/2=q,n+d+q-p=10,q+d-n/4=p,q+p-n-8d=1 的解。【注意是按照变量字母顺序输出结果】

• 一般代数方程组的解– 一般代数方程包括线性 (Linear) 、非线性 (Nonlinear) 和超越方程 (Transcedental equation) 等,求解指令是 solve 。S=solve(‘eq1’,’eq2’,… ,’ eqn’,’v1’,’v2’,…,’vn’)求方程组关于指定变量的解(推荐格式)S=solve (eq1,eq2,… , eqn,v1,v2,…,vn) 求方程组关于指定变量的解(可用格式)

Page 39: 第 3 章 符号计算

MATLAB @SDU 41

符号微分方程的求解符号微分方程的求解• 求微分方程符号解的一般指令S=dsolve(‘a_1’,’a_2’,… ,’ a_n’)

求解常微分方程最完整、通用的指令调用格式• 微分方程符号解示例 1 、求微分方程 dx/dt=y,dy/dt=-x 的解。2 、求解两点边值问题: xy''-3y'=x^2,y(1)=0,y(5)=0 。(注意:相应的数值解法比较复杂)。

Page 40: 第 3 章 符号计算

MATLAB @SDU 42

小 结 本节介绍了 matlab 语言的符号运算功能,通过学习应该掌握:• 掌握如何创建、操作字符串元胞数组和结构数组• 掌握符号矩阵和代数运算• 掌握符号表达的操作转换和化简• 掌握代数方程微分方程的求解。