簡體   English   中英

如何將表達式作為文字變量傳遞給 Julia 中的函數

[英]How do I pass an expression, as a literal variable, to a function in Julia

我正在構建一個 homecooked-function 來返回符號導數表達式和一個可調用的導數函數

Pkg.add("Symbolics")
using Symbolics
function derivative(exp,x)
    @variables x
    Dx=Differential(x)
    ϕe = exp 
    return (expand_derivatives(Dx(ϕe))), first(substitute.(expand_derivatives(Dx(ϕe)), (Dict(x => ξ),)))
end

#+結果::導數

derivative(-x^2 + 0.1*sin(x) + 2*sin(x)^2,x)

#+結果:(錯誤)

ERROR: MethodError: no method matching ^(::StepRangeLen{Float64, Base.TwicePrecis
ion{Float64}, Base.TwicePrecision{Float64}}, ::Int64)
Closest candidates are:
  ^(::Union{AbstractChar, AbstractString}, ::Integer) at strings/basic.jl:718
  ^(::LinearAlgebra.Symmetric{var"#s814", S} where {var"#s814"<:Real, S<:(Abstrac
tMatrix{var"#s814"} where var"#s814"<:var"#s814")}, ::Integer) at /build/julia/sr
c/julia-1.6.3/usr/share/julia/stdlib/v1.6/LinearAlgebra/src/symmetric.jl:868
  ^(::LinearAlgebra.Symmetric{var"#s814", S} where {var"#s814"<:Complex, S<:(Abst
ractMatrix{var"#s814"} where var"#s814"<:var"#s814")}, ::Integer) at /build/julia
/src/julia-1.6.3/usr/share/julia/stdlib/v1.6/LinearAlgebra/src/symmetric.jl:869
  ...
Stacktrace:
 [1] macro expansion
   @ ./none:0 [inlined]
 [2] literal_pow(f::typeof(^), x::StepRangeLen{Float64, Base.TwicePrecision{Float
64}, Base.TwicePrecision{Float64}}, #unused#::Val{2})
   @ Base ./none:0
 [3] top-level scope
   @ REPL[191]:1

以交互方式調用我希望該函數執行的操作(預期行為)

@variables x
Dx=Differential(x)
ϕe = -x^2 + 0.1*sin(x) + 2*sin(x)^2 
(expand_derivatives(Dx(ϕe))) 

#+結果::0.1cos(x) + 4cos(x)*sin(x) - 2x

dϕ(ξ) = first(substitute.(expand_derivatives(Dx(ϕe)), (Dict(x => ξ),)))

#+結果::dφ

dϕ(1)

#+結果::-0.12737491576182247

您可以將exp變成一個匿名函數,它接收x作為變量,如下所示:

julia> function derivative(exp, ξ)
           @variables x
           Dx=Differential(x)
           ϕe = exp(x) # <-- change here
           return (expand_derivatives(Dx(ϕe))), first(substitute.(expand_derivatives(Dx(ϕe)), (Dict(x => ξ),)))
       end

julia> derivative(x->-x^2 + 0.1*sin(x) + 2*sin(x)^2, 1)
(0.1cos(x) + 4cos(x)*sin(x) - (2x), -0.12737491576182247)

如果您願意,也可以使用do 語法,這相當於傳遞x -> ...

julia> derivative(1) do x
         -x^2 + 0.1*sin(x) + 2*sin(x)^2
       end
(0.1cos(x) + 4cos(x)*sin(x) - (2x), -0.12737491576182247)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM