您的位置:首页 > 编程语言 > MATLAB

关于MATLAB入门的简单记录11 符号运算

2018-02-26 18:24 579 查看
首先有一个概念是符号对象。要进行符号运算,符号对象是符号运算的基础,符号对象包括符号常量,变量,矩阵和表达式。
与普通变量不同的是,符号对象必须先进行定义之后才能使用。定义符号常量的方法:sym(A)或者可以在后面接上flag参数成sym(A,flag)。创建符号变量时候:x=('x')则创建了一个符号变量。这里注意单引号引起来的x与变量x的字母是相同的。至于刚才提到的flag用于将一个数值矩阵转化为符号矩阵的可选参数类似浮点型,有理数型,估计误差值等类型。
关于与之前的区别:





明显看到s1是原样输出而s2得到了具体结果



s4这种形式log2被计算出来,然后因为没有标注它的参数就默认是r即有理数的形式表示出来,显示就成为了一个分数。这里加没加引号对最后的结果有很大影响。没有加引号就首先对括号里面的进行数值运算,然后再把结果转化成符号量
关于符号类型的运算:



前者是real类型的后者是unreal类型的,不会合并
可以使用命令一次性定义多个符号变量,函数只能一次性定义一个:syms arg1 arg2 real/unreal



以上的b+c+d是一种定义符号表达式的方法,除此以外还有一种方法就是直接定义:



符号矩阵内元素访问方式和数值矩阵访问方式一致,即下标法和单下标法:





符号对象用于算术运算没有什么特殊的,唯一和普通的区别就是运算结果都是符号变量。
使用符号对象在进行多项式运算时候非常方便,这里的符号变量已经提前定义好,后面使用expand函数对多项式的乘积进行展开



符号矩阵之间进行计算的时候,就是进行对应位置上的计算,如果是进行符号矩阵和符号变量之间的计算时候,会将符号变量扩展成对应大小的矩阵再进行计算:





用符号变量解对应的线性方程组:





关于独立变量的解释:



可以使用findsym进行查找:



matlab提供对表达式进行化简美化的功能:



合并同类项就是以前面提到的独立变量为基准进行的,一般显示就是输入内容的降幂排列,合并同类项要手动使用函数进行



当然collect函数可以自己指定对应的变量,即第二个参数,进行合并:





因式分解:



使用simplify函数可以让matlab自动化简寻求最佳的显示形式:



simple函数列举了所有方法化简后可能的结果,可以视为是simplify在没有选择之前的结果库
使用通分函数进行化简时候发现这里只显示了分母而没有显示分子,采取的方法就是用一个矩阵的形式分别得到分子和分母



pretty函数可以让显示变得美观,看起来更像是数学书写法:



matlab中进行符号微积分操作:



在取极限时候,默认对符号变量进行取极限操作,默认以0为极限,F是对应的需要取极限的函数,a指定取极限的点,v指定取极限的变量





left right选项就是取左右极限使用。
取微分运算时候所有参数意义和取极限是一样的,这里的n表示取几次微分。
不过这里对需要求微分的变量需要用引号引起来,这点和之前的用法不同:



求不定积分:



求定积分,ab指定上下限:



在求积分的时候,两种情况下是没办法得出积分结果的,第一种就是所给的积分本身不可积分,第二种是积分形式过于复杂,经过长时间运算之后matlab依然无法积分,这种情况下火返回原表达式并提示出错。
在进行Taylor展开时候,如果不指定参数会默认进行降幂排列6次Maclaurin:





matlab进行符号积分运算:这些变换一般位于相应的工具箱中。



关于傅立叶变换时候,注意有的函数在实域中没有对应的fourier形式,那么返回的就是原来的形式。













求方程的解析解:使用的是solve函数,其中的eqn指定的是由符号变量构成的表达式或者字符串构成的,var指定符号或者字符串未知变量,前者未指定的话默认是0,后者未指定的话,默认使用findsym函数返回的结果。当方程找不到解析解的时候而且方程数量和未知数数量是一致的时候,会尝试输出代数解。正常情况下,最后解的结果分为三种情况,一个方程对应一个解,直接返回。如果一个方程对应多个解,会将结果输出成符号向量。如果多个方程对应一个解,结果会被保存到一个结构数组中。







实例求解以下方程组:



clear;
clc;
g=solve('x+y+z=10','3*x+2*y+z=14','2*x+3*y-z=1','x,y,z');
这里可以看到最后得到了一个结构数组,分别访问对应的域得到最后的结果:




clear;
clc;
syms x1 x2 sita a b;
L1=x1*cos(sita)-x2*sin(sita)-a;
L2=x1*sin(sita)+x2*cos(sita)-b;
[x1 x2]=solve(L1,L2,x1,x2);




clear;
clc;
syms u y v z w;
L1=u*y^2+v*z+w;
L2=y+z+w;
[y z]=solve(L1,L2,y,z);


最后的结果不一定是最简单形式,可以调用前面提到的simplify等函数对结果进行化简。这里注意到结果是一个向量的形式,可知道方程有两组解。
常微分方程(组)的解析解:使用函数dsolve  【symbolic solution of ordinary differential equations(ODE)】
这个函数中默认的独立变量是t,输入函数参数列表的最后一个参数指定用户的独立变量。D表示对独立变量求微分,即d/dt 后面指定数字表示求几阶微分。D后面跟着的任何字母都会被转化为独立变量,比如说D3y,对y(t)求3次微分。
最后的结果如果找不到显示解系统会尝试找出隐式解并给出警告,如果都找不到的时候,给出警告并且返回一个空的符号量。对于有些情况,比如说包含有非线性方程的时候,可能会输出等价的低阶微分方程或者积分方程的形式。



实例:





这里明显发现出现t结果不正确,所以应该给出对应的独立变量:










通解



加了初始条件得到特解






通解

加了初始条件得到特解

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: