Работа с реальными функциями в Mathematica - PullRequest
10 голосов
/ 02 декабря 2011

В общем, mathematica всегда предполагает самый общий случай, то есть, если я установлю функцию

a[s_]:={a1[s],a2[s],a3[s]}

и захочу вычислить ее норму Norm[a[s]], например, она вернет:

Sqrt[Abs[a1[s]]^2 + Abs[a2[s]]^2 + Abs[a3[s]]^2]

Однако, если я знаю, что все ai[s] реальны, я могу вызвать:

Assuming[{a1[s], a2[s], a3[s]} \[Element] Reals, Simplify[Norm[a[s]]]]

, который вернет:

Sqrt[a1[s]^2 + a2[s]^2 + a3[s]^2]

Что яОжидайте.

Проблема возникает при попытке, например, получить a[s], а затем (обратите внимание на D):

Assuming[{a1[s], a2[s], a3[s]} \[Element] Reals, Simplify[Norm[D[a[s],s]]]]

Возвращает снова результат, включающий абсолютные значения - изпредположение, что числа могут быть мнимыми.

Как решить эту проблему?Я хочу определить реальную функцию и работать с ней как таковой.То есть, например, я хочу, чтобы его производные были реальными.

Ответы [ 4 ]

7 голосов
/ 02 декабря 2011

Вместо этого я бы использовал пользовательскую функцию, например

vecNorm[vec_?VectorQ] := Sqrt[ vec.vec ]

Тогда

In[20]:= vecNorm[D[{a1[s], a2[s], a3[s]}, s]]

Out[20]= Sqrt[
Derivative[1][a1][s]^2 + Derivative[1][a2][s]^2 + 
 Derivative[1][a3][s]^2]
6 голосов
/ 02 декабря 2011

Предупреждение: У меня нет большого практического опыта с этим, поэтому примеры ниже не проходят тщательной проверки (т.е. я не знаю, могут ли слишком общие предположения нарушить то, о чем я не думал ).


Вы можете использовать $Assumptions для определения постоянных допущений:

Мы могли бы сказать, что все a1[s], a2[s], a3[s] являются действительными:

$Assumptions = {(a1[s] | a2[s] | a3[s]) \[Element] Reals}

Но если у вас есть, например, a1[x] (не a1[s]), тогда это не будет работать. Поэтому мы можем немного улучшить его, используя шаблоны:

$Assumptions = {(a1[_] | a2[_] | a3[_]) \[Element] Reals}

Или просто скажите, что все значения a[_] действительны:

$Assumptions = {a[_] \[Element] Reals}

Или даже быть смелым и сказать, что все реально:

$Assumptions = {_ \[Element] Reals}

(Интересно, что это ломает)

AppendTo полезно для добавления к $Assumptions и сохранения предыдущих предположений.

Как и Assuming, это будет работать только для таких функций, как Simplify или Integrate, которые имеют опцию Assumtpions. D это не такая функция.


Некоторые функции, такие как Reduce, FindInstance и т. Д., Имеют возможность работать только в области вещественных чисел, целых чисел и т. Д., Что предполагает, что все выражения и подвыражения, с которыми они работают, являются действительными.


ComplexExpand[] и иногда FunctionExpand[] также могут быть полезны в подобных ситуациях (но не здесь). Примеры: ComplexExpand[Abs[z]^2, TargetFunctions -> {Sign}] и FunctionExpand[Abs'[x], Assumptions -> {x \[Element] Reals}].


Обычно , насколько я знаю, математического способа не сказать Mathematica о том, что переменная реальна. Это возможно сделать только формально, с использованием шаблонов и только для определенных функций, которые имеют опцию Assumptions. Под «формальным» я подразумеваю, что если вы скажете ему, что a[x] реально, оно не будет автоматически знать, что a'[x] также реально.

2 голосов
/ 03 декабря 2011

Для более старых версий Mathematica существовал дополнительный пакет RealOnly, который переводил Mathematica в режим только для реального использования. Существует версия, доступная в более поздних версиях и онлайн с минимальными обновлениями совместимости. Он сводит многие ситуации к реальным решениям, но не работает для вашего Norm случая:

enter image description here

2 голосов
/ 02 декабря 2011

Вы можете использовать ComplexExpand в этом случае, хотя и с обходным решением. Например

ComplexExpand[Norm[a'[s], t]] /. t -> 2

возвращает

Sqrt[Derivative[1][a1][s]^2 + Derivative[1][a2][s]^2 + Derivative[1][a3][s]^2]

Обратите внимание, что выполнение чего-то вроде ComplexExpand[Norm[a'[s], 2]] (или даже ComplexExpand[Norm[a'[s], p]], где p - рациональное число) по какой-то причине не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...