Mathematica代码:Abs的衍生物[x]

Dr.*_*ius 11 wolfram-mathematica

闭门器的注意事项:这是关于编程语言(Mathematica)的问题,而不是关于学科/科学(数学)的问题.

为什么是

N[D[Sin[x], x] /. x -> Pi/4]
(*
Out -> 0.707107
*)
Run Code Online (Sandbox Code Playgroud)

N[D[Abs[x], x] /. x -> Pi/4]
(*
Out -> Derivative[1][Abs][0.785398]
*)
Run Code Online (Sandbox Code Playgroud)

强制数值结果的更好方法是什么?

Sim*_*mon 11

Abs[z]不是一个全纯函数,因此它的导数在复平面上没有很好地定义(Mathematica使用的默认域).这与例如Sin[z]其复数导数(即,关于其参数)总是被定义的对比.

更简单地说,Abs[z]同时依赖于zz*,所以应该被看作是一个双参数函数.Sin[z]只依赖于z,所以用一个论证是有道理的.

正如Leonid所指出的那样,一旦你将域名限制为实数,那么衍生物就会被很好地定义(除非x=0他们采用了左右导数的平均值)

In[1]:= FullSimplify[Abs'[x],x \[Element] Reals]
Out[1]= Sign[x]
Run Code Online (Sandbox Code Playgroud)

正如Szabolcs(在评论中)所指出的,FunctionExpand将简化数值表达式,但"FunctionExpand使用的某些转换只是一般有效".

ComplexExpand也给出了数字结果,但我不相信它.它似乎采用导数假设Abs它在真实域中,然后在数字/复杂参数中替换.也就是说,如果你知道你所做的一切都是在实物中,那么ComplexExpand就是你的朋友.


Leo*_*rin 8

我推荐你这个线程可能相关 - 这个问题之前已经讨论过了.为了总结我的答案,Abs通常用复数来定义.一旦你指定你的论证是真实的,它就有效:

 In[1]:= FullSimplify[Abs'[x], Assumptions -> {Element[x, Reals]}] 

 Out[1]= Sign[x] 
Run Code Online (Sandbox Code Playgroud)

  • @Leonid:即使有特定的实际值,衍生品也没有明确定义.该值仅定义检查导数的点,而不是方向.`FunctionExpand`似乎正在对域进行(几乎合理的)假设. (2认同)

Sza*_*lcs 7

FunctionExpand即使您使用的是精确数量,也可以使用强制获取数字:

Abs'[Pi/4] // FunctionExpand
Abs'[-1] // FunctionExpand
Run Code Online (Sandbox Code Playgroud)

我不知道以下原因:

In:= Abs'[0] // FunctionExpand
Out= 0
Run Code Online (Sandbox Code Playgroud)