Как оценить выражения SymPy с индексированными переменными, используя явные значения? - PullRequest
0 голосов
/ 13 октября 2018

Скажем, у меня есть суммирование с использованием sympy

from sympy import *
import numpy as np
m = 10
n = IndexedBase('n')
i = symbols("i",cls=Idx)
sum_ = summation(n[i],[i,1,m])
sum_
>>> n[10] + n[1] + n[2] + n[3] + n[4] + n[5] + n[6] + n[7] + n[8] + n[9]

и массива значений NumPy

a = np.random.random((m,))

Я хочу оценить sum_, используя каждое соответствующее значение a -так, например, n[1] будет a[0], n[2] будет a[1] и так далее.Как передать значения a в n?

Я пытался использовать метод doit(), но я не уверен, как это работает, и продолжаю получать ошибки.

Кроме того, допустим, у меня есть сложная функция, которая содержит суммы и которую я хочу взять производные от, а затем оценить для конкретных значений коэффициентов и переменных, как показано ниже

theta0 = Symbol('theta0')
theta1 = Symbol('theta1')
theta2 = Symbol('theta2')
sigma = Symbol('sigma')
sigma0 = Symbol('sigma0')
sigma1 = Symbol('sigma1')
sigma2 = Symbol('sigma2')
x = IndexedBase('x')
t = IndexedBase('t')
i = symbols("i", cls=Idx)

nges = -(1/(2*sigma**2))*summation( (x[i] - theta0 - theta1*t[i] - 
theta2*t[i]**2)**2, [i, 1, 2])
func = (-1/2)*((theta0/sigma0)**2 + (theta1/sigma1)**2 + 
(theta2/sigma2)**2) + nges

diff(func, theta0, 1)
>>> -1.0*theta0/sigma0**2 - (4*theta0 + 2*theta1*t[1] + 2*theta1*t[2] + 2*theta2*t[1]**2 + 2*theta2*t[2]**2 - 2*x[1] - 2*x[2])/(2*sigma**2)

Как бы я передал скалярные значения дляtheta и векторы (массивы numpy) для x и t?(Я попытался использовать .limit(), но это стало громоздким, поскольку мне приходилось вызывать его несколько раз в одном выражении)

1 Ответ

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

Самый простой способ - использовать .subs, передавая словарь подстановок.

sum_.subs({n[i+1]: a[i] for i in range(m)})

В некоторых случаях вам может потребоваться также вызвать evalf для получения любых символических констант, таких как piоценены.В этом случае рекомендуется включить замены в evalf следующим образом:

sum_.evalf(subs={n[i+1]: a[i] for i in range(m)})

Аналогично для вашего второго примера.Сначала удобнее подготовить диктовку со значениями.

values = {theta0: 0.2, theta1: 0.3, theta2: 1.3, sigma0: 2, sigma: 2.2}
values.update({t[i]: 3*i for i in range(1, 3)})
values.update({x[i]: 5*i for i in range(1, 3)})
diff(func, theta0, 1).subs(values)   # 9.67809917355372
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...