旧版MATLAB中的符号导数抛出错误

时间:2018-10-18 20:46:57

标签: matlab symbolic-math backwards-compatibility

我有这个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

我已经在2018a上检查了sym/diff函数的代码,并且完全不同,它大约是300行代码。

关于如何使它起作用的任何想法?非常感谢!

1 个答案:

答案 0 :(得分:2)

符号功能

使用@(r)时,将生成function_handle,它不属于Symbolic工具箱:

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

相反,请先尝试创建r,然后使用符号Thrust_fcn制作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是一个符号,请尝试调用diff(Thrust_fcn, r)

调用MuPAD的函数(在MATLAB中)

如果您想继续使用函数句柄,则可以使用MuPAD的功能,同时保留在MATLAB编辑器中。 This MathWorks Documentation page解释了使用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中定义一个函数并用输入diffThrust_fcn上调用'r'的方式相同。