2014-12-08 2 views
6

SymPy 패키지 (https://github.com/jverzani/SymPy.jl)를 사용하여 기호 식을 만들었습니다. Roots 패키지 (https://github.com/JuliaLang/Roots.jl)를 사용하여 그 표현의 뿌리를 찾고 싶습니다. 그러나 fzeros 방법을 사용하여 뿌리를 찾는 방법을 알아낼 수 없습니다. 내 표현의 유형 인 Sym이 아닌 Function의 개체에만 적용될 수 있기 때문에 뿌리를 찾는 방법을 알아낼 수 없습니다.Julia : 어떻게 기호식을 함수로 변환합니까?

다음은 내가하려는 일의 예입니다. "x" 기호와 sin(x)이라는 기호식을 만듭니다. 여기

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

오류입니다 : 내가 Sym 유형 유형 Function에 함께 식을 변환하려면 어떻게

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

, 그래서 지금은 값 사이 sin(x)의 0을 찾으려고 -10 10 수 뿌리를 찾을 수 있습니까?

답변

4

[업데이트 : 많은 논의가 최근에 소개 된 lambdify 함수로 대체되었습니다. lambdify(expr) 호출은 평가를 위해 SymPy로 다시 전화하지 않는 줄리아 기능을 생성하므로 훨씬 빨라야합니다. 그것은 확실히 모든 표현을 대부분의 작업을해야하지만]

는 두 단계 프로세스입니다.

convert(Function, expr) 

이 경우, 자유 변수, x의 함수를 반환합니다. 그러나 함수 값은 여전히 ​​기호이며 fzeros과 함께 사용할 수 없습니다. 입력 값은 추측 할 수 있지만 반환 값의 유형은 또 다른 이야기입니다. 그러나 떠 강요하는 것은이 경우에 작동합니다 : (. 또한 a -> float(replace(expr, x, a))이 할 수있는)

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

solve(expr)도 작동이 간단한 예를 들어

하지만, 일반적으로, findroot 기능을 SymPy에 노출되지 않으므로 SymPy을 통한 숫자 기반 해결은 최종 사용자의 노력 없이는 해결 방법이 아닙니다.

+0

nsolve가 노출되어 있습니까? – smichr

+0

감사합니다. 예, 그것을 잊었습니다.'nsolve (expr, x0)'는 단일 0을 찾기 위해 작동합니다. 원래 질문에서'fzeros' 함수는 해킹의 비트이며, 지정된 간격으로 모든 간단한 0을 찾으려고합니다. 이것은'solve' 행에 더 가깝습니다. – jverzani

관련 문제