2016-04-17 5 views
1

ich die Wurzeln der tan(xi) = tanh(xi), xi>0 und mein GrundstückGrundstück von tan (x)

plot(tan(pi*xi), tanh(pi*xi), (xi, 0, 4), ylim=(-1, 2)) 

kommt wie diese

sympy plot

visualisieren möchten, wo man die eigentlichen Wurzeln sieht, xi_i \approx pi*(n+1/4), n=1, ... aber auch gefälschte Wurzeln bei pi*(n+1/2), der Grund, warum sympy Plot-Algorithmus, der eine vertikale Linie zwischen Plus und Minus Unendlichkeit zeichnet.

Ich versuchte, die adaptive Abtastung zu vermeiden und eine niedrige Abtastrate nutzlos zu verwenden. Andere Programme, zB gnuplot, gib mir eine vernünftige Handlung, zumindest im Hinblick auf meinen Bedenken, das heißt ...

gnuplot

Schließlich meine Frage ist, ist es möglich, diese vertikalen Linien in sympy zu vermeiden 's plot() Funktion?

Antwort

2

Sympy verwendet Matplotlib als Backend zum Plotten; Die Ursache liegt darin, dass Matplotlib die Punkte sogar um eine Singularität verbindet. Wenn man mit numpy plottet, erlaubt der direkte Zugriff auf y-Werte, die gezeichnet werden, einen zu replace overly large numbers with nan or infinity. Wenn man sich innerhalb der Grenzen hält, scheint eine derart strenge Kontrolle über Zahlen nicht verfügbar zu sein. Das Beste, was ich tun könnte, ist der Bereich in eine Liste von kleineren Bereiche aufgeteilt, die Singularitäten nicht enthalten, die Kenntnis der spezifischen Funktion tan (pi * x) mit:

import math 
from sympy import * 
xi = symbols('xi') 
xmin = 0 
xmax = 4 
ranges = [(xi, n-0.499, n+0.499) for n in range(math.ceil(xmin+0.5), math.floor(xmax+0.5))] 
ranges.insert(0, (xi, 0, 0.499)) 
ranges.append((xi, math.floor(xmax+0.5) - 0.499, xmax)) 
plot((tanh(pi*xi), (xi, xmin, xmax)), *[(tan(pi*xi), ran) for ran in ranges], ylim=(-1, 2)) 

Ausgang:

tangent plot