Как по-разному оценить символическое выражение? - PullRequest
2 голосов
/ 27 мая 2019

У меня есть список символических выражений, как показано ниже:

import numpy as np
import sympy
s = sympy.Symbol('s')
x = [ s, s+1, 10*s**2, 5]

После добавления элементов с помощью «суммы»:

y = sum (x)

Я получу: 10*s**2 + 2*s + 6 Iхочу оценить это выражение для каждого из элементов списка ниже:

s = [1, 2 , 3 , 4 , 5]

Я знаю, что могу определить функцию, как показано ниже:

def F (s):

    F = 10*s**2 + 2*s + 6
    return F
f_dis = [F(value )for value in s]

, и она даст результатЯ ищу: [18, 50, 102, 174, 266] Однако моя проблема в том, что я должен определить F и записать выражение в моем коде.Есть ли другой способ, которым я могу оценить sum (x) без записи F = 10*s**2 + 2*s + 6 в моем коде?Я не могу скопировать и вставить результат sum (x) в мой код.

Ответы [ 3 ]

3 голосов
/ 27 мая 2019

Вы можете попробовать это

import numpy as np
import sympy
s = sympy.Symbol('s')
x = [ s, s+1, 10*s**2, 5]

a = [1, 2 , 3 , 4 , 5]

evals = [sum(x).subs(s, el) for el in a]

выход

[18, 50, 102, 174, 266]

Комплексное число

a = [1, 2 , 3 , 4 , 5, 1+1j]

evals = [sum(x).subs(s, el).as_real_imag() for el in a]

Вы можете легко разобрать кортежи, чтобы получить первый элемент.

def re_(tpl: tuple) -> float:
    return tpl[0]

def img_(tpl: tuple) -> float:
    return tpl[-1]

Или

a = [1, 2 , 3 , 4 , 5, 1+1j]

evals = [sum(x).subs(s, el).evalf() for el in a]

выход

[18.0000000000000, 50.0000000000000,
102.000000000000, 174.000000000000,
266.000000000000, 8.0 + 22.0*I]

Но последний должен быть преобразован в комплекс.

1 голос
/ 28 мая 2019

Или вычислите сумму один раз и используйте ее в лямбде:

>>> x = [ s, s+1, 10*s**2, 5]
>>> sumx = sum(x)
>>> do = lambda si: sumx.subs(s, si)
>>> list(map(do, range(1, 6)))
[18, 50, 102, 174, 266]
1 голос
/ 27 мая 2019

Альтернативное решение использует fun.evalf для оценки вашей функции. Вы можете создать функцию, добавив все термины, используя Add, SymPy's Advanced Expression Manipulation

import numpy as np
from sympy import Symbol, Add

s = Symbol('s')
x = [s, s+1, 10*s**2, 5]
s_values = [1, 2 , 3 , 4 , 5]
fun = Add(*x) # Create a function by adding all terms. * is to unpack all the values

def F(fun, v):
    return fun.evalf(subs={s: v}) # Evaluate the function at s=v

f_dis = [F(fun, v) for v in s_values]   

# [18.0000000000000,
#  50.0000000000000,
#  102.000000000000,
#  174.000000000000,
#  266.000000000000]
...