Estoy buscando una utilidad que tome una expresión y extraiga todas las variables en esa expresión. Tras cinco ejemplos cubren casi todos mis patrones variablesUtilidad para extraer variables de una expresión
a,Subscript[a,....],Subscript[a,...][...],a[...],a[...][...]
Aquí hay dos casos de prueba.
expr1 = -Log[Subscript[\[Mu], 2][]] Subscript[\[Mu], 2][] -
Log[Subscript[\[Mu], 2][2]] Subscript[\[Mu], 2][2] +
Log[Subscript[\[Beta], 1, 2][]] Subscript[\[Beta], 1, 2][] +
Log[2] Subscript[\[Beta], 1, 2][1] +
Log[Subscript[\[Beta], 1, 2][1]] Subscript[\[Beta], 1, 2][1] +
Log[2] Subscript[\[Beta], 1, 2][2] +
Log[Subscript[\[Beta], 1, 2][2]] Subscript[\[Beta], 1, 2][2] +
Log[Subscript[\[Beta], 2, 3][]] Subscript[\[Beta], 2, 3][] +
Log[Subscript[\[Beta], 2, 3][2]] Subscript[\[Beta], 2, 3][2] +
Log[2] Subscript[\[Beta], 2, 3][3] +
Log[Subscript[\[Beta], 2, 3][3]] Subscript[\[Beta], 2, 3][3];
expr2 = Log[\[Beta][{1, 2}][{}]] \[Beta][{1, 2}][{}] +
Log[2] \[Beta][{1, 2}][{1}] +
Log[\[Beta][{1, 2}][{1}]] \[Beta][{1, 2}][{1}] +
Log[2] \[Beta][{1, 2}][{2}] +
Log[\[Beta][{1, 2}][{2}]] \[Beta][{1, 2}][{2}] +
Log[\[Beta][{2, 3}][{}]] \[Beta][{2, 3}][{}] +
Log[\[Beta][{2, 3}][{2}]] \[Beta][{2, 3}][{2}] +
Log[2] \[Beta][{2, 3}][{3}] +
Log[\[Beta][{2, 3}][{3}]] \[Beta][{2, 3}][{3}] -
Log[\[Mu][{2}][{}]] \[Mu][{2}][{}] -
Log[\[Mu][{2}][{2}]] \[Mu][{2}][{2}]
On[Assert];
Assert[[email protected]@expr1 === Union[Variables[expr1][[9 ;;]]]]
Assert[[email protected]@expr2 === Union[Variables[expr2][[9 ;;]]]]
Aquí está la solución de MrWizard
extractVariables[formula_] := (
pat = _Symbol[___][___] | Subscript[_Symbol, __][___] | Subscript[_Symbol, __] | _Symbol;
[email protected][formula, pat, -1]
);
Gracias. Agregué una pequeña edición en la respuesta para que pase mis casos de prueba –
@Daniel Lichtblau - En lo que respecta a su anécdota, este es uno de los principales obstáculos con los que lucho con frecuencia en MMA. Me gustaría que hubiera alguna guía sobre cómo definir modelos generales, donde las variables pueden ser endógenas o exógenas. Ej .: ¿Cuál es el "mejor" enfoque para declarar una variable como un parámetro exógeno? ¿Usando la constante de atributo? ¿O simplemente meter todo en Suposiciones (global o localmente) y luego confiar en Simplificar, etc.? El enfoque basado en atributos es fácil, pero incompleto, ya que también deseo aplicar los atributos relacionados con el tipo y el rango, un no ir en MMA. – telefunkenvf14