#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 ответов) не совсем.