2017-05-01 3 views
0

Als SymPy Neuling, Ich betrachte den folgenden SymPy Ausdruck (die auf 1, wenn 0<x<1 gleich sein sollen):SymPy Funktion mit unevaluierten Argumente

f = Sum((2/(lambda_m*besselj(1, lambda_m)))*besselj(0,x*lambda_m), (m, 1, oo)) 

wo lambda_m ist die m -te Null von besselj(0,x).

Jetzt hat mpmath eine Funktion besseljzero(0,m,0), die genau das berechnet.

Leider, wenn ich ersetzen (manuell, ich meine ...) lambda_m durch besseljzero(0,m,0) in der oberen Formel, gibt SymPy mir einen Fehler, da m nicht eine ganze Zahl ist ...

ich diese Fragen imagine Lösung von eine Funktion zu schaffen, die sollte:

  • return j0(m) wenn m wertet nicht auf eine ganze Zahl
  • return besseljzero(0,m,0) wenn ja

Aber ich weiß nicht weiter.

Ist das eine gute Idee, und kann mir jemand helfen?

Antwort

0

Das Problem ist, dass MPMath für die numerische Auswertung und in der Regel numerische Approximationen gibt, während SymPy symbolisch funktioniert: willkürliche Genauigkeit ist nicht das gleiche wie unendliche Genauigkeit. Sie können keine unendliche Summe der Ausgabe von MPMath berechnen, da Sie tatsächlich mit unendlich vielen Summanden arbeiten müssten.

Um Ihre Summe symbolisch zu berechnen, muss SymPy Darstellungen aller Argumente enthalten und sich der von Ihnen beschriebenen Identität bewusst sein (f(x)==1 falls 0<x<1) oder in der Lage sein, sie abzuleiten. Dies scheint nicht der Fall zu sein.

So alles, was Sie tun können, ist das Ergebnis numerisch zu nähern, zum Beispiel der Implementierungen von MPMath mit:

from mpmath import besseljzero, besselj 
from itertools import count 

threshold = 1e-5 
min_m = 100 

def f(x): 
    Sum = 0 
    for m in count(1): 
     lambda_m = besseljzero(0,m,0) 
     summand = 2/(lambda_m*besselj(1, lambda_m))*besselj(0,x*lambda_m) 
     Sum += summand 
     if m>min_m and abs(summand)<threshold: 
      break 
    return Sum 
+0

Vielen Dank für Ihre Antwort! –

+0

Sorry - der letzte Teil meines Kommentars wurde vom System gelöscht Offensichtlich ist es möglich, diese Funktion explizit zu programmieren - das ist nicht mein Punkt ... wenn sich Besselzero (0, m, 0) genau wie besselj verhalten würde (0, x), alles wäre in Ordnung. Meine Frage war: Ist es möglich, eine sympy Funktion zu schreiben, die sich wie besselj (0, x) (oder zum Beispiel sin (x)) verhält? Wahrscheinlich mit besseljzero (0, m, 0) in seinem Code ... Ich hopethis ist klarer ... Grüße –

+0

Wenn ich Ihren Wunsch richtig verstehe, sollte dies im zweiten Absatz meiner Antwort angesprochen werden. – Wrzlprmft