我正在使用 Symbolics.jl,我想进行数学求和,相当于 Sympy 中的 Sum 函数(https://docs.sympy.org/latest/modules/concrete.html)
Symbolics.jl 的文档表明这是可能的:
- 离散数学(求和、乘积、二项式系数等的表示)
然而,在常见问题中,却提出了相反的建议:
允许循环,但循环迭代的数量不应要求您知道符号 x 的值。
Prz*_*fel 17
您可以用于+(x...)符号向量的求和。
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\nRun Code Online (Sandbox Code Playgroud)\n请注意sum(x),它似乎没有扩展并产生不正确的结果:
julia> sum(x)\nSymbolics._mapreduce(identity, +, x, Colon(), (:init => false,))\n\njulia> Symbolics.derivative(sum(x), x[2])\n0\nRun Code Online (Sandbox Code Playgroud)\n最后但并非最不重要的一点是,再迈出一步并定义求和符号以获得良好的体验:
\njulia> \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\nRun 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 或任何其他符号跟踪系统的限制,因为它仅限于符号表示(准静态)代码。这篇博文对此进行了更深入的讨论。