#wolfram-mathematica
#wolfram-mathematica
Вопрос:
У меня есть выражение Mathematica, которое содержит один квадратный корень, схематично
expr = a / (b Sqrt[c]);
где a
, b
, c
— большие выражения. Я хотел бы извлечь выражение в sqrt, например, путем сопоставления с шаблоном, что-то вроде
Match[expr,Sqrt[x_]] // should return c
Есть ли простой способ сделать это?
Ответ №1:
Теоретически это должно работать правильно:
extractSqrt = Cases[ToBoxes@#, SqrtBox@x_ :> ToExpression@x, Infinity] amp;;
extractSqrt[expr]
Ответ №2:
Если вы хотите изменить присвоение на expr
, вы можете сделать это:
expr = Hold[a / (b Sqrt[c])];
Cases[expr, HoldPattern @ Sqrt[x_] :> x, Infinity]
Hold
в инструкции присваивания не позволяет Mathematica применять какие-либо упрощения к выражению. В этом случае Sqrt[c]
«упрощается» в Power[c,Rational[1,2]]
.
HoldPattern
В Cases
выражении важно, чтобы подобное упрощение не происходило с сопоставляемым шаблоном.
Ответ №3:
Я жду несколько примеров, а пока попробуйте:
Cases[expr, x_^(1/2 | -1/2) :> x, Infinity]
Стандартная внутренняя форма для Sqrt(x) является Power[x, 1/2]
.
Комментарии:
1. @Sjoerd Я предполагаю, что in терпит неудачу во множестве случаев. :-/
2. @Sjoerd Я внес изменения, чтобы отслеживать больше случаев.
3. @Sjoerd, пожалуйста, посмотрите мой другой ответ. У меня нет времени на его тестирование, но я думаю, что это решение. Пожалуйста, оставьте комментарий, если есть очевидный сбой.
4. @Mr.Wizard Ну, конечно, есть тривиальный случай a = 0… % ^) Также не обязательно думать о a /(b Hold[Sqrt[c]]), не так ли? (просто шучу). В остальном, похоже, что вы его обработали.
5. @yoda В исходном шаблоне не было отрицательного показателя, и a /(0 Sqrt[c]) кодируется как Times[a, Power[c, Rational[-1,2]]]. Ваш 2-й пример завершается неудачей, потому что бесконечность означает уровни от 1 до бесконечности, тогда как c находится на уровне 0. Вместо этого используйте {0, бесконечность}. В b c b и c находятся на уровне 1, потому что они находятся в Plus[b, c]. Следовательно, это работает в этом случае.