2014-12-08 12 views
6

Utworzyłem symboliczne wyrażenie za pomocą pakietu SymPy (https://github.com/jverzani/SymPy.jl). Chcę teraz znaleźć korzenie tego wyrażenia za pomocą pakietu Roots (https://github.com/JuliaLang/Roots.jl). Jednak nie mogę znaleźć sposobu, aby użyć metody fzeros do znalezienia korzeni, ponieważ można to zastosować tylko do obiektu o typie Function, a nie Sym, który jest typem mojego wyrażenia.Julia: jak mogę przekonwertować wyrażenie symboliczne na funkcję?

Oto przykład tego, co próbuję zrobić. Tworzę symboliczny symbol "x" i wyrażenie symboliczne sin(x). Teraz spróbujmy znaleźć zer sin(x) między wartościami -10 i 10:

using SymPy 
x = sym"x" 
expr = sin(x) 
using Roots 
fzeros(expr,-10,10) 

Oto błąd:

ERROR: `fzeros` has no method matching fzeros(::Sym, ::Int64, ::Int64) 

Jak przekonwertować wyrażenia z Sym typem Function typ, więc może znaleźć korzenie?

Odpowiedz

4

[AKTUALIZACJA: Poniższa dyskusja została w wielu przypadkach zastąpiona ostatnio wprowadzoną funkcją lambdify. Wywołanie lambdify(expr) tworzy funkcję julia, która nie oddzwania do SymPy do oceny, więc powinna być znacznie szybsza. Powinno to działać dla większości, ale na pewno nie wszystkie wyrażenia]

Jest to proces dwuetapowy.

convert(Function, expr) 

powróci funkcją zmiennych wolnych, x, w Twoim przypadku. Jednak wartości funkcji są nadal symboliczne i nie można ich używać z fzeros. Wejścia można odgadnąć, ale typ wartości zwracanej to inna historia. Jednak zmuszanie do pływaka zadziała w tym przypadku: (. Można to zrobić także z a -> float(replace(expr, x, a)))

fzeros(x -> float(convert(Function, expr)), -10, 10) 

Na tym prostym przykładzie solve(expr) będzie również działać, ale w ogóle, funkcję findroot w SymPy nie jest wyeksponowany, więc numeryczne rozwiązywanie roota przez SymPy nie jest obejściem bez wysiłku ze strony użytkowników końcowych.

+0

Czy nsolve jest odsłonięty? – smichr

+0

Dzięki. Tak, zapomniałem o tym, 'nsolve (expr, x0)' zadziała, aby znaleźć pojedyncze zero. Funkcja 'fzeros' w pierwotnym pytaniu jest trochę hack, która próbuje znaleźć wszystkie proste zera w określonym przedziale. Jest to bardziej podobne do "rozwiązania". – jverzani

Powiązane problemy