2014-12-08 18 views
6

Ho creato un'espressione simbolica utilizzando il pacchetto SymPy (https://github.com/jverzani/SymPy.jl). Ora voglio trovare le radici di quell'espressione usando il pacchetto Roots (https://github.com/JuliaLang/Roots.jl). Tuttavia, non riesco a capire come utilizzare il metodo fzeros per trovare le radici, poiché questo può essere applicato solo su un oggetto con il tipo Function anziché su Sym, che è il tipo della mia espressione.Julia: come posso convertire un'espressione simbolica in una funzione?

Ecco un esempio di ciò che sto cercando di fare. Creo un simbolico "x" e un'espressione simbolica sin(x). Ora lascia cercare di trovare gli zeri di sin(x) tra i valori -10 e 10:

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

Ecco l'errore:

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

Come faccio a convertire un'espressione con Sym tipo di Function tipo, così ho puoi trovare le radici?

risposta

4

[AGGIORNAMENTO: La seguente discussione è stata sostituita in molti casi dalla funzione lambdify introdotta di recente. La chiamata lambdify(expr) crea una funzione julia che non richiama in SymPy per la valutazione, quindi dovrebbe essere molto più veloce. Dovrebbe funzionare per la maggior parte, ma certamente non tutti, espressioni]

Si tratta di un processo in due fasi:.

convert(Function, expr) 

tornerà in funzione delle variabili libere, x, nel tuo caso. Tuttavia, i valori delle funzioni sono ancora simbolici e non possono essere utilizzati con fzeros. Gli input possono essere indovinati, ma il tipo di valore restituito è un'altra storia. Tuttavia, costringere a galleggiare lavorerà in questo caso: (. Si potrebbe anche fare questo con a -> float(replace(expr, x, a)))

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

Per questo semplice esempio solve(expr) sarà anche funzionare, ma in generale, la funzione findroot in SymPy non è esposto, quindi la risoluzione numerica delle radici tramite SymPy non è una soluzione alternativa senza alcuno sforzo da parte degli utenti finali.

+0

È nsolve esposto? – smichr

+0

Grazie. Sì, ho dimenticato che, 'nsolve (expr, x0)' funzionerà per trovare un singolo zero. La funzione 'fzeros' nella domanda originale è un po 'di hack, che cerca di trovare tutti gli zeri semplici nell'intervallo specificato. Questo è più sulla falsariga di 'solve'. – jverzani

Problemi correlati