朱利亚符号计算无法简化导数表达式。

3
我正在使用Julia中的Symbolics包,但它似乎无法简化表达式的导数。
例如:
@variables r
Dr = Differential(r)
simplify(expand_derivatives(Dr((2/r)^2)))

结果是

(-4(2 / (r^2))) / r

如果我手动创建导数表达式,那么简化操作就非常好用。
simplify((-4*(2 / (r^2))) / r)

提供

-8 / (r^3)

如预期。

为什么简化并不能正确地处理从微分创建的表达式?


你的代码中的 Dr 是什么?它是 Dr = Differential(r) 吗? - Przemyslaw Szufel
正确!我已经添加了那个澄清。 - Eric Hester
1个回答

2
使用 expand=true。设置代码如下:
using Symbolics
@variables r
Dr = Differential(r)

现在:

julia> simplify(expand_derivatives(Dr((2/r)^2)); expand=true)
-8 / (r^3)

请注意,simplify((-4(2 / (r^2))) / r) 之所以生效是因为在到达该函数之前,(-4(2 / (r^2))) / r 已经被简化了。
julia> -4(2 / (r^2)) / r
-8 / (r^3)

感谢您的帮助。问题:是否有必要执行expand=true?这会产生一个令人讨厌的效果,即(r-2)^2 -> r^2 - 4r + 4。我宁愿避免这种结果。 - Eric Hester
不适用于诸如:@variables A; test = 1//2*sqrt(A); Symbolics.simplify(test, expand=true) 这样的内容。 - dwong
@dwong 对于这个例子,你得到了 (1//2)*sqrt(A),你还能期待什么呢? - Przemyslaw Szufel
@PrzemyslawSzufel 下次请尝试提供一些上下文,并询问评论是否有错误需要修正,而不是表现得令人讨厌。这里应该是(1//2)*sqrt(4*A) - dwong
在你的代码中,你没有计算导数,所以问你期望什么是一个完全合理的问题。我并不是要刻意刁难 - 只是如果你说某个东西对你不起作用,请提供输入以及期望的或者观察到的/错误的输出。也许你是想表达expand_derivatives(Differential(A)(test)),它会得到1 / (4sqrt(A)),这是你期望的吗?请具体说明。 - Przemyslaw Szufel
@PrzemyslawSzufel,再说一遍,“这是一个完全合理的问题。” 再次回答,不行,你在表现得很讨厌。其次,输入代码已经提供,并且在之后的评论中显示了需要编辑以重复问题的部分。结果应该简单地是 2*sqrt(A),但实际上并不是。如果你连读一个问题都懒得做,为什么还要费心回答并表现得讨厌呢? - dwong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接