Python:列表代数简化

标签 python list sympy simplify

您好,我正在尝试获取列表的常用术语以简化它,例如,如果我的列表是:

List=[['1','A1','B1','Kc','Ka'],['1','A1','B1','D2','Kc','Ka'],
['-1','A1','B1','D1','Kc','Ka'],['1','A1','B1','D1','KD','Ka'],
['-1','B1','D1','C1','Kc','Ka','KF'],['1','B1','D1','F1','Kc','Kz','Kl']]    

是否有任何功能可以给我结果:

List_output=[['A1', 'B1', [['D1', [['KD', 'Ka'],
['-1', 'Ka', 'Kc']]], ['Ka', 'Kc'], ['D2', 'Ka', 'Kc']]],
['B1', 'D1', [['F1', 'Kc', 'Kl', 'Kz'], ['-1', 'C1', 'KF', 'Ka', 'Kc']]]]

我基本上想做的是代数归约。

(A1 B1 Kc Ka + A1 B1 D2 Kc Ka - A1 B1 D1 Kc Ka + A1 B1 D1 KD Ka -
B1 D1 C1 Kc Ka KF + B1 D1 F1 Kc Kz Kl ) ->
A1B1[D1[-KcKa + KDKa] + D2KcKa +KcKa] + B1D1[-C1[KcKaKF] + F1[KcKzKl]]  

简化的唯一要求是所有简化的项都需要依赖于 K 的总和或余数。换句话说,一切都需要是 K 的线性组合的函数:[-KcKa + KDKa][KcKaKF][['-1','Kc','Ka'],['+1','KD','Ka']]

我正在尝试使用 SymPy,但我遇到的问题是要减少的条款来自其他地方,所以我永远不知道这些符号是什么。要使用 SymPy,您需要声明符号,对吧?知道如何解决这个问题吗?

最佳答案

我想你知道你想要做什么代数运算,但你对从 sympy 中获取“K”符号挂断了吗? Sympy 非常擅长猜测变量名。您可以构造表达式:

In [1]: import sympy

In [2]: List=[['1','A1','B1','Kc','Ka'],['1','A1','B1','D2','Kc','Ka'],['-1','A
   ...: 1','B1','D1','Kc','Ka'],['1','A1','B1','D1','KD','Ka'],['-1','B1','D1',
   ...: 'C1','Kc','Ka','KF'],['1','B1','D1','F1','Kc','Kz','Kl']]    

In [3]: expression = sympy.Add(*[sympy.Mul(*[sympy.S(y) for y in x]) for x in L
   ...: ist] )

In [4]: expression
Out[4]: A1*B1*D1*KD*Ka - A1*B1*D1*Ka*Kc + A1*B1*D2*Ka*Kc + A1*B1*Ka*Kc - B1*C1*D1*KF*Ka*Kc + B1*D1*F1*Kc*Kl*Kz

然后获取符号列表:

In [5]: all_symbols = [x for x in expression.atoms() if type(x)==sympy.Symbol]

In [6]: all_symbols
Out[6]: [Kc, B1, KF, A1, Kz, Ka, D1, C1, F1, D2, KD, Kl]

一旦你有了符号列表,捕获那些以 'K' 开头的符号是微不足道的,或者不是:

In [7]: solvefor = [x for x in all_symbols if str(x)[0]!="K"]

In [8]: solvefor
Out[8]: [B1, A1, D1, C1, F1, D2]

In [9]: sympy.horner(expression, wrt=solvefor)
Out[9]: B1*(A1*(D1*(KD*Ka - Ka*Kc) + D2*Ka*Kc + Ka*Kc) + D1*(-C1*KF*Ka*Kc + F1*Kc*Kl*Kz))

关于Python:列表代数简化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38168922/

相关文章:

python - 如何在Python中集成包含r的一阶导数的r函数?

javascript - 使用 django 过滤器和带有 Angular 表达式的标签

python - 从彼此中减去两个元组列表

c - 如何在不添加 printfs 的情况下在调用函数时打印函数名称?

python for 循环列表加一项

python - 使用 scipy.integrate.odeint 时出现类型错误

python - 遵循具有多个 Controller 的 MVC 规则

python - 断言 pytest 命令已运行

python - 使用 spacy 加载自定义模型时出错

python - 有没有办法让sympy将root(-1, 3)简化为-1?