400 likes | 797 Views
第 3 章 符号计算. —— matlab 不仅具有数值运算功能,还开发了在 matlab 环境下实现符号计算的工具包 Symbolic Math Toolbox. 一、符号运算的基本操作. 什么是符号运算 与数值运算的区别 ※ 数值运算中必须先对变量赋值 ,然后才能参与运算。 ※ 符号运算无须事先对独立变量赋值 ,运算结果以标准的符号形式表达。 . 特点: 运算对象可以是没赋值的符号变量 可以获得任意精度的解 Symbolic Math Toolbox—— 符号运算工具包通过调用 Maple 软件实现符号计算的。
E N D
第3章 符号计算 —— matlab 不仅具有数值运算功能,还开发了在matlab环境下实现符号计算的工具包Symbolic Math Toolbox MATLAB @SDU
一、符号运算的基本操作 • 什么是符号运算 • 与数值运算的区别 ※ 数值运算中必须先对变量赋值,然后才能参与运算。 ※ 符号运算无须事先对独立变量赋值,运算结果以标准的符号形式表达。 MATLAB @SDU
特点: 运算对象可以是没赋值的符号变量 可以获得任意精度的解 • Symbolic Math Toolbox——符号运算工具包通过调用Maple软件实现符号计算的。 • maple软件——主要功能是符号运算,它占据符号软件的主导地位。 MATLAB @SDU
本章提纲 • 数据类型和符号对象 • 符号对象基本操作 • 微积分以及MAPLE函数的访问 MATLAB @SDU
数据类型 复习:第2章提到字符(character) 字符串(string) 与字符矩阵 String表示方法:‘ ’ 1字符占2字节 字符矩阵 各行字符数相同 - char用法 字符串的寻址 MATLAB @SDU
串的基本属性、标识和简单操作 • 例: • a='This is an example.' • size(a) • a14=a(1:4) • ra=a(end:-1:1) MATLAB @SDU
复杂串数组的创建 • 多行串数组的直接创建:要求必须每行的字符个数必须相等,如果不等要用空白字符补齐 S=['This string array ' 'has multiple rows.'] • 用串操作函数创建多行串数组 • 用专门函数char , str2mat , strvcat创建多行串数组示例[help] • 转换函数产生数码字符串最常用的数组/字符串转换函数int2str , num2str , mat2str MATLAB @SDU
例题: • 在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') MATLAB @SDU
串操作函数 • Cellstr: 字符数组转换成元胞数组 • 字符串的比较: strcmp • strncmp • 字符串分类逻辑判断:isletter • isspace • 字符串查找替换:findstr • strrep • 字符串,数值,数组转换: int2str , num2str , mat2str,eval MATLAB @SDU
元胞数组 • 元胞数组的创建和显示 单元索引 内容索引 { }设定所有元素内容 cell命令创建空元胞数组 cell(n),cell(m,n) cellplot 图形形象化地表示元胞数组的内容 celldisp 显示元胞数组各元素实际内容 {:} MATLAB @SDU
举例 • 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) MATLAB @SDU
2 元胞数组的内容调用{ } 例子:注意区分A{1,2}和A(1,2)的不同 MATLAB @SDU
元胞数组 • 元胞数组的扩充、收缩和重组 • 举例: • 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--- MATLAB @SDU
结构数组 结构数组 包含数个字段,每个字段都可包含各个不同类型的数据. 结构数组的创建和显示 • 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'; MATLAB @SDU
结构数组 • 利用结构函数创建结构数组 • 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; MATLAB @SDU
结构数组和元胞数组之间的转换 指令struct2cell和cell2struct的使用。 2. 更改个别字段数据,直接调用付给新值 也可以用getfield, setfield来取得和改变结构数组中某个字段的数据 3. Rmfield 删除结构数组的字段 结构数组的字段增加:直接增加 MATLAB @SDU
符号运算的功能 • 符号表达式、符号矩阵的创建 • 符号线性代数 • 因式分解、展开和简化 • 符号代数方程求解 • 符号微积分 • 符号微分方程 MATLAB @SDU
符号对象和符号表达式 • 在MATLAB中,数值和数值变量用于数值的存储和各种数值计算,而符号常数、符号变量、符号函数、符号操作等则是用来形成符号表达式,严格按照代数、微积分等课程中的规则、公式进行运算,并尽可能给出解析表达式结果。 MATLAB @SDU
符号对象的生成和使用 • 凡进行过数值计算的人都知道:数值表达式所用的变量必须事先被赋过值,否则该表达式无法计算。 • Symbolic Math Toolbox 2.1版沿用数值计算的这种模式,规定:在进行符号计算时,首先要定义基本的符号对象(可以是常数、变量、表达式),然后利用这些基本符号对象去构成新的表达式,进而从事所需的符号运算。 • 在运算中,凡是由包含符号对象的表达式所生成的衍生对象也都是符号对象。 • 定义基本符号对象的指令 MATLAB @SDU
定义基本符号对象的指令 • 定义基本符号对象的指令有两个:sym syms • 它们的常用使用格式如下: f=sym(arg) 把数字、字符串或表达式arg转换为符号对象f f=sym(argn,flagn) 把数值或数值表达式argn转换为flagn格式的符号对象 argv=sym(‘argv’,flagv) 按flagv指定的要求把字符串‘argv’定义为符号对象argv syms(‘argv1’,’argv2’,’argvk’) 把字符argv1,argv2,argvk定义为基本符号对象 syms argv1 argv2 argvk上述格式的简洁形式 MATLAB @SDU
例 • 例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)]') • 例2:把字符表达式转换为符号变量 y=sym('2*sin(x)*cos(x)') y=simple(y) MATLAB @SDU
符号计算中的算符和基本函数 • 基本运算符 • 算符“+”、“-”、“ * ”、“ \ ”、“ / ”、“ ^ ”分别实现矩阵的加、减、乘、左除、右除、求幂运算。 • 算符 “.* ”、“.\ ”、“./ ”、“.^ ”分别实现“元素对元素”的数组乘、左除、右除、求幂运算。 • 算符“ ’ ”、“ .’ ” 分别实现矩阵的共轭转置、非共轭转置。 • 关系运算符 • 算符“ == ”、“ ~= ” 分别对算符两边的对象进行“相等”、“不等”的比较。当事实为“真”时,比较结果用1表示;当事实为“假”时,比较结果则用0表示。 MATLAB @SDU
三角函数、双曲函数及它们的反函数 • 除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稍微不同。 MATLAB @SDU
识别对象类别的指令 • 数值计算对象、符号计算对象、字符串是MATLAB中最常遇到的数据对象。它们遵循着各自不同的运算法则,但有时在外形上却十分相似。为管理和使用方便,MATLAB提供了一些识别不同数据对象的指令,常用的有class,isa,whos等。 MATLAB @SDU
符号表达式中默认符号变量 (自由变量)的确定符号表达式中默认符号变量 (自由变量)的确定 • 为符号操作和计算的需要,MATLAB提供一个findsym指令,可实现对表达式中所有自由符号变量或指定数目的独立自变量的自动认定。 findsym(EXPR) 确认表达式EXPR中所有“自由”符号“变量” findsym(EXPR,N) 从表达式EXPR中确认出靠x最近的N个独立自变量。 • 注: • EXPR可以是符号矩阵。此时,该指令对自由变量的确认是对整个矩阵进行的,而不是对矩阵元素逐个进行的。 • 按照自然科学中的习惯,findsym(EXPR,N)把EXPR表达式中N个最靠近x的自由符号变量确认为“独立自由变量”。注意字母的大小写。在此认为大写字母离小写x的距离总大于所有小写字母离x的距离。 MATLAB @SDU
二、符号对象的操作和转换 • (一)符号表达式的操作 • 符号运算中有许多操作指令,如collect(合并同类项)、expand(对指定项展开)、factor(进行因式或因子分解)、horner(转换成嵌套形式)、numden(提取公因式)、simplify(恒等式简化)、pretty(习惯方式显示)等,其中最常用的是simplyfy MATLAB @SDU
置换操作 • 子表达式置换操作 • 符号计算结果显得烦冗的一个重要原因是:有些子表达式会多次出现在不同地方。 • 为了使表达式简洁易读,MATLAB提供了如下指令: [RS,ssub]=subexpr(S,ssub) 运用符号变量ssub置换子表达式,重写S为RS。 例:把复杂表达式中所含的多个相同子表达式用一个符号代替,使表达简洁。 • 通用置换指令 RES=subs(ES,old,new) 用new置换ES中的old后产生RES RES=subs(ES, new) 用new置换ES中的自由变量后产生RES MATLAB @SDU
符号对象的转换 • sym函数的反操作: Numeric把一个符号常数变换为一个数值 Eval把符号函数变换为数字会计算表达式 Sym2poly将符号多项式变成多项式等价系数向量 Poly2sym反操作 MATLAB @SDU
符号微积分 • 与数值计算相比,一般说来,符号计算需要消耗更多的计算机资源,但这并不意味着符号计算可有可无。在某些场合,符号计算处理问题反比数值计算更为简明快捷。 • 符号极限 • 符号微分 • 符号积分 • 符号序列的求和 • Taylor级数展开 MATLAB @SDU
符号极限 • 极限是微积分的基础。在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条件下的右极限和左极限 MATLAB @SDU
符号微分 • 求导数、高阶导数、偏导数是数学分析的重要内容。由机器实现求导的MATLAB指令如下: dfdvn=diff(f,v,n) 求 。 • 注: • f是矩阵时,求导对元素逐个进行,但自变量定义在整个矩阵上。 • v确省时,自变量会自动由findsym确认;n缺省时,默认n=1。 • 注意:在数值计算中,指令diff是用来求差分的。 MATLAB @SDU
符号积分 • 积分有不定积分、定积分、旁义积分和重积分等。一般说来,积分比微分更难求取。MATLAB的int指令能够接通MAPLE,并进行十分有效的机器求积。 • 与数值积分相比,符号积分指令简单,适应性强,但可能占用机器时间很长。 • 有时符号积分也可能给出相当冗长而生疏的“闭”符号表达式,有时可能给不出 “闭”解。凡MATLAB求积不能给出“闭”解时,int运行结束将给出警告提示和积分的原式。 intf=int(f,v)给出f对指定变量v的(不带积分常数的)不定积分 Intf=int(f,v,a,b) 给出f对指定变量v的定积分 MATLAB @SDU
符号序列的求和 • 对于数学上的通式求和 问题,可用MATLAB的求和指令解决。 s=symsum(f,v,a,b) 求通式f在指定变量v取遍[a,b]中所有整数时的和 • 注: • f是矩阵时,求和对元素逐个进行,但自变量定义在整个矩阵上。 • v确省时,f中的自变量由findsym自动辨识;b可以取有限整数,也可以取无穷大。 • a,b可同时缺省,此时默认求和的自变量区间为[0,v-1]。 MATLAB @SDU
Taylor级数展开 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级数展开式 MATLAB @SDU
积分变换 常见的积分变换有傅立叶变换、拉普拉斯变换和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)的傅立叶变换及其逆变换。 MATLAB @SDU
2.拉普拉斯(Laplace)变换 在MATLAB中,进行拉普拉斯变换的函数是: laplace(fx,x,t):求函数f(x)的拉普拉斯像函数F(t)。 ilaplace(Fw,t,x):求拉普拉斯像函数F(t)的原函数f(x)。 例计算y=x3的拉普拉斯变换及其逆变换。 MATLAB @SDU
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变换及其逆变换。 MATLAB @SDU
符号代数方程的求解 • 线性方程组的符号解 • 矩阵计算是求解线性方程组最简便有效的方法。在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) 求方程组关于指定变量的解(可用格式) MATLAB @SDU
符号微分方程的求解 • 求微分方程符号解的一般指令 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。(注意:相应的数值解法比较复杂)。 MATLAB @SDU
小 结 本节介绍了matlab语言的符号运算 功能,通过学习应该掌握: • 掌握如何创建、操作字符串元胞数组和结构数组 • 掌握符号矩阵和代数运算 • 掌握符号表达的操作转换和化简 • 掌握代数方程微分方程的求解。 MATLAB @SDU