使用 Julia Symbolics,我如何进行数学求和?

Ced*_*elo 16 julia

我正在使用 Symbolics.jl,我想进行数学求和,相当于 Sympy 中的 Sum 函数(https://docs.sympy.org/latest/modules/concrete.html

Symbolics.jl 的文档表明这是可能的:

  • 离散数学(求和、乘积、二项式系数等的表示)

然而,在常见问题中,却提出了相反的建议:

允许循环,但循环迭代的数量不应要求您知道符号 x 的值。

Prz*_*fel 17

您可以用于+(x...)符号向量的求和。

\n
julia> @variables x[1:5]\n1-element Vector{Symbolics.Arr{Num, 1}}:\n x[1:5]\n\njulia> +(x...)\nx[1] + x[2] + x[3] + x[4] + x[5]\n\njulia> Symbolics.derivative(+(x...), x[2])\n1\n
Run Code Online (Sandbox Code Playgroud)\n

请注意sum(x),它似乎没有扩展并产生不正确的结果:

\n
julia> sum(x)\nSymbolics._mapreduce(identity, +, x, Colon(), (:init => false,))\n\njulia> Symbolics.derivative(sum(x), x[2])\n0\n
Run Code Online (Sandbox Code Playgroud)\n

最后但并非最不重要的一点是,再迈出一步并定义求和符号以获得良好的体验:

\n
julia> \xe2\x88\x91(v) = +(v...)\n\xe2\x88\x91 (generic function with 1 method)\n\njulia> \xe2\x88\x91(x)\nx[1] + x[2] + x[3] + x[4] + x[5]\n\njulia> Symbolics.derivative(100\xe2\x88\x91(x), x[2])\n100\n
Run Code Online (Sandbox Code Playgroud)\n


Chr*_*kas 12

它扩展了 Julia 本身,因此实际上没有太多需要记录的内容:只需在符号值上使用 Julia 即可。因此,在这里,只需使用sum,它是Base Julia的一部分。

julia> using Symbolics

julia> @variables x[1:5]
1-element Vector{Symbolics.Arr{Num, 1}}:
 x[1:5]

julia> x = collect(x)
5-element Vector{Num}:
 x[1]
 x[2]
 x[3]
 x[4]
 x[5]

julia> sum(x)
x[1] + x[2] + x[3] + x[4] + x[5]
Run Code Online (Sandbox Code Playgroud)

“循环是允许的,但循环迭代的数量不应该要求您知道符号 x 的值。”

这也是 SymPy 或任何其他符号跟踪系统的限制,因为它仅限于符号表示(准静态)代码。这篇博文对此进行了更深入的讨论。

  • 它从符号数组转换为符号数组。符号数组使操作保持惰性(尽管打印它的方式很糟糕,但在我看来,这值得一个问题),因此它具有 O(1) 的操作表示形式。“collect(x)”给出一个标量符号数组,然后对其调用 sum。这是一个 O(n) 表示,就像 SymPy 一样。目前符号数组还不是一个完整的功能。 (3认同)
  • 为什么我在尝试执行“sum(x)”时得到“Symbolics._mapreduce(identity, +, x, Colon(), (:init => false,))”。现在我知道我可以做 `sum(collect(x))` 但这看起来有点奇怪。 (2认同)