Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何以不同的方式计算符号表达式?_Python_List_Sum_Sympy_Evaluation - Fatal编程技术网

Python 如何以不同的方式计算符号表达式?

Python 如何以不同的方式计算符号表达式?,python,list,sum,sympy,evaluation,Python,List,Sum,Sympy,Evaluation,我有一个符号表达式列表,如下所示: import numpy as np import sympy s = sympy.Symbol('s') x = [ s, s+1, 10*s**2, 5] def F (s): F = 10*s**2 + 2*s + 6 return F f_dis = [F(value )for value in s] 使用“总和”添加元素后: 我将得到:10*s**2+2*s+6 我想为下面列表中的每个元素计算此表达式: s = [1, 2 ,

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

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

    F = 10*s**2 + 2*s + 6
    return F
f_dis = [F(value )for value in s]
使用“总和”添加元素后:

我将得到:
10*s**2+2*s+6
我想为下面列表中的每个元素计算此表达式:

s = [1, 2 , 3 , 4 , 5]
我知道我可以定义如下函数:

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

    F = 10*s**2 + 2*s + 6
    return F
f_dis = [F(value )for value in s]
它会给出我想要的结果:
[18,50102174266]
然而,我的问题是我必须定义F并在代码中编写表达式。是否有其他方法可以计算
sum(x)
,而无需在代码中写入
F=10*s**2+2*s+6
? 我无法将
sum(x)
的结果复制并粘贴到我的代码中。

您可以试试这个

将numpy导入为np
进口交响乐
s=符号('s')
x=[s,s+1,10*s**2,5]
a=[1,2,3,4,5]
evals=[a中el的sum(x).subs(s,el)
输出

[18, 50, 102, 174, 266]
复数

a=[1,2,3,4,5,1+1j]
evals=[sum(x).subs(s,el).as_real_imag()表示a中的el]
您可以轻松地解析元组以获得第一个元素

def re_(tpl:tuple)->浮点:
返回第三方物流[0]
def img(tpl:元组)->浮点:
返回第三方物流[-1]

a=[1,2,3,4,5,1+1j]
evals=[sum(x).subs(s,el).evalf()表示a中的el]
输出

[18, 50, 102, 174, 266]
[18.0000000000000,50.0000000000000,
102.000000000000, 174.000000000000,
266000000000000,8.0+22.0*I]

但最后一个必须转换为复杂的。

另一个解决方案用于评估您的功能。您可以使用Symphy的
Add
,通过添加所有术语来创建函数


或者计算一次总和并将其用于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]

.
ans=[y.subs(s,el)表示列表中的el]
您不应将
s
重命名为该列表。给它起另一个名字就行了谢谢,它也行。但唯一的问题是,如果我将列表s的一个元素更改为复数,代码不会为复数返回简化值。例如,在列表中插入1+1j而不是1,您将得到8.0+2.0*I+10*(1.0+1.0*I)**2而不是8.0+22.0*I。eval函数处理此问题,但速度较慢。您可以更改
do=lambda si:sumx.subs(s,si)。expand()
,然后它也适用于这种情况。谢谢,它也适用。但唯一的问题是,如果我将列表s的一个元素更改为复数,代码不会为复数返回简化值。例如,在列表中插入1+1j而不是1,您将得到8.0+2.0*I+10*(1.0+1.0*I)**2而不是8.0+22.0*I。eval函数处理此问题,但速度较慢。Hi@AmirRezaJalali。也许我对答案的新编辑会有所帮助