Matlab:在简单的情况下,不能简化符号标量函数使用subs()

时间:2016-10-24 01:17:58

标签: matlab symbolic-math

这只是matlab中的一个简单案例,函数subs()发生了一些奇怪的事情,我不知道为什么。

我已阅读官方帮助文档,并使用Google搜索错误消息但未找到有用信息。

有人能告诉我命令“subs(f)”有什么不对吗?

>> syms x w b f
>> f=x*w-b
f =
w*x - b
>> w=[1 2 3 ;4 5 6; 7 8 9 ]
w =
     1     2     3
     4     5     6
     7     8     9
>> x=[1 2 3.44]'
x =
    1.0000
    2.0000
    3.4400
>> b=[ 2 4 7 ]'
b =
     2
     4
     7
>> f
f =
w*x - b
>> subs(f)
Error using symengine
New arrays must have the same dimensions or must be scalars.
Error in sym/subs>mupadsubs (line 140)
G = mupadmex('symobj::fullsubs',F.s,X2,Y2);
Error in sym/subs (line 125)
    G = mupadsubs(F,X,Y); 

这是错误消息的屏幕截图: enter image description here

1 个答案:

答案 0 :(得分:1)

Symbolic Toolbox的运作方式是Symbolic Variables是标量,并且它们所在的任何操作或表达都使用元素方式语义。作为subs documentation中的状态:

  

如果old是标量,而new是向量或矩阵,那么subs(s,old,new)olds的所有实例替换为new ,以元素方式执行所有操作。 s中的所有常数项都被常数乘以所有1的向量或矩阵。

因此,经过替换的表达式需要在元素方面的应用和替换时的扩展方面发挥出色。然而,当被替换的新阵列在每个维度中都没有匹配大小时(如果系数矩阵是矩形而不是列向量的情况),则在引擎中可能发生维度不匹配。即使用单元阵列直接指定替换也会引发错误:

>> wnum = [1 2 3 ;4 5 6; 7 8 9 ];
>> xnum = [1 2 3.44]';
>> bnum = [ 2 4 7 ]';
>> subs(f,{w,x,b},{wnum,xnum,bnum})
Error using symengine
New arrays must have the same dimensions or must be scalars.

Error in sym/subs>mupadsubs (line 140)
G = mupadmex('symobj::fullsubs',F.s,X2,Y2);

Error in sym/subs (line 125)
    G = mupadsubs(F,X,Y);

虽然完全符合尺寸的替换可以正常工作:

>> subs(f,{w,x,b},{xnum,xnum,xnum}); % All 3x1
>> subs(f,{w,x,b},{wnum,wnum,wnum}); % All 3x3

所有这一切都源于符号变量本身被视为标量。符号解决方法是将变量声明为符号数组,以生成数组的各个元素并允许一对一替换:

>> w = sym('w',[3,3]);
>> x = sym('x',[3,1]);
>> b = sym('b',[3,1]);
>> f = w*x - b;
>> subs(f,[w,x,b],[wnum,xnum,bnum])

ans =

  333/25
  766/25
 1174/25

当然,如果可以的话,最好的做法是完全或尽可能地避免使用符号工具箱。

>> double(subs(f,[w,x,b],[wnum,xnum,bnum]))
ans =
   13.3200
   30.6400
   46.9600

>> fnum = wnum*xnum - bnum
fnum =
   13.3200
   30.6400
   46.9600

上述讨论是一个非常非常大的原因,除了与之相关的所有性能提升之外,为什么我将线性代数保留在适当的MATLAB运行时间。在我看来,符号工具箱最好留给一个或多个变量中的函数分析(我用它来经常创建泰勒级数,雅可比行列式和哈希数)或者用于调查目的的小维度问题的高精度分析。 / p>