f(x)
がa
とb
の間に定義されているとします。この関数は多くのゼロを持つことができますが、多くの漸近線も持ちます。私はすべてこの関数のゼロを取得する必要があります。それを行う最善の方法は何ですか?numpy(とscipy)を使って関数のすべてのゼロを見つける方法は?
実は、私の戦略は以下の通りです:
- 私は私がポイント間のゼロを見つける看板
- の変更があるかどうかを検出ポイント
- の与えられた数に私の機能を評価
たゼロが本当にゼロである場合、または私は検証に署名変化していること、これは漸近線
U = numpy.linspace(a, b, 100) # evaluate function at 100 different points c = f(U) s = numpy.sign(c) for i in range(100-1): if s[i] + s[i+1] == 0: # oposite signs u = scipy.optimize.brentq(f, U[i], U[i+1]) z = f(u) if numpy.isnan(z) or abs(z) > 1e-3: continue print('found zero at {}'.format(u))
0であれば
このアルゴリズムが動作しているようですが、私は2つの潜在的な問題を参照除い:
- をそれは(例えば、
f(x) = x**2
のような機能に)x軸と交差しないゼロでは検出されませんが、私はそれが評価している機能で起こるとは思わない。 - 離散化ポイントがあまりにも遠すぎると、それらの間に1より多くのゼロが存在する可能性があり、アルゴリズムがそれらを見つけることができない可能性があります。
関数のすべてのゼロを見つけるには、より効率的な方法がありますか?
私はそれが質問のために重要だとは思いませんが、興味がある人のために、私は、光ファイバにおける電波伝搬の特性方程式を扱っています。機能は次のように(どこV
とell
が以前に定義されており、ell
は正の整数)になります。
def f(u):
w = numpy.sqrt(V**2 - u**2)
jl = scipy.special.jn(ell, u)
jl1 = scipy.special.jnjn(ell-1, u)
kl = scipy.special.jnkn(ell, w)
kl1 = scipy.special.jnkn(ell-1, w)
return jl/(u*jl1) + kl/(w*kl1)
私が書いたように、私は「漸近線(asymptote)」を使う場合には「発散」を使用しています。 – tacaswell
また、どのような種類の機能を扱っているかについてもう少し詳しく説明できますか?例えば、 'x = 0'の周りの' sin(1/x) 'ではこれを行うことはできません。 – tacaswell
@tcaswell私は英語で正しい言葉が何か分かりません。私が意味することは、f(x-) - > -infとf(x +) - > inf –