Funktionserweiterung steuern

Sep 08 2020

Angenommen, ich hätte die folgenden Definitionen

const /: N[const] = 1 / Pi^2;
f /: N[f[x_]] := const / x^2;
g /: N[g[x_]] := Pi * Sqrt[f[x]] * x^2;

In diesem Beispiel ist klar, dass g[x] == xfür alle Werte von x, aber nehmen wir an, es gibt einen externen Grund, diese Funktionen auf diese Weise zu definieren.

Gibt es eine Möglichkeit, die Expansion von gso zu steuern , dass das Ergebnis in Bezug auf ist f? Angenommen, ich wollte vereinfachen und g[x] / f[x]dabei fsymbolisch bleiben . Die Verwendung von Nleider erweitert alles, was nicht das ist, was ich will.

Ich habe es versucht Inactive, aber bisher waren meine Versuche nicht erfolgreich und ich bin mir nicht sicher, ob es eine bessere Option geben könnte.

Antworten

2 JP-Ellis Sep 15 2020 at 15:17

Wie durch @xzczd erwähnt, besteht eine Möglichkeit , dass unter bestimmten Bedingungen arbeiten können , zu verwenden ist , Inactivatedie sehr gut funktioniert , wenn es bestimmte explizite Begriffe , die erweitert werden müssen , nicht, aber es funktioniert nicht schrecklich gut mit impliziten Bedingungen (wie fin , gwie es ist nicht inaktiviert). Es ist möglich zu verwenden Block[{f = Inactive[f]}, ...], aber es erfordert immer noch die Kenntnis der Erweiterung.

Ich habe es geschafft, eine andere Lösung (für meinen Anwendungsfall) zu finden, indem ich die Auf- und Ab-Werte manipuliert habe.

Betrachten Sie die folgenden Basisdefinitionen:

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]]

Bei der Definition der ExpandValuesFunktion werden die Werte des Symbols betrachtet, um eine Liste der Ersetzungen zu erstellen, sowie die linke Seite der Regeln, damit sie breiter angewendet werden können (z. B. Ersetzen N[f[x_]]durch gerechte f[x_]und Entfernen von Überprüfungen auf ungenaue Zahlen).

Hier sind einige Beispiele für die Verwendung:

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