gpt4 book ai didi

sympy - 将 sympy 表达式转换为向量以找到线性独立的子集

转载 作者:行者123 更新时间:2023-12-02 08:30:01 28 4
gpt4 key购买 nike

我有一个表达式列表,例如 4.0*x[0] + 5.0*x[10] + 1 = 0我想根据 [4.0, 0, 0, ..., 5.0, ... , 1] 等系数将它们转换为向量。原因是我的一些方程可能是线性相关的,我想从 numpy 库运行 QR,这样我就可以找到一个线性独立的子集。

我可以通过 expr.replace(x[i], 0)i 通配符索引来获得常数项。我还可以通过 expr.atoms(Mul) 获得大部分其他项,这为我提供了集合 4.0*x[0], 5.0*x[10] 然后对于这些表达式中的每一个,我都可以执行 expr.atoms(Indexed).pop()expr.atoms(Float).pop() 来拆分部分。

问题是当我有一个像 x[0] + 5.0*x[10] + 1 = 0 这样的表达式时,其中第一个变量以 1< 的隐式系数出现。该术语不再被识别为 Mul 对象。

无论如何,我认为可能有更好的方法来实现我的目标?

最佳答案

如果您给符号一个特定的顺序,如下面的代码所示,您可以将表达式转换为多项式并获取其系数:

>>> from sympy import *
>>> x, y, z, t = symbols('x y z t')
>>> a1, a2, a3, a4 = symbols('a[1], a[2], a[3], a[4]')
>>> used_symbols = (a1, a2, a3, a4)
>>> replacements = [(n, x**(enu+1)) for enu,n in enumerate(used_symbols)]
>>> expr = 5 + a1 + 4*a4
>>> Poly(expr.subs(replacements)).all_coeffs()
[4, 0, 0, 1, 5]

如果事先不知道使用以下递归函数,您也可以检索所用符号的列表:

def retrieve_used_symbols(expr):
"""Return the symbols used in the `expr` in a list."""
used_symbols = []
for term in expr.args:
if term.is_Atom and term.is_Symbol:
used_symbols.append(term)
else:
used_symbols.extend(retrieve_used_symbols(term))
return used_symbols

当你有混合符号时,后者会派上用场:

>>> crazy_expr = expr + 10*y-2*z
>>> crazy_expr
a[1] + 4*a[4] + 10*y - 2*z + 5
>>> used_symbols = retrieve_used_symbols(crazy_expr)
>>> replacements = [(n, x**(enu+1)) for enu,n in enumerate(used_symbols)]
>>> Poly(crazy_expr.subs(replacements)).all_coeffs()
[4, -2, 1, 10, 5]
>>> list(reversed(used_symbols))
[a[4], z, a[1], y]

对于 IndexedBase 对象,它更简单:

coeffs = [expr.coeff(x[i]) for i in range(10)]

但是您仍然需要添加常数项,正如您所说,您可以从通配符替换中获得常数项:

ind = Wild('i')
constant_term = expr.replace(x[ind], 0)

关于sympy - 将 sympy 表达式转换为向量以找到线性独立的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27992391/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com