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

Symbolic derivatives throwing error in older versions of MATLAB

我有这个使用符号函数进行某些操作的 MATLAB 代码,当我在服务器的 2015b 版本中 运行 函数时,sym/diff 函数抛出一个非常烦人的错误。我的笔记本电脑与 2018a 运行s 相同的代码没有问题。错误特别是:

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 行的代码。

关于如何让它发挥作用的任何想法?非常感谢!

符号函数

当您使用 @(r) 时,您将生成一个 function_handle,它不是符号工具箱的一部分:

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

相反,先尝试创建 r,然后使用符号 r

创建 Thrust_fcn
>> 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 中)

如果您想继续使用函数句柄,您可以在保留在 MATLAB 编辑器中的同时使用 MuPAD 的功能。 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 中定义函数的方式相同,并使用输入 'r'.

Thrust_fcn 上调用 diff