360 likes | 1.14k Views
第 3 章 MATLAB 符号计算 Using Symbolic Math Toolbox. 3.1 符号表达式的建立 3.2 符号表达式的代数运算 3.3 符号表达式的操作和转换 3.4 符号极限、微积分和级数求和 3.5 符号积分变换 3.6 符号方程的求解. MATLAB 具有符号数学工具箱 (Symbolic Math Toolbox) 。 符号计算是可以对未赋值的符号对象 ( 可以是常数、变量、表达式 ) 进行运算和处理。 与数值运算的区别 : ※ 数值运算中必须先对变量赋值,然后才能参与运算。
E N D
第3章MATLAB符号计算Using Symbolic Math Toolbox • 3.1 符号表达式的建立 • 3.2符号表达式的代数运算 • 3.3符号表达式的操作和转换 • 3.4 符号极限、微积分和级数求和 • 3.5 符号积分变换 • 3.6符号方程的求解
MATLAB具有符号数学工具箱(Symbolic Math Toolbox) 。 • 符号计算是可以对未赋值的符号对象(可以是常数、变量、表达式)进行运算和处理。 • 与数值运算的区别: • ※数值运算中必须先对变量赋值,然后才能参与运算。 • ※ 符号运算无须事先对独立变量赋值,运算结果以标准的符号形式表达。
符号运算的功能 • 符号线性代数(linear algebra) • 因式分解、展开和简化(simplification and substitution) • 符号代数方程求解(solving equations) • 符号微积分(Calculus) • 符号微分方程
3.1 符号表达式的建立3.1.1 创建符号常量 • 符号常量是不含变量的符号表达式。 • sym(‘常量’) %创建符号常量 • sym(常量,参数) %按某种格式转换为符号常量 • 说明:参数可以选择为’d’、’f’、’e’或’r’ 四种格式,也可省略。 • EX: >>a=sym('sin(2)') • >> a=sym(sin(2),'r')
3.1.2 创建符号变量和表达式(Creating Symbolic Variables and Expression) • 1. 使用sym命令创建符号变量和表达式 • sym(‘变量’,参数) %把变量定义为符号对象 • 2.使用syms命令创建符号变量和符号表达式 • syms(‘arg1’, ‘arg2’, …,参数) • syms arg1 arg2 …,参数
例如: • >> f1=sym(‘a*x^2+b*x+c’) %创建表达式 • >> syms a b c x %创建变量 • >> f2=a*x^2+b*x+c %创建表达式 • >> syms('a','b','c','x') • >> f3=a*x^2+b*x+c 符号表达式()中的参数一定要用' ' 单引号括起来。
3.1.3 符号矩阵 • 例如,使用sym命令创建的符号矩阵: • >> A=sym('[a,b;c,d]') • 例如,使用syms命令创建相同的符号矩阵: • >> syms a b c d • >> A=[a b;c d] • 比较符号矩阵与字符串矩阵 : • >> B=‘[a,b;c,d]’ %创建字符串矩阵 • >> C=[a,b;c,d] %创建数值矩阵 • ??? Undefined function or variable 'a'.
3.2符号表达式的代数运算 3.2.1符号表达式的代数运算 • 由于MATLAB采用了重载技术,使得符号表达式的运算符和基本函数都与数值计算中的几乎完全相同 。 • 例如: • >> A+2 • >> A.’ • >> det(A) • >> A^2 例如: >> f=sym('2*x^2+3*x+4') >> g=sym('5*x+6') >> f+g >> f*g
1. 符号运算中的运算符 • 基本运算符 • 运算符“+”,“-”,“*”,“\”,“/”,“^”分别实现符号矩阵的加、减、乘、左除、右除、求幂运算。 • 运算符“.*”,“./”,“.\”,“.^”分别实现符号数组的乘、除、求幂,即数组间元素与元素的运算。 • 运算符“′”,“.′”分别实现符号矩阵的共轭转置、非共轭转置。 • (2)关系运算符 • 运算符“= =”、“~=”分别对运算符两边的符号对象进行“相等”、“不等”的比较。
2. 函数运算 • 三角函数和双曲函数 • (2) 指数和对数函数 • (3) 复数函数 • (4) 矩阵代数命令
3.2.2 符号数值任意精度控制和运算 • 在Symbolic Math Toolbox中有三种不同的算术运算: • 数值型:MATLAB的浮点运算。 • 有理数型:Maple的精确符号运算。 • VPA型:Maple的任意精度运算。 • 任意精度的VPA型运算可以使用digits和vpa命令来实现。 • digits(n) %设定默认的精度 • S=vpa(s,n) %将s表示为n位有效位数的符号对象
3.2.3 符号对象与数值对象的转换 将数值矩阵转化为符号矩阵 • 函数调用格式:sym(A) • EX:>> A=[1/3,2.5;1/0.7,2/5] • >> sym(A) • 将符号矩阵转化为数值矩阵 函数调用格式: numeric(A) • EX:>> a=sym('2/3') • >> b=numeric(a)
3.3符号表达式的操作和转换3.3.1符号表达式中自由变量的确定3.3符号表达式的操作和转换3.3.1符号表达式中自由变量的确定 符号表达式“f=ax2+bx+c”中只有一个变量是独立变量: • 小写字母i和j不能作为自由变量。 • 符号表达式中如果有多个符号变量,则按照以下顺序选择自由变量:首先选择x作为自由变量;如果没有x,则选择在字母顺序中最接近x的字符变量;如果与x相同距离,则在x后面的优先。 • 大写字母比所有的小写字母都靠后。 • 也可以用findsym函数来自动确定。 自由变量的确定原则(The Default Symbolic Variables)
3.3.2符号表达式的化简 (Simplificate) • 同一个多项式的符号表达式可以表示成三种形式: • 多项式形式的表达方式:f(x)=x3+6x2+11x-6 • 因式形式表达方式:f(x)=(x-1)(x-2)(x-3) • 嵌套形式的表达方式:f(x)=x(x(x-6)+11)-6 • pretty:给出排版形式的输出结果 。 • collect:将表达式写成多项式形式. 3 2 x - 6 x + 11 x - 6 x^3-6*x^2+11*x-6
horner:将多项式形式写成嵌套形式 • factor:将表达式写成因式形式 • expand:将表达式写成多项式形式 • simplify:对表达式进行化简 • 例如: k=sym('cos(x)^2-sin(x)^2') • simplify(k) • simple:寻求表达式的多种简化形式,使之包含最少数目的字符 -6+(11+(6+x)*x)*x (x-1)*(x-2)*(x-3) 2*cos(x)^2-1
3.3.3 符号表达式的替换(Substitutions) • subs函数:对符号表达式中符号变量的替换。 • subs(s)%用给定值替换符号表达式s中的所有变量 • subs(s,new)%用new替换符号表达式s中的自由变量 • subs(s,old,new) %用new替换符号表达式s中的old变量 • 例: • >> f=sym('x^3-6*x^2+11*x-6') • >> x=5 • >> subs(f) • >>subs(f,5) • >>subs(f,’x’,5) • 可以用来计算多项式的值,以及化简。
3.3.4 求反函数和复合函数 • 1. 求反函数 • 对于函数f(x),存在另一个函数g(.)使得g(f(x))=x成立,则函数g(.)称为函数f(x)的反函数。 • g=finverse(f,v) • %对指定自变量v的函数f(v)求反函数 • 2. 求复合函数 • 运用函数compose可以求符号函数f(x)和g(y)的复合函数。 • compose(f,g,z)%求f(x)和g(y)的复合函数f(g(z))
3.3.5 符号表达式的转换 • 1. 符号表达式与多项式的转换 • 构成多项式的符号表达式f(x)可以与多项式系数构成的行向量进行相互转换,MATLAB提供了函数sym2poly和poly2sym实现相互转换。 • 2. 提取分子和分母 • 如果符号表达式是一个有理分式(两个多项式之比),可以利用numden函数来提取分子或分母,还可以进行通分。 • [n,d]=numden(f)
EX:提取分子和分母系数。 • >> f=sym('(1+2*s)/(s^2+2*s+1)') • >> pretty(f) • 1 + 2 s • ------------ • 2 • s + 2 s + 1 • >> [n,d]=numden(f) • >> n1=sym2poly(n) • >> d1=sym2poly(d)
3.4 符号极限、微积分和级数求和3.4.1符号极限(Limits) • 【例3.14】分别求1/x在0处从两边趋近、从左边趋近和从右边趋近的三个极限值。 • >> f=sym('1/x') • >> limit(f) %对x求趋近于0的极限 • >> limit(f,'x',0) %对x求趋近于0的极限 • >> limit(f,'x',0,'left') %左趋近于0 • >> limit(f,'x',0,'right') %右趋近于0
3.4.2 符号微分 (Differentiation) • 函数diff是用来求符号表达式的微分。 • diff(f) %求f对自由变量的一阶微分 • diff(f,t)%求f对符号变量t的一阶微分 • diff(f,n)%求f对自由变量的n阶微分 • diff(f,t,n)%求f对符号变量t的n阶微分
3.4.3 符号积分(Integration) • 积分有定积分和不定积分,运用函数int可以求得符号表达式的积分,即找出一个符号表达式F使得diff(F)=f,也可以说是求微分的逆运算。 • int(f,’t’) %求符号变量t的不定积分 • int(f,’t’,a,b) %求符号变量t的定积分 • int(f,’t’,’m’,’n’) %求符号变量t的定积分
3.4.4 符号级数 • 1. symsum函数(Symbolic Summation) • symsum(s,x,a,b) %计算表达式s的级数和 • 说明:x为自变量,x省略则默认为对自由变量求和;s为符号表达式;[a,b]为参数x的取值范围。 • 2. taylor函数(Taylor Series) • taylor(F,x,n) %求泰勒级数展开 • 说明:x为自变量,F为符号表达式;对F进行泰勒级数展开至n项,参数n省略则默认展开前5项。
3.5 符号积分变换3.5.1傅里叶变换及其反变换 • 1. fourier变换 • F=fourier(f,t,w)%求时域函数f(t)的fourier变换F • 说明:返回结果F是符号变量w的函数,f为t的函数。 • 2. fourier反变换 • f=ifourier (F,w,t) • 说明:ifourier函数的用法与fourier函数相同。 • >> syms t w • >> F=fourier(1/t,t,w) %fourier变换 • F =i*pi*(Heaviside(-w)-Heaviside(w))
3.5.2拉普拉斯变换及其反变换 • 1. Laplace变换 • F=laplace(f,t,s) %求时域函数f的Laplace变换F • 说明:返回结果F为s的函数,当参数s省略,返回结果F默认为's'的函数;f为t的函数,当参数t省略,默认自由变量为't'。 • 2. Laplace反变换 • f=ilaplace(F,s,t) %求F的Laplace反变换f • >> syms a t s • >> F1=laplace(sin(a*t),t,s) %sinat的Laplace变换 • F1 =a/(s^2+a^2)
3.5.3 Z变换及其反变换 • 1. ztrans函数 • F=ztrans(f,n,z) %求时域序列f的Z变换F • 说明:返回结果F是以符号变量z为自变量;当参数n省略,默认自变量为'n';当参数z省略,返回结果默认为'z'的函数。 • 2. iztrans函数 • f=iztrans(F,z,n) %求F的z反变换f • >> syms a n z t • >> Fz3=ztrans(exp(-a*t),n,z) %e-at的Z变换 • Fz3 =exp(-a*t)*z/(z-1)
3.6 符号方程的求解3.6.1 代数方程 • MATLAB可以用solve命令给出方程的数值解。 • solve(‘eq’,’v’)%求方程关于指定变量的解 • solve(‘eq1’, ’eq2’,’v1’,’v2’,…) • %求方程组关于指定变量的解 • 例如,解方程: • >> solve(‘a*x^2+b*x+c’) • >> solve('a*x^2+b*x+c=0') • >> solve('a*x^2+b*x+c=0','x')
【例3.22】求三元非线性方程组的解。 • >> 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 y =-3/5 z =5/3
3.6.2 符号常微分方程 • MATLAB提供了dsolve命令可以用于对符号常微分方程进行求解。 • dsolve(‘eq’,’con’,’v’) %求解微分方程 • dsolve(‘eq1,eq2…’,’con1,con2…’,’v1,v2…’) %求解微分方程组 • 说明:’con’是微分初始条件,可省略;’v’为指定自由变量,省略时则默认为x或t为自由变量。 • y的一阶导数为Dy;y的n阶导数表示为Dny 。
EX: y(1)=0,y(0)=0 • >> 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(0)=0','x') %求微分方程的特解 • y = • -1/3*x^3+1/3*x^4
3.7 符号函数的可视化3.7.2 图形化的符号函数计算器 • 在MATLAB命令窗口输入命令“funtool”,就会出现该图形化函数计算器。
3.8 Maple函数的使用3.8.1访问Maple函数 • 1. maple函数 • maple函数用于进行符号运算,并将计算结果返回到MATLAB的工作空间。 • maple(MapleStatement) %运行Maple格式的语句MapleStatement • maple(fun,arg1,arg2…) %运行以arg1,arg2…为参数的Maple的fun函数 • 2. mfun函数 • mfun函数用于对Maple中的经典函数进行数值运算。 • mfun('fun',p1,p2,…)
3.8.2 获得Maple的帮助 • 1. mfunlist命令 • mfunlist命令用来列出能被“mfun”命令计算的经典特殊Maple函数。 • 2. mhelp命令 • mhelp命令用来寻求关于Maple库函数及其调用方法的帮助: • (1) 使用“mhelp index”可以查看Maple的索引目录。 • (2) 使用“mhelp index [分类名]”可以进一步深入查看Maple的某个具体类别。
练习: • 确定下面各符号表达式的自由符号变量: • 1/(sin(t)+cos(w*t)) • 2*a+theta • 2*i+a*j 答案: w theta a
练习: • 计算1*2+2*3+……+n*(n+1)的前3项的和 >> symsum(k*(k+1),1,3)