在 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.
您可以 通过使用 rewrite
和 simplify
.
从 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
谁能解释为什么在 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.
您可以 通过使用 rewrite
和 simplify
.
% 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