MATLAB中的subs函数是一种通用的置换指令,它的功能是在符号表达式和矩阵中进行符号替换/置换操作。此外它还提供了一种在符号计算和数值计算之间转换的一种途径。下面相机介绍一下如何进行置换和如何进行数值计算与符号计算的转换。


1. sub指令的功能语法subs能够在符号表达式和符号矩阵中进行置换操作,下面我们就介绍一下它的调用语法规则:

R = subs(S)         %将表达式S中的所有变量用调用的函数MATLAB workspace中获得的值进行置换,将置换后的表达式赋给R

R = subs(S, new)     %new置换表达式S中的自变量后在赋给R

R = subs(S, old, new)  %new置换表达式中的old,然后将置换完的表达式赋给R

对于英语学的比较好的人员,可以通过help subs搜索matlab自带的帮助信息进一步学习。下面是用help subs搜索到的subs帮助信息。


2.产生待置换的符号函数

    为方便下一步进行符号-符号、符号-数字的置换这一步先生成符号函数,以供后面的置换操作进行调用。需要注意的是在进行新的计算之前先用“clear”清除一下内存空间。生成的符号函数为f = a*sin(x)+b,具体结果如下图所示:

blob.png

3.符号-符号置换

在这一步,我们先用符号表达式置换符号表达式,演示一下subs的具体功能。上一步生成的符号函数f中有sin(x),这一步我们先用log(y)将其置换。其置换指令为:f1=subsf,sin(x),'log(y)',其置换结果如下图所示:

blob.png


4.符号-数字置换:单个变量被双精度数字置换

    从这一步开始就提供了一种符号-数字之间的转换,需要注意的是,当单个变量被双精度数字置换后,其结果仍然是符号对象属性。这一点我们可以用class指令查看结果的类型。这一步的置换代码指令:f2 = subs(f,a,2.886),置换结果如下图显示:

blob.png

5.用数字置换所有变量(含符号数字)

    自这一步中我们将所有变量被数字(至少一个符号数字,例如π(在matlab中表示为pi))置换,这个时候我们来看一下结果是否仍为符号对象型的。置换指令代码:f3 = subs(f,{a,b,x},{2,5,sym('pi/3')})。注意这一步里面我们用到了胞元数组。上面指令的意思是:用2置换a,用5置换b,用sym('pi/3')置换x。下图是运算结果:

blob.png

6.用数字置换所有变量(全为双精度数值数字

从上一步可以看出,当进行置换操作时,如果置换数字中含有符号数字,那么计算结果类型也为符号sym类型。那如果全为全为双精度数值数字,那计算结果会是什么类型呢?符号?还是数值?下面我们探究一下就知道了。置换操作的指令代码为:f4 = subs(f,{a,b,x},{2,5,pi/3})。注意这次的pi/3为数值型的数字而非符号型的。具体置换和上一步一样,下面我们看一下具体的结果,如下图所示:

blob.png

 7.单个变量被数值数组置换

在上一步中我们可以得出结论:当所有变量被双精度数值数字置换时,其计算结果也为数值型(double)。现在我们看一下另外一种情况,即一个变量被双精度数组置换,此时计算结果的类型将是什么结果?这里我们就用数组[0,pi/1,pi]来置换变量x,再查看结果类型。其计算代码为:f5=subs(f,x,[0,pi/2,pi]) ,计算结果如下图所示:

blob.png


8.所有变量被数值数字置换(有一个是数组)

上面一步的结果从图上很容易就可以看出来了。在这一次计算中,我们将x用数值数组来进行置换,其他变量用单个具体数值来置换查看结果,我们还可以画出置换后函数的图形来看一下。为简便起见我们可以先生成数组存放在一个变量中,然后在置换时调用。具体的置换指令为:f6=subs(f,{a,b,x},{1.98,3.45,t}),其中t为数组,我们可以在置换前用“t=(0:pi/10:4*pi)”指令来生成。计算结果如下图:

blob.png


下面画出所有变量被数值数字置换(有一个是数组)后结果函数的图形(用代码“plot(t,f6)”画出):

blob.png


9.两次置换获得双精度数组

上一步我们只用了一次置换,并且画出了置换结果的图形。下面我们进行两次置换,观察结果和上一步中的一次置换有什么具体的不同。同样我们也画出两次置换结果的图形。具体代码就不写了,可以在图中看。具体置换代码及计算结果如下图所示:

blob.png


10.一次置换和两次置换的结果图

我们在一张图里面用两个子图画出一次置换和两次置换的结果图,看看他们有什么不同?画出的结果图如下:从图上我们可以看出,一次置换只能产生一条曲线,而两次置换却能产生一次列的曲线,在本次计算的两次置换中共产生了16条曲线。多次置换的这一结果也是subs置换指令在符号表达式双精度数值计算转换中的特殊功用。

blob.png

注意:subs的第三个输入量可以是“字符串”(第三步)。