首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Symbolics表达式调用精简包中的integrate命令

如何使用Symbolics表达式调用精简包中的integrate命令
EN

Stack Overflow用户
提问于 2022-01-15 15:16:53
回答 1查看 206关注 0票数 3

由于Symbolics.jl没有integrate命令,所以我使用Reduce.jl进行集成。

在命令本身中将integrand作为文字表达式传递时,还原工作正常,如下所示

代码语言:javascript
复制
:(int(sin(x),x)) |> rcall

但是,当首先将integrand放入变量中,然后在调用中使用该变量时,它将无法工作。我试着用eval(),但朱莉娅被绞死了。

这是一个完整的MWE

代码语言:javascript
复制
               _
   _       _ _(_)_     |  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变成一个变量。

代码语言:javascript
复制
julia>  using Symbolics
julia> @variables x
julia> integrand = sin(x)
julia> :(int( integrand ,x)) |> rcall

         :(integrand * x)

这意味着它没有从外部看到变量integrand。所以我试着在它周围加了个eval

代码语言:javascript
复制
julia> :(int( eval(integrand) ,x)) |> rcall

但现在朱莉娅被绞死了。

这两个包必须更好地协同工作,否则,如果我不能使用外部的变量减少包中的命令,减少,这将使它非常有限的使用。例如,我想使用Symbolics构建一些符号表达式,然后将它们用于Reduce中的integrate命令中。

有办法绕道吗?

我知道Symbolics使用的x和Reduce使用的x是不同的。例如,从新的朱莉娅会话,我可以键入第一件事

代码语言:javascript
复制
:(int(sin(x),x)) |> rcall

而且它可以工作,而不必先使用@variables x。它看起来像是使用它自己的符号符号,而不需要首先声明它们。

但是要在x外部构建一个符号表达式,首先需要使用@variables x。这可能是问题的原因。我不知道。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-16 00:58:09

所以,首先,当你写

代码语言:javascript
复制
:(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插入到另一个$中(就像将变量插入到字符串中),所以如果您已经编写了

代码语言:javascript
复制
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中。然而,令我惊喜的是,这似乎只是使用相同的内插语法:

代码语言:javascript
复制
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来计算它,这正好让你使用变成一个象征的表情 (因为,巧合的是,计算函数是你创建符号表达式的方式) --但事实并非如此。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70722717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档