关闭闭门器的注意事项:这是关于编程语言(Mathematica)的问题,而不是关于学科/科学(数学)的问题。
为什么
N[D[Sin[x], x] /. x -> Pi/4]
(*
Out -> 0.707107
*)
但
N[D[Abs[x], x] /. x -> Pi/4]
(*
Out -> Derivative[1][Abs][0.785398]
*)
强制数字结果的更好方法是什么?
答案 0 :(得分:11)
Abs[z]
不是holomorphic function,因此其衍生物在复杂平面(Mathematica使用的默认域)上没有明确定义。这与例如Sin[z]
不同,后者的复数导数(即,与其论证有关)总是被定义。
更简单地说,Abs[z]
取决于z
和z*
,因此应该将其视为两个参数函数。 Sin[z]
仅取决于z
,因此只需一个参数即可。
正如Leonid所指出的那样,一旦你将域限制为实数,那么导数就会被很好地定义(除了可能在x=0
,他们已经取得了左右的平均值衍生物)
In[1]:= FullSimplify[Abs'[x],x \[Element] Reals]
Out[1]= Sign[x]
正如Szabolcs所述(在评论中),FunctionExpand
将简化数值表达式,但“FunctionExpand使用的某些转换只是一般有效”。
ComplexExpand
也会给出数值结果,但我不相信它。似乎采用导数假设Abs
在真实域中,然后在数字/复杂参数中替换。也就是说,如果你知道你所做的一切都是真的,那么ComplexExpand
就是你的朋友。
答案 1 :(得分:8)
我建议您将this线程视为可能相关 - 此问题已在之前讨论过。为了总结我的答案,Abs通常用复数来定义。一旦你指定你的论证是真实的,它就有效:
In[1]:= FullSimplify[Abs'[x], Assumptions -> {Element[x, Reals]}]
Out[1]= Sign[x]
答案 2 :(得分:7)
即使您使用的是精确数量,也可以使用FunctionExpand
强制获取数字:
Abs'[Pi/4] // FunctionExpand
Abs'[-1] // FunctionExpand
我不知道以下原因:
In:= Abs'[0] // FunctionExpand
Out= 0