我有这个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行代码。
关于如何使它起作用的任何想法?非常感谢!
答案 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编辑器中。 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中定义一个函数并用输入diff
在Thrust_fcn
上调用'r'
的方式相同。