Код Mathematica: Производные Abs [x]

Примечание для закрывающих устройств. Это вопрос о языке программирования ( 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]
*)

?

И какой лучший способ заставить численный результат?

Ответ 1

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]

Как указано в Szabolcs (в комментарии), FunctionExpand упростит числовые выражения, но "Некоторые преобразования, используемые FunctionExpand, являются только общеприменимыми".

ComplexExpand также дает числовые результаты, но я не верю в это. Кажется, что взять производную, предполагая, что Abs находится в реальной области, затем заменяет числовые/сложные аргументы. Тем не менее, если вы знаете, что все, что вы делаете, находится в реале, тогда ComplexExpand является вашим другом.

Ответ 2

Вы можете использовать FunctionExpand для принудительного получения числа в результате, даже если вы используете точные величины:

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

Я не знаю причину следующего:

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

Ответ 3

Я отсылаю вас к этой теме как возможно актуальной - эта проблема обсуждалась ранее. Чтобы суммировать мой ответ, Abs определяется обычно на комплексных числах. Как только вы укажете, что ваш аргумент реален, он работает:

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

 Out[1]= Sign[x]