Ошибка выброса символьных производных в старых версиях MATLAB - PullRequest
0 голосов
/ 18 октября 2018

У меня есть этот код MATLAB, который использует символические функции для определенных операций, а функция sym/diff выдает очень досадную ошибку, когда я запускаю его в версии 2015b на моем сервере.Мой ноутбук с 2018a работает без проблем.В частности, ошибка:

Error using sym/diff (line 68)
Error using class
The first argument to function CLASS must be a struct.

MWE той части кода, которая выдает ошибку, выглядит следующим образом:

Thrust_fcn = @(r) 5 * exp(-2*r)
syms r;
diff_fcn = diff(Thrust_fcn, r);

Это код во встроенном symФункция / diff, которая выдает ошибку:

try
    if nargin == 1
        r = class(maplemex(0,'MTM:-diff',m),'sym');
    elseif nargin == 2
        r = class(maplemex(0,'MTM:-diff',m,n),'sym');
    else
        r = class(maplemex(0,'MTM:-diff',m,n,u),'sym');
    end
catch
    error(lasterr);
end

Я проверил код функции sym/diff на 2018a и совершенно другой, это кусок кода ~ 300 строк.

Есть идеи, как заставить это работать?Большое спасибо!

1 Ответ

0 голосов
/ 19 октября 2018

Символическая функция

Когда вы используете @(r), вы генерируете function_handle, который не является частью символической панели инструментов:

>> Thrust_fcn = @(r) 5 * exp(-2*r);
>> whos Thrust_fcn
  Name            Size            Bytes  Class              Attributes
  Thrust_fcn      1x1                32  function_handle  

Вместо этого попробуйте создать *Сначала 1008 * и выполнение Thrust_fcn с использованием sym r

>> syms r;
>> Thrust_fcn = 5 * exp(-2*r); %%% Not using @(r)! %%%

>> whos Thrust_fcn
  Name            Size            Bytes  Class    Attributes
  Thrust_fcn      1x1                 8  sym   

Теперь, когда Thrust_fcn является sym, попробуйте вызвать diff(Thrust_fcn, r)

Вызов функции MuPAD (в MATLAB)

Если вы хотите продолжить использовать дескриптор функции, вы можете использовать функциональность MuPAD, оставаясь в редакторе MATLAB. Эта страница документации MathWorks объясняет несколько способов использования функций MuPAD, но я приведу рабочий пример:

% Notice that 'syms r' is never called.
% You may want to ensure your previous variable 'r' has been cleared first.
clear r;

Thrust_fcn = @(r) 5 * exp(-2*r);
feval(symengine,'diff',Thrust_fcn,'r')

Это действует так же, как если бы вы определяли функциюв MuPAD и вызовите diff на Thrust_fcn с вводом 'r'.

...