Kann Differential in Mathematica nicht auswerten

  • Ich habe ein kleines Spielzeugskript in Mathematica, mit dem ich die PDF-Datei von $ Y $ auswerten möchte, wobei $ Y = X ^ 2 $ gilt und $ X $ in $ [$] gleichmäßig verteilt ist. 0, a] $.

    Das Skript lautet

     assum = {a > 0}; 
    Subscript[P, X][x_] := If[Inequality[0, Less, x, LessEqual, a], 1/a, 0];
    
    Y[x_] := x^2
    
    Subscript[F, Y][y_] := Integrate[If[Y[x] <= y, 1, 0]*Subscript[P, X][x], 
       {x, -Infinity, Infinity}]
    
    Subscript[P, Y][y_] := D[Subscript[F, Y][y], y]
     

    Zeigt die korrekte Form des PDFs an:

     In[192]:=
    Simplify[Subscript[P, Y][y], assum]
    
    Out[192]=
    Piecewise[{{1/(2*a*Sqrt[y]), y > 0 && a^2 >= y}}, 0]
     

    Der Ausdruck wird jedoch nicht richtig ausgewertet :

     In[194]:=
    Simplify[Subscript[P, Y][a*(a/2)], assum]
    
    During evaluation of In[194]:= General::ivar:a^2/2 is not a valid variable. >>
    
    Out[194]=
    D[1/Sqrt[2], a^2/2]
     

    Die Sitzung sieht im hübschen Drucken folgendermaßen aus:

    Kann Differential in Mathematica nicht auswerten

    20 March 2012
    highBandWidth
2 answers
  • $ P [y] $ ist definiert als $ \ partial_yF [y] $. Wenn Sie jetzt beispielsweise $ P [2] $ aufrufen, wird dies in $ \ partial_2F [2] $ übersetzt, was natürlich keinen Sinn macht.

    Ein Weg zu Umgehen Sie dieses Verhalten nicht mit Ableitung in Bezug auf y, sondern in Bezug auf das erste Argument. Im folgenden Beispiel wird f [y] als Ableitung von g [y] zugewiesen:

     g[y_] := y^2
    f[y_] := Derivative[1][g][y]
    f[x]
     
     2 x
     

    Anstelle von Derivative[1][g][y] hätten Sie auch die Kurzschreibweise g'[y] verwenden können. Lesen Sie die explizite Langversion, die ich als Operator verwendet habe, auf mehrere Dinge angewendet: Derivative[1] nimmt eine Funktion und berechnet ihre erste Ableitung in Bezug auf das erste Argument. Derivative[1][g] ist diese Ableitung (als reine Funktion) und Derivative[1][g][y] ist die reine Funktion, die auf einen Wert y angewendet wird.

    Das obige Skript hat jedoch ein Problem: Bei jedem Aufruf von f [x] wird die Ableitung neu berechnet. Dies kann einige Zeit in Anspruch nehmen, wenn Ihre Funktion komplizierter ist und Sie viele Datenpunkte benötigen. Wenn Sie Funktionen anstelle von Mustern verwenden (dh :=), können Sie dieses Problem auch umgehen:

     g = #^2 &
    f = g'
    f[x]
     
     #1^2 &
    2 #1 &
    2 x
     
    20 March 2012
    svec
  • Oder Sie behalten Ihren Code einfach so (mit SetDelayed), aber erzwingen, dass die Ableitung bei der Definition ausgeführt wird, indem Sie Evaluate verwenden:

     Subscript[P, Y][y_] := Evaluate[D[Subscript[F, Y][y], y]]
     

    Damit erhalten Sie das richtige Ergebnis:

     In[107]:= Simplify[Subscript[P, Y][a*(a/2)], assum]
    Out[107]= 1/(Sqrt[2] a^2)
     

    Dies wäre der robusteste Weg, dies zu tun (zumindest ist dies die Hilfe von Mathematica 8).

    10 June 2012
    ageektrappedJanci