SymPy;суммирование и интегрирование индексированной переменной. - PullRequest
0 голосов
/ 02 октября 2018

Упражнение, которое я пытаюсь воссоздать, является первым в этих заметках решетки .question part 1 question part 2

Я пытаюсь сделать это в сочувствии Python3.Моя попытка заключается в следующем:

import sympy
from sympy.abc import a, m
from sympy import IndexedBase, Idx, oo, symbols
# from ipdb import set_trace as st

integrated_path = sympy.Symbol('I')

def V(sym_a, sym_x):
    return (sym_x**2)/sym_a

N, j, j_primed = symbols('N j, j_primed', integer=True)
x = IndexedBase('x')
j_idx = Idx(j)
S = sympy.summation(((m/(2*a)) * (x[j_idx+1] - x[j_idx]**2) + a*V(a, x[j_idx])),
                    (j_idx, 0, N-1))
print("The action ", S)

integrand = sympy.exp(-S)
j_primed_idx = Idx(j_primed, (0, N))
integrated_path = sympy.integrate(integrand, (x[j_primed_idx], -oo, oo))
print("The integrated path is ", integrated_path)

subbed_path = integrated_path.subs({a: 0.5, N: 8, m: 1})
print("The subbed path is ", subbed_path)

Однако интеграция не признает x[j+1] как одну из x[j], поэтому она не интегрируется по ней.Вывод, который я получаю:

The action  Sum(x[j]**2 + m*(x[j + 1] - x[j]**2)/(2*a), (j, 0, N - 1))
The integrated path is  oo*sign(exp(-Sum(x[j]**2, (j, 0, N - 1)) - m*Sum(x[j + 1], (j, 0, N - 1))/(2*a) + m*Sum(x[j]**2, (j, 0, N - 1))/(2*a)))
The subbed path is  oo*sign(exp(-1.0*Sum(x[j + 1], (j, 0, 7))))

Все значения x должны были интегрироваться, но одно из них остается.Поэтому я думаю, что я использую индексированные переменные неправильно.Если не считать жесткого кодирования N, как правильно это сделать?

1 Ответ

0 голосов
/ 02 октября 2018

Обработка индексируемых объектов в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...