如何以不同的方式评估符号表达式?
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]
我有一个符号表达式列表,如下所示:
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]