我对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
答案 0 :(得分:2)
x == y
syms x y z
aa = (x == y) + z
含义
aa = [x or y] + z = x + z = y + z
只要有
x
,就可以将其替换为y
。
它不会检查x
和y
是否相同
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
的肚子上。