Извлечение выражения, соответствующего шаблону, из большого выражения

#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]. Следовательно, это работает в этом случае.