Załóżmy, że mam funkcję f(x)
zdefiniowaną między a
i b
. Ta funkcja może mieć wiele zer, ale także wiele asymptot. Muszę pobrać wszystkie zera tej funkcji. Jaki jest najlepszy sposób na zrobienie tego?Jak znaleźć wszystkie zera funkcji za pomocą numpy (i scipy)?
Faktycznie, moja strategia jest następująca:
- oceniam moja funkcja w danej liczby punktów
- wykryć, czy nastąpiła zmiana znaku
- znajdę zero między punktami które zmieniają się zalogować
zweryfikować czy zero znaleźć jest naprawdę zero, lub jeśli jest to asymptota
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))
Algorytm ten wydaje się działać, z wyjątkiem widzę dwa potencjalne problemy:
- To nie wykryje, że zero nie przechodzi oś X (na przykład, w zależności jak
f(x) = x**2
) Jednakże, Nie sądzę, aby mogło wystąpić z funkcją, którą oceniam. - Jeśli punkty dyskretyzacji są za daleko, może być ich więcej niż jedno, a algorytm może go nie znaleźć.
Czy masz lepszą strategię (wciąż wydajną), aby znaleźć wszystkie zera funkcji?
Nie sądzę, że to ważne pytanie, ale dla tych, którzy są ciekawi, mam do czynienia z charakterystycznymi równań propagacji fal w światłowodzie. Funkcja wygląda (gdzie V
i ell
są wcześniej zdefiniowane, a ell
jest dodatnia):
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)
jako skwantowanie matematyczne, użyłem "rozbieżności", w której używa się "asymptoty". – tacaswell
Czy możesz również podać nieco więcej szczegółów na temat rodzaju funkcji, z którą masz do czynienia? na przykład po prostu nie można tego zrobić dla 'sin (1/x)' w regionie wokół 'x = 0'. – tacaswell
@tcaswell Nie jestem pewien, co jest właściwym słowem po angielsku. Mam na myśli to, że f (x-) -> -inf i f (x +) -> inf –