Символическая операция сжатия и суммирования не может получить правильный ответ - PullRequest
0 голосов
/ 05 июля 2019

Я запутался в символическом приоритете операций 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 ]

2 голосов
/ 05 июля 2019
  • Случай 1: x == y
syms x y z

aa = (x == y) + z

Значение

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

Где угодноу вас есть x, вы можете заменить его на y, взаимозаменяемо.
Он не проверяет, являются ли x и y одинаковыми


  • Случай 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 голос
/ 05 июля 2019

Я думаю, что 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

Что касается вашего отредактированного вопроса: почему вы вообще используете символические переменные? Они медлительны и громоздки (не говоря о невыразимом зле 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.

...