Извлечение выражения, соответствующего шаблону, из большого выражения - PullRequest
9 голосов
/ 16 апреля 2011

У меня есть выражение Mathematica, которое содержит один квадратный корень, схематически

expr = a / (b + Sqrt[c]);

, где a, b, c - большие выражения.Я хотел бы извлечь выражение из sqrt, например, путем сопоставления с шаблоном, что-то вроде

Match[expr,Sqrt[x_]] // should return c

Есть ли простой способ сделать это?

Ответы [ 3 ]

12 голосов
/ 16 апреля 2011

Теоретически, это должно работать правильно:

extractSqrt = Cases[ToBoxes@#, SqrtBox@x_ :> ToExpression@x, Infinity] &;

extractSqrt[expr]
5 голосов
/ 16 апреля 2011

Если вы хотите изменить назначение на expr, вы можете сделать это:

expr = Hold[a / (b + Sqrt[c])];

Cases[expr, HoldPattern @ Sqrt[x_] :> x, Infinity]

Hold в операторе присваивания не позволяет Mathematica применять какие-либо упрощения к выражению. В этом случае Sqrt[c] становится «упрощенным» в Power[c,Rational[1,2]].

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * В выражении Cases необходимо указать HoldPattern, чтобы предотвратить совпадение с сопоставляемым шаблоном.

3 голосов
/ 16 апреля 2011

Я жду несколько примеров, но пока попробуйте:

Cases[expr, x_^(1/2 | -1/2) :> x, Infinity]

Стандартная внутренняя форма для Sqrt (x): Power[x, 1/2].

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