MATLAB符号对象与符号运算
序言
符号对象(Symbolic Objects 不同于普通的数值计算)是Matlab中的一种特殊数据类型,它可以用来表示符号变量、表达式以及矩阵,利用符号对象能够在不考虑符号所对应的具体数值的情况下能够进行代数分析和符号计算(symbolic math operations),例如解代数方程、微分方程、进行矩阵运算等. 符号对象需要通过sym或syms函数来指定, 普通的数字转换成符号类型后也可以被作为符号对象来处理. 我们可以用一个简单的例子来表明数值计算和符号计算的区别: 2/5+1/3的结果为07333(double类型数值运算), 而sym(2)/sym(5)+sym(1)/sym(3)的结果为11/15, 且这里11/15仍然是属于sym类型, 是符号数.
正文
1. 符号对象的定义
符号对象的定义用syms x y z; 的形式,例如
此外,还可以用x=sym('x'); y=sym('y'); 的格式定义符号变量,它跟syms x y; 具有相同的含义. Matlab也支持一次性定义一个符号表达式,如f=sym('a*x^2+b*x+c'),定义后这个表达式会被认为是一个整体,Matlab不会自动把其中每个项a,x,b ,c 定义为符号变量. 所以如果想对一个符号表达式进行计算,则还是要把参与计算的项单独定义好.
2. 符号数
Matlab支持将一个数字转换成符号对象,转换得到的符号数(Symbolic Numbers)仍然具有数字值的含义,只是之后Matlab不会对它进行浮点运算. 符号数的定义也通过sym命令实现. 例如可以让Matlab进行分数运算1/2+1/3=5/6,
而如果直接在命令窗口中输入1/2+1/3则会得到0.8333的结果. 符号数的计算比浮点计算要花费更多的时间和空间, 但是它是一种精确计算, 没有误差.
3. 符号计算
利用符号变量可以构建符号表达式、符号函数、符号方程和符号矩阵等,然后可以进行因式分解、求导、求方程、求矩阵函数值的解等操作.
(1) 因式分解Factoring
对符号表达式f进行因式分解的命令格式为factor(f). 例如将表达式(x^9-1)分解成多个因式的命令为
syms x;
factor(x^-)
运行结果为
(2) 求导/求微分Differentiation
对符号表达式f(x)求导的命令为diff(f). Matlab可以自动识别表达式中的变量, 如果表达式a只包含一个变量, 则diff(f)函数是相对这个唯一的变量求导, 若a包含多个变量, 则diff(f)是对f中的默认变量求导, 默认变量是f中含有的在字母表中离x最近的变量. 表达式f的默认变量可以用函数findsym(f,1)来得出.
如果要对f(x)求n阶导数, 则用diff(f,n). 对于含有多个自变量的表达式, diff可以实现求偏导, 例如表达式f(s,t)相对s求偏导就用diff(f,s), 如果相对s求2阶偏导则是diff(f,s,2).
(3) 求积分Integral
求符号表达式f(x)的不定积分用int(f). 对于含有多个符号变量的表达式f(x,s,t), 如果希望将其相对t求积分, 用int(f,t). 求f(x)从0到1的定积分用int(f,0,1)或int(f,x,0,1).
(4) 求极限Limits
求函数f(x)或f(x,y)在x趋近于0时的极限用limit(f,x,0), 求(1+x/n)n在n趋近无穷大时的极限用limit((1+x/n)^n,n,inf), 求a(x)在x趋近0-(左极限)或x趋近0+(右极限)的时候用limit(f,x,0,'left')或limit(f,x,0,'right').
(5) 符号累加Symbolic Summation
普通的算术累加用sum, 而符号数或符号表达式的累加用symsum. 例如求1+1/22+1/32+...和1+x+x2+...用如下代码
syms x k;
s1=symsum(/k^,1,inf)
s2=symsum(x^k,k,,inf)
(6) 符号表达式化简Simplification
利用MATLAB提供的若干表达式变形函数, 我们可以将符号表达式化简或根据需求转换成不同的形式.
- collect 可以将表达式按照其默认的符号变量的幂次由高到低排列, 同一幂次的符号变量的系数被合并到一起. 如果表达式含有多个变量, 则可以利用第二个参数指出以哪个变量为准. 例如对于f=x^3*y+x*(y^2+6)+x*y+8*x^2+y^2*x, collect(f)的结果为x^3*y+8*x^2+(2*y^2+6+y)*x, collect(f,y)的结果为2*y^2*x+(x+x^3)*y+8*x^2+6*x.
- expand 将表达式展开, 并且会应用一些基本公式(等式identities). 例如expand((x-1)*(x-2)*(x-3))的结果为x^3-6*x^2+11*x-6; expand(exp(a+b))的结果为exp(a)*exp(b); expand(cos(x+y))的结果为cos(x)*cos(y)-sin(x)*sin(y); expand(cos(3*acos(x)))的结果为4*x^3-3*x.
- horner 将表达式分解成嵌套形式. 例如horner(x^3-6*x^2+11*x-6)的结果为-6+(11+(-6+x)*x)*x.
- factor 因式分解, 将表达式分解成几个因式的乘积, 如果表达式无法分解成积的形式, 则分解结果为原表达式保持不变.
- simplify 利用各种内置的基本公式(algebraic identities)对表达式化简.
- simple 通过不同的方式对表达式进行化简, 试图得到最短的结果(结果表达式含有最少的字符数).
(7) 解代数方程
解代数方程的a(x)=0的命令是solve(a),例如
(8) 求符号矩阵的函数值
符号矩阵是指矩阵元素包含符号变量的矩阵,对这种类型的矩阵可以按照正常数值矩阵一样的规律进行计算,例如
(8) 其他符号函数
- numden求符号分数的(消去最大公约数之后的)分子和分母。例如[n,d] = numden(sym(6/8)) 返回 n = 3 和 d = 4,单纯的numden(6/8)仅返回分子3.
MATLAB符号对象与符号运算的更多相关文章
- 【 c语言中无符号和有符号的加法运算】【深入理解】--【sky原创】
原文:[ c语言中无符号和有符号的加法运算][深入理解]--[sky原创] 第一题 #include<stdio.h> int main() { unsigned int a=6; i ...
- C语言中无符号数和有符号数之间的运算
C语言中无符号数和有符号数之间的运算 C语言中有符号数和无符号数进行运算(包括逻辑运算和算术运算)默认会将有符号数看成无符号数进行运算,其中算术运算默认返回无符号数,逻辑运算当然是返回0或1了. un ...
- MATLAB的两种移位运算
MATLAB的两种移位运算: 1)circshift矩阵移位 circshift:循环移位数组 语法:B = circshift(A,shiftize) 说明: B = circshift(A,sh ...
- 深入理解计算机系统(2.4)---C语言的有符号与无符号、二进制整数的扩展与截断
开篇请各位猿友允许LZ啰嗦几句,最近一直在写计算机系统原理这系列文章,也已经下定决心要把这本书的内容写完.主要目的其实是为了巩固LZ的理解,另外也想把这些内容分享给猿友们,毕竟LZ觉得这些内容对程序猿 ...
- Java-java中的有符号,无符号操作以及DataInputStream
1. 无符号和有符号 计算机中用补码表示负数,并且有一定的计算方式:另外,用二进制的最高位表示符号,0表示正数.1表示负数.这种说法本身没错,可是要有一定的解释,不然它就是错的,至少不能解释,为什么字 ...
- C语言进阶——有符号与无符号02
在计算机的内部,我们所有的信息都是由二进制数字组成的 有符号数的表实法: 在计算机内部用补码的方式表实有符号数 正数的补码位正数的本身 负数的补码为其绝对值取反然后加一得到 例如-7 他在计算机内部的 ...
- C语言的有符号与无符号,二进制整数的扩展与截断
C语言的有符号与无符号,二进制整数的扩展与截断 前一节说了整数的表示方式,,也就是无符号编码与补码编码.这一届说一下二进制整数的扩展与截断,这部分内容与C语言挂钩.so,我们先看下面C语言的有符号和无 ...
- C语言中的强符号与弱符号
转自:http://blog.csdn.net/astrotycoon/article/details/8008629 一.概述 在C语言中,函数和初始化的全局变量(包括显示初始化为0)是强符号,未初 ...
- GNU C/C++ __attributes__ GCC中的弱符号与强符号
最近在看一些源代码,遇到了一些使用__attribute__修饰函数和变量的属性方面的代码,不是太了解,很是汗颜,再此做个总结: GCC使用__attribute__关键字来描述函数,变量和数据类 ...
随机推荐
- jQuery的选择器中的通配符[id^='code']或[name^='code']及jquery选择器总结
1.选择器 (1)通配符: $("input[id^='code']");//id属性以code开始的所有input标签 $("input[id$='code']&quo ...
- sort排序用法
Python] sorted函数 我们需要对List.Dict进行排序,Python提供了两个方法对给定的List L进行排序,方法1.用List的成员函数sort进行排序,在本地进行排序,不返回副本 ...
- 开放接口/RESTful/Api服务的设计和安全方案详解
一.总体思路 这个涉及到两个方面问题:一个是接口访问认证问题,主要解决谁可以使用接口(用户登录验证.来路验证)一个是数据数据传输安全,主要解决接口数据被监听(HTTPS安全传输.敏感内容加密.数字签名 ...
- python运算符——逻辑运算符
not命令是取反命令,真的变成假的,假的变成真的(True是真的,False是假的) b = Trueprint(not b) 原本是真的,但是加了“not”指令就变成了假的,not指令是一元运算符, ...
- 前端技术之--HTML
1.一套规则,浏览器认识的规则. 2.开发者: 学习Html规则 开发后台程序: - 写Html文件(充当模板的作用) ****** - 数据库获取数据,然后替换到html文件的指定位置(Web框架) ...
- MariaDB配置、集群
MariaDB在centos 7.3的安装,配置和集群搭配 阿里云最新选配系统中,只有centos7.3可选,因此,基于centos 7的MariaDB的安装,配置... 全部删除MySQL/Mari ...
- The Triangle(DP-数塔问题)
题目链接:http://poj.org/problem?id=1163 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure 1 shows a number ...
- webpack打包样式代码去重
一.问题描述 控制台审查样式,同一个样式被导入很多遍,每调用一次@import "common.less";打包时都会多出一份类似的样式代码. 二.问题分析 补上... 三.解决方 ...
- XVII Open Cup named after E.V. Pankratiev. GP of Siberia, Division 1
1. Ski race 枚举枚举倍数判断即可.时间复杂度$O(n\log m)$. #include<cstdio> #include<algorithm> using nam ...
- 06-JDBC
JDBC > JAVA Database Connectivity java 数据库连接 * 为什么会出现JDBC > SUN公司提供的一种数据库访问规则.规范, 由于数据库种类较多,并且 ...