在 MATLAB 中求余切导数时出现意外结果

Unexpected result when taking derivative of cotangent in MATLAB

谁能解释为什么在 MATLAB 中求余切函数 (cot) 的导数会产生与 wolframalpha 不同的结果?

这是我在 MATLAB 中的代码(结果已注释):

syms v d z
F = v + d*(cot(z));
R_v = diff(F,v)     % = 1
R_z = diff(F,z)     % = -d*(cot(z)^2 + 1) 
R_d = diff(F,d)     % = cot(z)

这是 wolframalpha 中的结果:

虽然第一个和最后一个结果都很好,但第二个我不明白。据我所知,余切导数是:

谁能解开我的困惑?

我正在使用 MATLAB R2017a。

MATLAB和理论解是等价的

Matlab 给你这个:

d/dz( cot(z) ) = -( cot(z)^2 + 1 )

让我们从那里开始工作...

= -( 1/tan(z)^2 + 1 )                     % By definition cot(z)=1/tan(z)
= -( cos(z)^2 / sin(z)^2 + 1 )            % Using tan(z) = sin(z)/cos(z)
= -( (1 - sin(z)^2) / sin(z)^2 + 1 )      % Using cos(z)^2 + sin(z)^2 = 1
= -( 1/sin(z)^2 - sin(z)^2/sin(z)^2 + 1 ) % Expanding the fraction
= -( 1/sin(z)^2 - 1 + 1 )                 % Simplifying
= -1/sin(z)^2                             % Expected result!

因此正如您最后所说,MATLAB 结果完全符合理论预期。 d 在偏导数中被视为常数,因此保留为系数。

如果您不喜欢手动计算,您可以让 MATLAB 为您检查等价性...

simplify( R_z - (-d/sin(z)^2) ) % = 0, so they are the same.

可以 通过使用 rewritesimplify.

从 MATLAB 获得预期的形式
 % rewrite the result R_z  in terms in the SIN function
 simplify(rewrite( R_z, 'sin' ) )
 % >> ans = -d/sin(z)^2

但是请注意,这并没有明确定义。来自 simplify docs

Simplification of mathematical expression is not a clearly defined subject. There is no universal idea as to which form of an expression is simplest.

您最好使用上面显示的 simplify(...) = 0 方法,然后根据需要将所需结果打印到屏幕上。如果您不输出结果字符串,则表达式的形式无关紧要,您可以继续前进!


至于wolframalpha,我cannot reproduce你的问题...

但是,您可以再次注意到,您显示的第一个结果是等效的:

% Your result from wolfram alpha
syms x
diff(cot(x), x)
% = - cot(x)^2 - 1
% = - ( cot(x)^2 + 1 ) 
% This is the same as the MATLAB result, same reasoning follows