分享

符号对象(Symbolic Object)的使用

 hayidaa 2017-07-26


符号对象是什么?

符号对象是Matlab中一种特殊的数据类型, 其实质是“a data structure that stores a string representation of the symbol”, 即它存储的是字符串表示的符号表达式, 只是这些字符串对应的是数学运算法则。如果用whos 命令查询, 符号变量对应的类型显示的是“sym“, 这也是区分符号变量与数值变量的方法。
操作这些对象的步骤, 先是Matlab利用Toolbox中的m文件,传递参数到Maple核心, Maple核心经过运算后将结果再传递回Matlab, 再由M文件将结果解释成为Matlab的通用格式。 如果只需要执行基本的符合运算, 那么只要掌握如何使用Matlab中有关symbolic运算的基本命令就可以了, 而要做复杂的工作, 建议学习下Maple。

定义符号对象变量

基本语句

使用sym 或者 syms 语句可以直接定义符号变量.
  • syms
    syms主要作用是告诉Matlab你要将相关的变量定义为符号变量(因为在Matlab中, 变量不需事先定义即可使用, 但是默认的变量类型都是double型, 所以非Double变量在使用前要事先定义). 相关的语法:
    syms a;%定义a为符号变量, 从此a的操作都服从符号变量操作规则. 
    syms a b c; %同时定义多个符号变量
    syms a b; f=a+b; %定义了a,b为符号类型后, f作为a+b的和, 也是符号类型, 在Matlab中显示的结果就是: “a+b”
  • sym
    sym的作用比syms要广, 不但可以声明变量为符号类型, 还可以給符号变量赋特殊的值.
    a=sym('a'); %其效果等同于: syms a; 
    a=sym('alpha'); %将a定义为为符号变量, 其值为“alpha“, 注意: 如果alpha本身也是符号变量,
    那么在表达式中a和alpha实质是一样的, 但是如果alpha本身的值发生改变, 
    a的值却不会随之改变(有点晕), 试试执行下面这些语句看看: syms alpha, a=sym('alpha'), f=a+alpha, alpha=2, a,
    a=sym(2); %a被定义为符号变量, 同时赋值为2. 注意这个和数值的2有点不同. 它的运算法则是符号运算法则. 
    a=sym('2*x+3y'); %a被赋值为一个符号表达式, Matlab自动识别字符串中的符号变量(注意, 只有常规的符号才能被自动识别).
    a=sym(3*x+3*y); %此处要求x, y二者事先已经被声明为符号变量, 否则出错, 本句的效果和上一句相同.

定义特殊类型的符号变量

语法: syms a b c 类型; 或者 a=sym('a','类型');
两种语句效果相同, 注意的是他们的区别在于sym中的类型一定要加单引号! 这里的类型可以是“real“, ”unreal“,”positive“。 这样定义的好处是, 如果定义a为positive类型, 那么在之后的计算中, a都只会被赋予正的值。 例如, 如果要解一个方程: a*a=1,那么给出的解就只有a=1, 而自动将 a<0的解都舍去。

转换数值为特定的格式

如上面提到的可以将数值赋值给一个符号变量, 由于符号变量存储数值的方式与数值变量不同, 所以在这个赋值的过程中, 我们还可以指定符号数值的显示样式, 语法是: a=sym(数值,'格式类型'); 此处格式类型有如下各种:
f, 符号浮点数的显示类型;r,有理数显示样式, 一般是分数显示,(此为默认的显示样式);e,科学计数法显示;d,所谓的精确显示, 它用十进制数值将这个数值的精确值表示出来。
说这么多太不直观了, 只要运行一下下面的代码就弄清楚所有这些显示样式有什么不同了(注意: 计算机内部存储的数值是相同的,只是显示出的样子不同罢了):
b=0.1; 
a=sym(b) %默认显示样式, 类型为'r'
a=sym(b,'f') %浮点样式显示 
a=sym(b,'e') %科学计数法 
a=sym(b,'d') %内部精确值的十进制显示

建立符号矩阵

建立符号矩阵有两种方法, 一种是直接由数值矩阵转换为符号矩阵: B=sym(A) %这里, A 为一个数值矩阵, B是转换得到的符号矩阵。 另外一种方法是由已定义的符号变量组成矩阵, 如: B=[a b c; b a c; c b a] %a, b, c已经用syms 或 sym定义成了符号变量。

定义符号函数

  • 如果只是定义一个抽象函数(abstract function)而不必过问其实际形式,
    如f(x),那么只要fx=sym('f(x)'), 即可, 这个特性在傅立叶变换及拉普拉斯变换, z变换中很有用.
  • 如果需要自定义一个Matlab中还没有的特殊的符号函数, 例如sinc(), 需要写一个m函数文件, 命名为"sinc.m", 将其放入"@sym"文件夹内.
  • 要定义一个普通的有表达式的函数, 直接将其表达式赋值给符号变量就行了. 例如定义f=sin(x*y)/x; %其中x,y事先已被定义为符号变量.

Findsym--寻找表达式中的符号变量

如果你不做编程, 这个东西作用不大. 它主要用于从一个字符串表达式或者一个符号表达式中找出里面都有那些符号变量. 例如: findsym('x*3+y*2'), 找出来的符号变量就是x, y.

符号变量的替换

语法: subs(符号表达式, 替换前的符号变量, 替换后的符号变量);
例子: syms a b; %定义a,b为符号变量;
f=a*a+2*a; %将f定义为含a符号变量的符号表达式.
f=subs(f,a,b); %f表达式中a都会被替换为b,现在f是: b*b+2*b
f=subs(f,b,2); %f中的b会被2代替, 由于现在 f中不存在其他的符号变量, 所以给出的是8这个数值结果; 如果f中还有其他符号变量, 此时f中的b会被换成2然后作符号运算得出新的符号表达式。
令人发指的一个特性是这里2的位置还可以用向量代替。例如: subs(f,b,[2 3]), 将分别对2,3作运算, 得到一个1*2的向量结果。
如果需要转换多个变量可以用大括号将他们括起来, 需要注意的是替换变量与被替换变量数量要相对应,
例如: subs(f,{a,b,c},{x,y,z});

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多