Функции преобразования, принимающие числовые значения

#wolfram-mathematica

#wolfram-mathematica

Вопрос:

Я хочу изменить форму выражений, таких как

 r^{-1-n} a^n
  

объединение полномочий в Mathematica для получения

 [(a/r)^n] / r.
  

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

 PowerReduce[Times[Power[a_, -1 - b_], Power[c_, b_]]] := Power[a, -1] Power[c/a, b]
  

который работает на примерах, подобных этому

 Simplify[Power[r, -1 - n] Power[a, n], TransformationFunctions -> PowerReduce]
  

но терпит неудачу, если я использую числовые значения, скажем r=2 :

 Simplify[ Power[2, -1 - n] Power[a, n], TransformationFunctions -> PowerReduce]
  

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

 MultAllVals[Power[a_, b_]] := a b
Simplify[ Power[2, -1 - n] Power[a, n], TransformationFunctions -> MultAllVals]
  

Как я могу заставить Mathematica сгруппировать степени n вместе в одну степень [ ] ?

Ответ №1:

Проблема на самом деле заключается в автоматических упрощениях, и с ними трудно бороться. В ряде случаев Mathematica преобразует входные данные в эквивалентную форму, которую считает более простой, автоматически, не спрашивая пользователя и не требуя использования каких Simplify -либо функций семейства. Было ли такое упрощение правильным выбором дизайна, зависит от мнения. В некоторых случаях они весьма полезны, но отменить такие упрощения сложно.

В вашем конкретном случае рассмотрите:

 In[55]:= (a/2)^n/2
Out[55]= 2^(-1-n) a^n
  

Итак, ваш конкретный случай обречен, независимо от того, действительно ли работает ваше преобразование. На самом деле это так, что вы можете легко проверить, включив некоторый Print оператор в r.h.s . of PowerReduce . Один из выходов — определить свои собственные функции, такие как times , power , и т.д., и позволить им распадаться на Times , Power , и т.д. в какой-то момент / в некоторых случаях. Однако при таком подходе вы сразу же теряете главное преимущество Simplify etc со встроенными функциями, такими как Times and Power , а именно огромную и проверенную встроенную базу правил, связывающую эти функции. Возможно, можно разработать какой-то гибридный подход, который будет использовать оба в разных частях выражения для упрощения, но это, по-видимому, связано с конкретной проблемой.

Комментарии:

1. Спасибо за такой исчерпывающий ответ.

2. Мое личное автоматическое упрощение 1 i становится Complex[1,1] внутренним. Это особенно расстраивает, если это часть большего уравнения, в котором вы хотите разделить действительную и мнимую части. Но с этим можно справиться, применив #/. Complex[a_,b_]:> a q b , упростив и изменив преобразование.

3. @Leonid, кстати, еще ~ 9 голосов за первый золотой значок Mathematica!

4. @rcollyer Действительно! Но велисарий может сделать это раньше, и это будет правильно.

5. @Leonid, возможно, более правильно. Вероятно, (55 голосов против 9 ответов) не совсем.