Jack
1
Greetings. I am trying to convert the a very simple example of the following
using SymbolicUtils
@syms x
f = 2*x
the f
into a function that would evaluate at a concrete number of x, so ideally it’s a function that has
f(2) = 4
do anyone have experience doing it? thank you.
Check out Symbolics.build_function
3 Likes
If your expressions are polynomials you can check out MultivariatePolynomials.
Jack
4
At the end some meta programming helped.
eqn_str = "2*x1"
expression = Meta.parse(eqn_str)
eqn_f = @eval begin
f(x1) = $expression
end
and we would have
eon_f(4)
equals 8.
Have a look at this talk: JuliaCon 2019 | Keynote: Professor Steven G. Johnson It should convince you why the solution that you suggest is not a good idea Instead I recommend you to use what was suggested:
it does exactly what you want:
julia> using Symbolics
julia> @syms x
(x,)
julia> expression = 2*x
2x
julia> fexp=build_function(expression,x)
:(function (x,)
#= /Users/felixger/.julia/packages/SymbolicUtils/kZD5O/src/code.jl:282 =#
#= /Users/felixger/.julia/packages/SymbolicUtils/kZD5O/src/code.jl:283 =#
(*)(2, x)
end)
julia> f = eval(fexp)
#1 (generic function with 1 method)
julia> f(2)
4
2 Likes
The call to eval
can be avoided with
julia> f=build_function(expression,x, expression=Val{false})
RuntimeGeneratedFunction(#=in Symbolics=#, #=using Symbolics=#, :((x,)->begin
#= /home/fredrikb/.julia/packages/SymbolicUtils/v2ZkM/src/code.jl:349 =#
#= /home/fredrikb/.julia/packages/SymbolicUtils/v2ZkM/src/code.jl:350 =#
#= /home/fredrikb/.julia/packages/SymbolicUtils/v2ZkM/src/code.jl:351 =#
(*)(2, x)
end))
julia> f(2)
4
2 Likes