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

How to evaluate a symbolic expression in different ways?

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

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) 的结果。

你可以试试这个

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]

但是最后一个要转成复数。

另一种解决方案是使用 fun.evalf to evaluate your function. You can create the function by adding all the terms using 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]

或者计算一次总和并在 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]