如何在一个变量的下标中写出符号的符号

时间:2015-03-27 08:21:03

标签: python numpy sympy

我想为求和编写一个sympy符号,但求和的索引也会出现在summand中变量名的下标中。例如,

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 s。

1 个答案:

答案 0 :(得分:2)

您可以使用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()汇总。