我使用SymPy包创建了一个符号表达式(https://github.com/jverzani/SymPy.jl).我想现在使用Roots包(https://github.com/JuliaLang/Roots.jl)找到该表达式的根.但是,我无法弄清楚如何使用该fzeros方法来查找根,因为这只能应用于具有类型的对象Function而不是Sym我的表达式的类型.
这是我正在尝试做的一个例子.我创造了一个象征性"x"和象征性的表达方式sin(x).现在让我们尝试找到sin(x)值-10和10之间的零:
using SymPy
x = sym"x"
expr = sin(x)
using Roots
fzeros(expr,-10,10)
Run Code Online (Sandbox Code Playgroud)
这是错误:
ERROR: `fzeros` has no method matching fzeros(::Sym, ::Int64, ::Int64)
Run Code Online (Sandbox Code Playgroud)
如何将带有Sym类型的表达式转换为Function类型,以便找到根?
[更新:下面的讨论在许多情况下已被最近引入的lambdify功能所取代。该调用lambdify(expr)创建了一个 julia 函数,该函数不会回调到 SymPy 进行评估,因此应该更快。它应该适用于大多数(但肯定不是所有)表达式。]
这是一个两步过程:
convert(Function, expr)
Run Code Online (Sandbox Code Playgroud)
在您的情况下,将返回自由变量的函数x。但是,函数值仍然是符号性的,不能与 一起使用fzeros。输入可以猜测,但返回值的类型是另一回事。但是,在这种情况下,强制浮动将起作用:
fzeros(x -> float(convert(Function, expr)), -10, 10)
Run Code Online (Sandbox Code Playgroud)
(您也可以使用 来执行此操作a -> float(replace(expr, x, a))。)
对于这个简单的示例solve(expr)也将起作用,但一般来说,findrootin 中的函数SymPy不会公开,因此如果SymPy最终用户不付出一些努力,数字根求解 via 就不是一种解决方法。