2015-11-20 3 views
-1

Если у меня есть символическая функция p(r,s) = r^3 в MATLAB, я получить производные dp/dr = 3r^2 и dp/ds = 0, но моя цель состоит в том, чтобы использовать matlabFunction преобразовать эти выражения работать ручки, с векторными входами (r,s). Я хочу что-то похожее на zeros(size(s)), для производной dp/ds, поэтому я не получаю скалярный вывод, если мой вход (r,s) является вектором.Символических различий в MATLAB должны возвращать вектор

Этого кода я пробовал:

syms r s 
p = r^3 
dpds = diff(p,s) 

дает скаляр не переменную первому основной точке температурной шкале нулевого размера, т.е. скалярному выход, если мы имеем вектор вход.

+1

Ваш фактический код для этого? Вы не должны получать нули для 'dp/ds'. – rayryeng

+0

Diff (p, s) является скалярным нулем, а не переменным размером 0. – Tobias

+1

Повторяю. Где ваш фактический код для этого? – rayryeng

ответ

1

Это характер работы matlabFunction. Если вы предоставляете уравнение, которое не имеет независимых переменных в качестве части уравнения, оно по умолчанию предоставляет анонимную функцию без ввода и дает скалярный результат.

Например:

>> syms r s; 
>> p = r^3; 
>> dpds = diff(p,s); 
>> dpdsFunc = matlabFunction(dpds) 

dpdsFunc = 

    @()0.0 

Это даст вам только одно значение, скалярное каждый раз. Это также относится к любой скалярной функции, которая дает ненулевой вывод. Если вы хотите переопределить это поведение и указать переменную длину этого скаляра, которая зависит от длины ввода, вы можете сначала определить, есть ли какие-либо входные переменные в функции, проверив, сколько там переменных. Вы можете использовать для этого symvar. Вы проверили бы, имеет ли этот массив длину 0, и если это произойдет, вы переопределите эту функцию.

Нечто подобное приходит на ум:

syms r s; 
p = r^3; 
dpds = diff(p,s); 

if numel(symvar(dpds)) == 0 
    dpdsFunc = @(s) ones(size(s))*double(dpds); %// Thanks Daniel! 
else 
    dpdsFunc = matlabFunction(dpds); 
end 

Это должно добиться того, что вы хотите.

Minor Примечание

Я на самом деле думаю, что эта переменная длина бизнеса нулей является то, что должно быть введено в MATLAB по умолчанию, а не по умолчанию к одному значению. Это делает код векторизации намного проще. Я соблазн представить в MathWorks запрос на функцию в будущем.

+0

Используйте 'dpdsFunc = @ (s) ones (size (s)) * double (dpds);' для поддержки других констант, кроме 0, кроме того, именно это я собирался написать. – Daniel

+0

@ Даниэль О, это отличная идея. Огромное спасибо. Кроме того, извините за то, что вы быстрее! :(лол. – rayryeng

Смежные вопросы