【问题标题】:Mathematica code: Derivative of Abs[x]Mathematica 代码:Abs[x] 的导数
【发布时间】:2011-06-13 13:28:35
【问题描述】:

关闭者注意事项:这是关于编程语言 (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]
*)

?

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

【问题讨论】:

  • 我的错,我读的是“数学”。无视我。
  • @Leke 别介意,这是一个常见的错误。但元社区拒绝将标签名称更改为更具描述性的名称。
  • yes Abs'[x] 不进行数值计算;我过去也注意到了这一点。我也想知道为什么。
  • @acl 这会影响使用Abs[ ]的其他函数,例如EuclideanDistance

标签: wolfram-mathematica


【解决方案1】:

Abs[z] 不是holomorphic function,因此它的导数在复平面上没有很好地定义(Mathematica 使用的默认域)。这与 Sin[z] 等不同,后者的复数导数(即相对于它的参数)总是被定义。

更简单地说,Abs[z] 依赖于zz*,所以应该被认为是一个双参数函数。 Sin[z] 仅依赖于 z,因此使用单个参数就有意义。

正如Leonid 所指出的,一旦你将域限制为实数,那么导数就会得到很好的定义(可能在x=0 除外,他们取了左右导数的平均值)

In[1]:= FullSimplify[Abs'[x],x \[Element] Reals]
Out[1]= Sign[x]

正如Szabolcs(在评论中)所指出的,FunctionExpand 将简化数值表达式,但“FunctionExpand 使用的某些转换仅在一般情况下有效”。

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

【讨论】:

  • 所以,这就是原因。谢谢!
  • 但是不评估 Abs'[.42] 的原因是什么?我不相信你所说的可以证明它是正确的(尽管它当然是真的)
  • @acl:我认为是因为Abs'[.42] = Limit[(Abs[z+.42] - Abs[.42])/z, z->0] 和限制在所有复杂方向上都不相同。将路径z[t_] := 1-Exp[I t] 视为t->0z[t]->0,并且该方向的极限/导数始终为零。 (这基本上是在重申我的回答……哦,好吧)
  • 谢谢。我意识到Abs[x] 不是解析的,因为显然不能满足 Cauchy-Riemann 条件。我的评论是基于相信如果在 Abs 以外的函数中使用实数作为参数,mma 会假装只存在实数行,所以这将是不一致的。但是我刚刚尝试了Re'[.42] 等等,它们也仍未被评估(虽然我以为我记得它被评估为 1),所以我想我只是记得别的东西......
【解决方案2】:

我建议您参考this 线程可能相关 - 这个问题之前已经讨论过。总结一下我的回答,Abs 通常是在复数上定义的。一旦你指定你的论点是真实的,它就会起作用:

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

 Out[1]= Sign[x] 

【讨论】:

  • @Leonid 但正如您在该线程中指出的那样,它不适用于特定的真实参数。例如, Abs'[.23] 不计算,而 IntegerPart'[.23] 计算。不是很一致,除非我遗漏了什么。
  • @belisarius 哦,我明白了,您主要是在询问数字。对不起,我没有仔细阅读你的问题。有趣的是,虽然FunctionExpand 似乎总是有效,但FullSimplify 适用于整数而不是实数。
  • @acl 是的,我同意,对我来说看起来不太一致。我可以理解,可能不希望自动评估符号或整数参数,但一旦它们是真实的或应用N,它应该给出一个数字答案。
  • @Leonid:即使有特定的实数值,导数也没有很好的定义。该值仅定义您检查导数的点,而不是方向。 FunctionExpand 似乎在对域做出(几乎合理的)假设。
  • @Leonid:我认为这是正在发生的事情,因为几乎在其他任何地方,Mma 都假设复杂的变量。而且我同意,也许更复杂的功能或更改默认域的能力会很好,但那会与功率/速度/一致性进行权衡吗?
【解决方案3】:

您可以使用FunctionExpand 强制获取一个数字作为结果,即使您使用的是精确数量:

Abs'[Pi/4] // FunctionExpand
Abs'[-1] // FunctionExpand

我不知道以下原因:

In:= Abs'[0] // FunctionExpand
Out= 0

【讨论】:

  • @Szabolcs 谢谢。你知道为什么这是必要的吗?我的意思是……为什么 Mma 不像往常一样评估这个?
  • +1,不知道 FunctionExpand!很好奇为什么 IntegerPart'[x] 计算数字 x 但 Abs'[x] 却没有。
  • 最后一位可能是由于约定(严格来说该值未定义,因为导数不存在)。
  • @Szabolcs 为什么您认为第二个答案有问题?这与Sign[x]的定义是一致的,只要我们同意Abs'[x] == Sign[x]是真正的x
  • @Leonid,原因是@rubenvb 所说的。它在数学上并不精确。 也许这就是它没有被自动评估的原因,@belisarius。在“可能的问题”下,文档页面显示:“FunctionExpand 使用的某些转换仅在一般情况下有效。” Leonid 是正确的,因为Abs'[x] 被扩展为Sign[x],所以出现了“不精确”的结果:FunctionExpand[Abs'[x], Assumptions -> x \[Element] Reals]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-14
  • 1970-01-01
  • 2011-09-07
相关资源
最近更新 更多