Основная проблема заключается в том, что вы пытаетесь использовать символ симпйи (j
) для индексации в списке. Индексирование списка работает только с Python целыми числами. В вашем случае вы можете использовать j
для обычного Python целого числа и использовать обычное Python sum
. Эта обычная сумма будет сначала преобразована в сложение, а затем в Add
при необходимости. Обратите внимание, что команде диапазона Python нужно на одно число больше, чем последний индекс.
import sympy as sy
x = 12
theta_n = [0]*(x+1)
sig = sy.symbols('sigma^2', real=True)
theta_n[0] = 1
theta_n[1] = 1
for n in range(2, x+1):
theta_n[n] = sum(sig ** j * theta_n[n - 2 * j] for j in range(1, n//2+1) )
Обратите внимание, что в выражении sympy sy.Sum( sig**j * theta_n[n-2*j], (j,1,int(n/2)))
, j
- полная переменная symboli c, и j
на самом деле не принимает все значения одно за другим, например, в итерации Python.
Рассмотрим, например:
print(sy.Sum(j*j, (j, 1, 1_000_000_000)).doit())
Sympy немедленно дает правильный результат (333333333833333333500000000
) путем преобразования выражения в n**3/3 + n**2/2 + n/6
. Это займет много времени для вычисления с регулярным суммированием Python.