Erzwingen Sie eine Funktion, um Annahmen über ihre Eingabevariablen in Mathematica zu treffen

  • Ich versuche, eine Mathematica-Funktion zu zwingen, eine Annahme über ihre Eingangsvariablen zu treffen. In meinem Fall versuche ich, eine Funktion zu definieren, um das PDF eines Gaußschen zurückzugeben. Aber verwenden wir einen einfachen Spielzeugkoffer:

     n[x_]:= x^(1/2);
     

    Somit gibt n [x]

    <| zurück >
     Sqrt[x]
     

    Allerdings gibt n [x ^ 2]

     Sqrt[x^2]
      
     
     

    Obwohl dies prinzipiell richtig und in Ordnung ist, werden in meinem Fall einige der Variablen (wie Varianz) immer positiv und immer real sein, daher die Vereinfachung

     n[x^2] = x
     

    ist angemessen. Ich habe viele Dinge ausprobiert:

     n[x_/; x > 0 && Element[x,Reals]]:=x^(1/2);
    n[x_]:=Assuming[x > 0 && Element[x,Reals],FullSimplify[x^(1/2)]];
     

    etc. Das Beste, was ich tun kann, ist

     n[x^2] = Abs[x]; 
     

    Wann ich will

     n[x^2] = x;
     

    Hat jemand einen Rat, wie das geht?

    09 April 2012
    rcollyer
3 answers
  • Um es festzuhalten, gibt es einen einfachen Ansatz. Sie können Ihre Funktion etwas anders definieren:

     n[x_] := PowerExpand[x^(1/2)]
     

    . Dies setzt voraus, dass x ist real und positiv und ergibt:

     n[x^2]
     

    x

    < / blockquote>

    Alternativ können Sie Folgendes beibehalten:

     n[x_] := x^(1/2)
     

    Aber in Berechnungen Wenn eine wirklich positive Annahme auf x erforderlich ist, verwenden Sie

     PowerExpand[n[x^2]]
     

    x

    Die Funktion PowerExpand nimmt die Option Assumptions, mit der Sie einige nette Dinge erledigen können:

     PowerExpand[Sqrt[z^2], Assumptions -> z < 0]
     

    -z

    oder mit Annahmen- & gt; Richtig, PowerExpand ergibt eine allgemein korrekte Erweiterungsformel:

     PowerExpand[Sqrt[z^2], Assumptions -> True]
     

    E ^ (I [Pi] Floor [1/2 - Arg [z] / [Pi]]) z

    Lesen Sie sorgfältig Dokumentationsartikel - insbesondere t Beispiele und "Weitere Informationen" :

    09 April 2012
    Chris Jester-Young
  • Hier ist eine Funktion, die davon ausgeht, dass jedes Symbol in dem Ausdruck, das an sie übergeben wird und das als Nicht-Kopf verwendet wird, positiv ist. Beachten Sie jedoch, dass dies möglicherweise nicht immer das ist, was Sie möchten.

     n[x_]:=Assuming[And@@(#>0&/@Union@Cases[x,_Symbol,Infinity]),Simplify[x^(1/2)]]
     

    Mit dieser Definition erhalten Sie

     n[a^2]
    (*
    ==> a
    *)
     

    Dies funktioniert wie folgt:

    Cases[x,_Symbol,Infinity] gibt eine Liste an aller Symbole in dem Ausdruck, der durch x geleitet wurde, ignorieren Köpfe (so Cases[Sin[omega*t],_Symbol,Infinity] gibt {omega,t}, nicht {Sin,Times,omega,t}). Wenn Sie Union auf das Ergebnis anwenden, müssen Sie nur Duplikate löschen (streng genommen ist dies nicht erforderlich). Durch Abbilden von #>0& über diese Liste erhalten Sie eine Liste von Bedingungen symbol > 0, auf die wir nur And anwenden müssen, um die endgültige Bedingung zu erhalten.

    Die Der Rest der Funktionsdefinition ist unkompliziert.

    12 April 2012
    celtschk
  • Sie wissen wahrscheinlich über diese Bescheid:

     x=.;
    F:=PDF[NormalDistribution[0, 1], x]
    
    F:=PDF@NormalDistribution[0, 1]
     

    |>

     F[x_?NonNegative] := x^(1/2)
     
    09 April 2012
    image_doctor