gpt4 book ai didi

python - 乘积在符号数量的变量上的偏导数之和

转载 作者:太空宇宙 更新时间:2023-11-03 10:52:02 25 4
gpt4 key购买 nike

我希望 SymPy 评估如下表达式:

formula

我将如何定义符号和表达式,以便 SymPy 能够很好地处理它?我想将 N 保留为一个符号,即不制作 x 的实际有限列表。我已经尝试了 IndexedBaseSum/Product 的各种组合,但没有让它正常工作。

最佳答案

理想情况下是这样的:

x = IndexedBase("x")
i, j, N = symbols("i j N")
expr = Sum(Product(exp(-x[j]**2), (j, 1, N)).diff(x[i]), (i, 1, N))

到目前为止这是未评估的,expr是

Sum(Derivative(Product(exp(-x[j]**2), (j, 1, N)), x[i]), (i, 1, N)) 

方法doit可以用来评价它。不幸的是,产品的差异化还不太奏效:expr.doit()返回

N*Derivative(Product(exp(-x[j]**2), (j, 1, N)), x[i])

将乘积重写为微分之前的总和有助于:

expr = Sum(Product(exp(-x[j]**2), (j, 1, N)).rewrite(Sum).diff(x[i]), (i, 1, N))
expr.doit()

返回

Sum(Piecewise((-2*exp(Sum(log(exp(-x[j]**2)), (j, 1, N)))*x[i], (1 <= i) & (i <= N)), (0, True)), (i, 1, N))

这是微分的正确结果。遗憾的是,我们在 Piecewise 中有这种无关的条件,还有 log(exp(...))那应该被简化。 SymPy 不会推断 (1 <= i) & (i <= N)从外和的上下文来看是True,也犹豫要化简log(exp思考x[j]可能很复杂。所以我求助于 Piecewise 外科手术,用第一 block 替换它,并强制扩展原木:

e = expr.doit()
p = next(iter(e.atoms(Piecewise)))
e = expand_log(e.xreplace({p: p.args[0][0]}), force=True)

现在e

Sum(-2*exp(Sum(-x[j]**2, (j, 1, N)))*x[i], (i, 1, N))

无法获取 exp(Sum(..))不幸的是,再次成为产品。

关于python - 乘积在符号数量的变量上的偏导数之和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48384322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com