我有一个符号表达式列表,如下所示:
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)
的结果。
答案 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]