符号导数在旧版本的 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
我有这个使用符号函数进行某些操作的 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