由于Symbolics.jl没有integrate命令,所以我使用Reduce.jl进行集成。
在命令本身中将integrand作为文字表达式传递时,还原工作正常,如下所示
:(int(sin(x),x)) |> rcall但是,当首先将integrand放入变量中,然后在调用中使用该变量时,它将无法工作。我试着用eval(),但朱莉娅被绞死了。
这是一个完整的MWE
_
_ _ _(_)_ | Documentation: https://docs.julialang.org
(_) | (_) (_) |
_ _ _| |_ __ _ | Type "?" for help, "]?" for Pkg help.
| | | | | | |/ _` | |
| | |_| | | | (_| | | Version 1.7.1 (2021-12-22)
_/ |\__'_|_|_|\__'_| | Official https://julialang.org/ release
|__/ |
julia> using Reduce
julia> :(int( sin(x),x)) |> rcall
:(-(cos(x)))效果很好。但我想让integrand变成一个变量。
julia> using Symbolics
julia> @variables x
julia> integrand = sin(x)
julia> :(int( integrand ,x)) |> rcall
:(integrand * x)这意味着它没有从外部看到变量integrand。所以我试着在它周围加了个eval
julia> :(int( eval(integrand) ,x)) |> rcall但现在朱莉娅被绞死了。
这两个包必须更好地协同工作,否则,如果我不能使用外部的变量减少包中的命令,减少,这将使它非常有限的使用。例如,我想使用Symbolics构建一些符号表达式,然后将它们用于Reduce中的integrate命令中。
有办法绕道吗?
我知道Symbolics使用的x和Reduce使用的x是不同的。例如,从新的朱莉娅会话,我可以键入第一件事
:(int(sin(x),x)) |> rcall而且它可以工作,而不必先使用@variables x。它看起来像是使用它自己的符号符号,而不需要首先声明它们。
但是要在x外部构建一个符号表达式,首先需要使用@variables x。这可能是问题的原因。我不知道。
发布于 2022-01-16 00:58:09
所以,首先,当你写
:(int(integrand, x))这称为https://docs.julialang.org/en/v1/manual/metaprogramming/#Quoting,它生成一个名为Expr的Julia对象。这与符号或约简无关,而是语言的一个内置部分(它恰好用来表示符号表达式)。
每当您在:(...)的父类之间编写任何内容时,就像在"..."的"s之间编写字符串一样--这只是您在:()中编写的代码的引号。
这一点很重要,因为这意味着您刚刚构造的Expr和您可能通过的任何程序都不能通过这个Expr来知道,在这个特定的情况下,您真正想做的是将一个名为integrand的变量的值https://docs.julialang.org/en/v1/manual/metaprogramming/#man-expression-interpolation到这个Expr中。
您可以将一个Expr插入到另一个$中(就像将变量插入到字符串中),所以如果您已经编写了
julia> using Reduce
julia> integrand = :(sin(x))
:(sin(x))
julia> :(int( $integrand, x))
:(int(sin(x), x))
julia> :(int( $integrand, x)) |> rcall
:(-(cos(x)))这样做是可以实现的。(顺便说一句,是的,@variables纯粹是一件Symbolics.jl的事情;它没有更广泛地减少或Expr的意义。)
但是,您似乎希望能够将Symbolics.jl表达式插入到Expr中,而不仅仅是将另一个Expr插入到Expr中。然而,令我惊喜的是,这似乎只是使用相同的内插语法:
julia> using Symbolics
julia> @variables x;
julia> integrand = sin(x)
sin(x)
julia> :(int( $integrand, x))
:(int(sin(x), x))
julia> using Reduce
julia> :(int( $integrand, x)) |> rcall
:(-(cos(x)))最后,我认为值得注意的是,据我所知,这些程序包Symbolics和Reduce都不是为了相互合作而设计的。事实上,您可以使它发生,这基本上是一个奇怪的事实,减少选择使用朱莉娅的内置Expr类型作为它的符号表达式类型。
在这种情况下,如果你仔细考虑一下,希望你能明白为什么eval不能在这里帮助你;如果有什么与你在这里想要的完全相反的话;它可以用一个Expr来计算它,这正好让你使用变成一个象征的表情 (因为,巧合的是,计算函数是你创建符号表达式的方式) --但事实并非如此。
https://stackoverflow.com/questions/70722717
复制相似问题