2014-12-08 14 views
6

SymPy paketini (https://github.com/jverzani/SymPy.jl) kullanarak sembolik bir ifade oluşturdum. Şimdi bu ifadenin köklerini Kökler paketini (https://github.com/JuliaLang/Roots.jl) kullanarak bulmak istiyorum. Ancak, kökleri bulmak için fzeros yöntemini nasıl kullanacağımı anlayamıyorum, çünkü bu, yalnızca bir nesne üzerinde türünde değil, benim ifademin türü olan Sym yerine uygulanabilir.Julia: Sembolik bir ifadeyi bir işleve nasıl dönüştürebilirim?

İşte yapmaya çalıştığım bir örnek. Bir sembolik "x" ve sembolik bir ifade sin(x) oluşturuyorum. İşte

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

hata var: Ben Sym tip tip Function için içeren bir ifade dönüştürmek nasıl

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

, bu yüzden şimdi değerleri arasında sin(x) ait sıfır bulmaya -10 ve 10 sağlayan kökleri bulabilir misin?

cevap

4

[GÜNCELLEŞTİRME: Aşağıdaki tartışma, birçok zaman içinde yeni kullanıma sunulan lambdify işlevi tarafından yerine getirilmiştir. lambdify(expr) numaralı çağrı, değerlendirilmek üzere SymPy'ye geri aramayan bir julia işlevi oluşturur, bu nedenle çok daha hızlı olmalıdır. O, kesinlikle bütün ifadeleri çoğu için çalışacaktır ama]

iki adımlı bir işlemdir:.

convert(Function, expr) 

senin durumda, serbest değişkenler, x bir işlev döndürecek. Bununla birlikte, işlev değerleri hala semboliktir ve fzeros ile kullanılamaz. Girdiler tahmin edilebilir, ancak dönüşün değeri başka bir hikaye. Ancak, yüzer coercing bu durumda çalışacaktır: (. Ayrıca a -> float(replace(expr, x, a)) ile bu yapabileceğini)

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

solve(expr) da çalışacak bu basit Örneğin

, ama genel olarak, findroot fonksiyonunu SymPy yılında açığa çıkarılmadı, bu nedenle SymPy aracılığıyla sayısal kök çözme, son kullanıcılar tarafından biraz çaba harcamadan bir geçici çözüm değildir.

+0

nsolve maruz mıdır? – smichr

+0

Teşekkürler. Evet, bunu unuttu, '' '(expr, x0)' tek bir sıfır bulmak için çalışacaktır. Orijinal sorudaki "sıfırlar" işlevi, belirtilen aralıktaki tüm basit sıfırları bulmaya çalışan bir kesmek gibidir. Bu daha 'çözme' çizgileri boyunca. – jverzani