如何以不同方式评估符号表达式?

时间:2019-05-26 23:23:58

标签: python list sum sympy evaluation

我有一个符号表达式列表,如下所示:

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

使用“ sum”添加元素后:

y = sum (x)

我会得到:10*s**2 + 2*s + 6 我想为下面列表的每个元素评估该表达式:

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 个答案:

答案 0 :(得分:3)

您可以尝试

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 :(得分:1)

另一种解决方案是使用fun.evalf评估您的功能。您可以通过使用Add(SymPy的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]

答案 2 :(得分:1)

或一次计算总和并在lambda中使用它:

>>> 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]