符号压缩运算和求和不能得到正确的答案

时间:2019-07-05 07:29:21

标签: matlab symbolic-math

我对MATLAB的符号运算优先级感到困惑。我的代码无法产生所需的输出。

syms x1 x2 x3 x4
aa=((x1 == 0 & x2 == 0 & x3 == 0 & x4 == 0) + ((9*x1)/50 + (327*x2)/2000 + (1841*x3)/20000 + (1799*x4)/20000));
bb=eval(subs(aa, [x1 x2 x3 x4], [0.2 0.2 0.2 0.2]))

我希望

的输出
bb=
    0.1051

但实际输出是

bb =
    logical
    0

为什么MATLAB会这样做? 我使用MATLAB R2018b

2 个答案:

答案 0 :(得分:2)

  • 案例1: x == y
syms x y z

aa = (x == y) + z

含义

aa = [x or y] + z = x + z = y + z
  

只要有x,就可以将其替换为y
  它不会检查xy是否相同


  • 案例2: isequal(x, y)
syms x y z

aa = (x == y) + z
aa = isequal(x, y) + z

含义

aa = [check if x and y are the same] + z = 0 + z = z

使用 isequal()

对此进行修改
syms x1 x2 x3 x4
aa=((isequal(x1, 0)& isequal(x2, 0) & isequal(x3, 0) & isequal(x4, 0)) + ...
    ((9*x1)/50 + (327*x2)/2000 + (1841*x3)/20000 + (1799*x4)/20000));
bb=eval(subs(aa, [x1 x2 x3 x4], [0.2 0.2 0.2 0.2]));

结果

bb = 0.1051

答案 1 :(得分:1)

我认为MATLAB试图减少产生最简单输出所需的括号数量。请注意,如果a等于b,则a+c也等于b+c,因此该语句没有错。如果您致电simplify(aa),您甚至会得到一个简单的a == b,这实际上是最简单的形式,因为可以取消两边的c

syms a b c
aa=(a==b)+c
aa =
a + c == b + c
pretty(aa)
a + c == b + c

simplify(aa)
ans =
a == b

关于您编辑过的问题:为什么要使用符号变量?它们既慢又麻烦(更不用说the unspeakable evil that is eval了)。使用数值计算确实会得出正确的结果:

syms x1 x2 x3 x4
aa=((x1 == 0 & x2 == 0 & x3 == 0 & x4 == 0) + ((9*x1)/50 + (327*x2)/2000 + (1841*x3)/20000 + (1799*x4)/20000));
bb=eval(subs(aa, [x1 x2 x3 x4], [0.2 0.2 0.2 0.2]))
bb =
  logical
   0

x1=0.2;x2=0.2;x3=0.2;x4=0.2;
(x1 == 0 & x2 == 0 & x3 == 0 & x4 == 0)
ans =
  logical
   0

((9*x1)/50 + (327*x2)/2000 + (1841*x3)/20000 + (1799*x4)/20000)
ans =
    0.1051

aa=((x1 == 0 & x2 == 0 & x3 == 0 & x4 == 0) + ((9*x1)/50 + (327*x2)/2000 + (1841*x3)/20000 + (1799*x4)/20000))
aa =
    0.1051

我怀疑问题出在subs和/或eval的肚子上。