Controlar la expansión de funciones
Supongamos que tuviera las siguientes definiciones
const /: N[const] = 1 / Pi^2;
f /: N[f[x_]] := const / x^2;
g /: N[g[x_]] := Pi * Sqrt[f[x]] * x^2;
Ahora, para este ejemplo, está claro que g[x] == xpara todos los valores de x, pero supongamos que hay una razón externa para definir estas funciones de esta manera.
¿Hay alguna forma de controlar la expansión de gpara que el resultado sea en términos de f? Por ejemplo, supongamos que quisiera simplificar g[x] / f[x]sin dejar de ser fsimbólico. El uso de Ndesafortunadamente expandió todo lo que no es lo que quiero.
He intentado usarlo Inactive, pero hasta ahora mis intentos no han tenido éxito y no estoy seguro de si podría haber una mejor opción.
Respuestas
Según lo mencionado por @xzczd, una posibilidad que puede funcionar en algunas condiciones es de uso Inactivateque funciona muy bien cuando hay ciertos términos explícitos que no necesitan ser ampliados, pero no funciona demasiado bien con los términos implícitos (como fdentro g, ya que no está inactivo). Es posible usarlo Block[{f = Inactive[f]}, ...], pero aún requiere conocer la expansión.
Me las arreglé para encontrar otra solución (para mi caso de uso) manipulando los valores hacia arriba y hacia abajo.
Considere las siguientes definiciones básicas:
const /: N[const] = 1 / Pi^2;
f[x_?InexactNumberQ] := const / x^2;
g /: N[g[x_]] := Pi * Sqrt[f[x]] * x^2;
Attributes[ExpandValues] = {HoldAll};
ExpandValues[symbol_] := Join @@ Through[
{OwnValues, DownValues, UpValues, SubValues, DefaultValues, NValues}[symbol]
] /. {
InexactNumberQ :> (True &),
HoldPattern[N[f_, __]] :> f
}
ExpandValues[symbol_, symbols__] := Join[ExpandValues[symbol], ExpandValues[symbols]]
La definición de ExpandValuesfunción mira los valores del símbolo para crear una lista de reemplazo y el lado izquierdo de las reglas para que se puedan aplicar de manera más amplia (por ejemplo, pero reemplazando N[f[x_]]con solo f[x_]y eliminando verificaciones de números inexactos).
A continuación, se muestran algunos ejemplos de su uso:
g[x] /. ExpandValues[g]
Pi x^2 Sqrt[f[x]]
g[x] / f[x] //. ExpandValues[g]
Pi x^2 / Sqrt[f[x]]
g[x] / f[x] //. ExpandValues[g, f]
Pi Sqrt[const / x^2] x^4 / const