2016-04-17 4 views
1

私はtan(xi) = tanh(xi), xi>0と私のプロット(x)は

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

のルーツを視覚化したい日焼けのプロットをクリーンアップすると、1は、実際の根を見て、この

sympy plot

xi_i \approx pi*(n+1/4), n=1, ...のように出てきます pi*(n+1/2)にある偽のルーツの理由は、プラスとマイナスの無限大の間に垂直線を描画するプロットアルゴリズムsympyです。

私は適応サンプリングを避け、低サンプリングレートを使用しないようにしました。他のプログラム、例えばgnuplot、つまり、少なくとも私の懸念を考慮して、私はより合理的なプロットを与える...

gnuplot

結局私の質問は、それがsympyでこれらの垂直線を回避することが可能である、ですのplot()の機能ですか?

答えて

2

sympyはプロットのバックエンドとしてmatplotlibを使用します。根本的な原因は、matplotlibが特異点の周りでもドットを結ぶということです。 numpyをプロットすると、y値に直接アクセスすると、replace overly large numbers with nan or infinityになります。 sympyの範囲内にとどまっていると、そのような厳密な数値制御は利用可能ではないようです。

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

出力:

tangent plot私は何ができる最善のは、特定の機能日焼け(pi * x)上の知識を利用して、特異点を含まない小さな範囲のリストに範囲を分割することです