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]同时依赖于z和z*,所以应该被看作是一个双参数函数.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就是你的朋友.
我推荐你这个线程可能相关 - 这个问题之前已经讨论过了.为了总结我的答案,Abs通常用复数来定义.一旦你指定你的论证是真实的,它就有效:
In[1]:= FullSimplify[Abs'[x], Assumptions -> {Element[x, Reals]}]
Out[1]= Sign[x]
Run Code Online (Sandbox Code Playgroud)
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)