Обработка индексируемых объектов в SymPy недостаточно сложна для выполнения этих вычислений, как это сделал бы человек.В частности, интеграция по (x[j_primed_idx], -oo, oo)
не будет восприниматься как «интеграция по всем индексированным x».Это выглядит как единая интеграция с SymPy и над переменной, отличной от любой x[j]
, потому что индексы не выглядят одинаково.Короче говоря, SymPy не совсем понимает, как работают индексы в математике.
Вам нужно объявить значение N
заранее, чтобы что-нибудь сделать.И чтобы исправить опечатку в (x[j_idx+1] - x[j_idx]**2)
- это должно быть (x[j_idx+1] - x[j_idx])**2
.И это все равно будет длиться вечно, если N большое, а a
и m
являются символическими.Проблема в том, что есть случаи за случаями, основанные на относительных размерах a
и m
.Вот рабочая версия с N, a, m
все указанные заранее - это помогает интегратору много .Обратите внимание на использование Rational(1, 2)
вместо числа с плавающей запятой 0.5
, кстати - это важно для SymPy.
import sympy
from sympy import oo, symbols
N = 8
a = sympy.Rational(1, 2)
m = 1
def V(sym_a, sym_x):
return (sym_x**2)/sym_a
x = symbols('x0:{}'.format(N))
S = sympy.Add(*[((m/(2*a)) * (x[j_idx+1] - x[j_idx])**2 + a*V(a, x[j_idx])) for j_idx in range(N-1)])
print("The action ", S)
integrand = sympy.exp(-S)
integrated_path = sympy.integrate(integrand, *[(x[j_primed_idx], -oo, oo) for j_primed_idx in range(N)], conds='none')
print("The integrated and subbed path is ", integrated_path)
Вывод:
The action x0**2 + x1**2 + x2**2 + x3**2 + x4**2 + x5**2 + x6**2 + (-x0 + x1)**2 + (-x1 + x2)**2 + (-x2 + x3)**2 + (-x3 + x4)**2 + (-x4 + x5)**2 + (-x5 + x6)**2 + (-x6 + x7)**2
The integrated and subbed path is sqrt(377)*pi**4/377
И это как далеко я могунажмите здесь с символами a и m: N = 2 здесь.
import sympy
from sympy import IndexedBase, Idx, oo, symbols
a, m = symbols('a m', positive=True)
N = 2
def V(sym_a, sym_x):
return (sym_x**2)/sym_a
j, j_primed = symbols('j, j_primed', integer=True)
x = symbols('x0:{}'.format(N))
S = sympy.Add(*[((m/(2*a)) * (x[j_idx+1] - x[j_idx])**2 + a*V(a, x[j_idx])) for j_idx in range(N-1)])
print("The action ", S)
integrand = sympy.exp(-S)
integrated_path = sympy.integrate(integrand, *[(x[j_primed_idx], -oo, oo) for j_primed_idx in range(N)], conds='none')
print("The integrated path is ", integrated_path)
subbed_path = integrated_path.subs({a: sympy.Rational(1, 2), m: 1})
print("The subbed path is ", subbed_path)
Выход:
The action x0**2 + m*(-x0 + x1)**2/(2*a)
The integrated path is -I*pi*sqrt(a)*sqrt(4*a**2 + 2*a*m)*Piecewise((I/sqrt(-1 + (4*a**2 + 2*a*m)/(2*a*m)), (4*a**2 + 2*a*m)/(2*a*m) > 1), (1/sqrt(1 - (4*a**2 + 2*a*m)/(2*a*m)), True))/(m*sqrt(a + m/2))
The subbed path is pi