python - 如何在sympy中为变量的下标写求和符号

标签 python numpy sympy

我想为求和写一个 sympy 符号,但是求和的索引在求和中也显示为变量名的下标。例如,

import numpy as np
import sympy
sympy.init_printing()

r = sympy.Symbol('r')

a = sympy.Matrix(sympy.symbols('a:4'))
rpowers = sympy.Matrix([r**i for i in range(len(a))])
long_expr = a.dot(rpowers)

n = sympy.Symbol('n')
a_n = sympy.Symbol('a_n')
short_expr = sympy.Sum(a_n * r**n, (n, 0, 3))

long_exprshort_expr 在数学上表示相同的东西。但是使用 long_expr,我可以将值替换为 a,然后将该表达式 lambdify 化为一个 numpy 函数:

coeffed_long_expr = long_expr.subs(zip(a, [-1, 3, 23, 8]))
func_long_expr = sympy.lambdify([r], coeffed_long_expr, 'numpy')

如何用 short_expr 做同样的事情?还是 short_expr 在这种情况下仅对显示带有求和符号的表达式有用?我希望能够使用求和符号来显示,尤其是对于较大的 n

最佳答案

您可以使用 sympy.Function 完成此操作:

import sympy
a_seq = [-1, 3, 23, 8]
n, r = sympy.symbols('n, r')
a_n = sympy.Function('a')(n)
terms = 4
short_expr = sympy.Sum(a_n * r**n, (n, 0, terms - 1))
coeffed_short_expr = short_expr.doit().subs(
    (a_n.subs(n, i), a_seq[i]) for i in range(terms)) # 8*r**3 + 23*r**2 + 3*r - 1
func_short_expr = sympy.lambdify(r, coeffed_short_expr, 'numpy')

如果您想要一个更简洁、更高效的实现,我怀疑您可以定义一个 sympy.Symbol 的子类来正确实现 subs() 以进行求和.

关于python - 如何在sympy中为变量的下标写求和符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29296124/

相关文章:

python - Numpy根据mask生成全局数组的子集

python-3.x - 检查 Python 列表元素是否在 Pandas 数据框行中

python - 打印sympy输入函数

python - 在 Python 中解析人类可读的重复日期

python - Kedro 与 MongoDB 和其他文档数据库?

python - matplotlib 中的图例设置(numpoints 和 scatterpoints)不起作用

python - 为什么在 sympy 中使用无穷大 (oo) 比提供整数上限更快?

python - 使用 pyarrow 按大小重新分区 pyarrow 表并写入多个 Parquet 文件?

python - 根据每个子数组的累积和对 NXM Numpy 数组进行排序

python - 从 sympy 拉普拉斯逆变换获得更好的答案