matlab: subs на символической константе возвращает скаляр вместо вектора для векторного ввода - PullRequest
2 голосов
/ 06 июня 2010

обычно символические функции возвращают векторы для векторных входов:

syms('x');
f=x*2;
subs(f,[1 2 3])
outputs: [2 4 6]

но делает

f=sym('0');
subs(f,[1 2 3]);
outputs: 0
and not: [0 0 0]

В общем, мои вопросы: как мне заставить f вести себя как "нормальная" символическая функция? Я могу сделать что-то безобразное, например f=x-x, чтобы создать функцию, которая всегда возвращает ноль, но есть ли способ получше?

Ответы [ 2 ]

1 голос
/ 06 июня 2010

На самом деле, нет пути.

sym('0') создает символическую константу (в данном случае 0). subs() заменяет все переменные на каждое значение из данного вектора. Однако у вас нет переменных, поэтому subs() просто возвращает заданную символическую константу.

Становится лучше. sym() внутренне делает некоторое упрощение, поэтому sym('0*x') или sym('x-x') оба становятся sym('0'), и вы получаете точно такое же поведение. Точно так же sym('x/x') превращается в sym('1'), и вы просто возвращаете скаляр 1 от subs(), даже если передаете ему вектор.

Единственный способ обойти это - написать вспомогательную функцию, которая определяет, меньше ли size() выходных данных subs(), чем вектор, и превращает ее в правильный размер вектора если нужно.

0 голосов
/ 06 июня 2010

У меня нет Symbolic Toolbox, так что это слепое предположение. Ваши объявления функций выглядят недостаточно идентично:

syms('x');
f=x*2;

против

f=sym('0');

Возможно, в первом случае вы определили функцию, которая возвращает двойное число своих входов, во втором случае определили функцию, которая возвращает 0 независимо от своих входных данных. Может быть

syms('x');
f=x*0;

это то, что вам нужно?

...