gpt4 book ai didi

sympy - 加速SymPy中符号行列式的计算

转载 作者:行者123 更新时间:2023-12-04 20:35:18 28 4
gpt4 key购买 nike

我有一个 4x4 矩阵 A在每个条目中都有相当长但简单的符号表达式。大约涉及 30 个不同的符号。 “简单”是指仅使用加法/减法、乘法/除法和整数幂来组合这些符号。 “长”是指如果我打印出矩阵,它可以覆盖三到四个屏幕。

我需要这个矩阵的行列式。或者,更具体地说,我知道行列式是一个特定符号中的四阶多项式,我需要这个多项式的系数。 A.det()运行数小时后不会终止,所以我需要一种不同的方法。有任何想法吗?到目前为止,我已经尝试抛出各种 simplifyA 的每个元素上运行没有任何成功。

是否有一些策略可以让 SymPy 知道我的表达式的简单结构,或者我知道结果是其中一个符号的多项式?

最佳答案

也许它可以为 4x4 行列式创建一般表达式

In [30]: A = Matrix(4, 4, symbols('A:4:4'))

In [31]: A
Out[31]:
⎡A₀₀ A₀₁ A₀₂ A₀₃⎤
⎢ ⎥
⎢A₁₀ A₁₁ A₁₂ A₁₃⎥
⎢ ⎥
⎢A₂₀ A₂₁ A₂₂ A₂₃⎥
⎢ ⎥
⎣A₃₀ A₃₁ A₃₂ A₃₃⎦

In [32]: A.det()
Out[32]:
A₀₀⋅A₁₁⋅A₂₂⋅A₃₃ - A₀₀⋅A₁₁⋅A₂₃⋅A₃₂ - A₀₀⋅A₁₂⋅A₂₁⋅A₃₃ + A₀₀⋅A₁₂⋅A₂₃⋅A₃₁ + A₀₀⋅A₁₃⋅A₂₁⋅A₃₂ - A₀₀⋅A₁₃⋅A₂₂⋅A₃₁ - A₀₁⋅A₁₀⋅A₂₂⋅A₃₃ + A₀₁⋅A₁₀⋅A₂₃⋅A₃₂ + A₀₁⋅A₁₂⋅A₂₀⋅
A₃₃ - A₀₁⋅A₁₂⋅A₂₃⋅A₃₀ - A₀₁⋅A₁₃⋅A₂₀⋅A₃₂ + A₀₁⋅A₁₃⋅A₂₂⋅A₃₀ + A₀₂⋅A₁₀⋅A₂₁⋅A₃₃ - A₀₂⋅A₁₀⋅A₂₃⋅A₃₁ - A₀₂⋅A₁₁⋅A₂₀⋅A₃₃ + A₀₂⋅A₁₁⋅A₂₃⋅A₃₀ + A₀₂⋅A₁₃⋅A₂₀⋅A₃₁ - A₀₂⋅A₁
₃⋅A₂₁⋅A₃₀ - A₀₃⋅A₁₀⋅A₂₁⋅A₃₂ + A₀₃⋅A₁₀⋅A₂₂⋅A₃₁ + A₀₃⋅A₁₁⋅A₂₀⋅A₃₂ - A₀₃⋅A₁₁⋅A₂₂⋅A₃₀ - A₀₃⋅A₁₂⋅A₂₀⋅A₃₁ + A₀₃⋅A₁₂⋅A₂₁⋅A₃₀

然后用类似的东西替换条目
A.det().subs(zip(list(A), list(your_matrix)))

不过,SymPy 生成 4x4 行列式的速度很慢是一个错误。您应该在 https://github.com/sympy/sympy/issues/new 报告它.

编辑(这不适合评论)

它看起来像 Matrix.det正在调用一个简化函数。对于 3x3 和更小的矩阵,行列式公式被明确写出,但对于更大的矩阵,它是使用 Bareis 算法计算的。您可以看到简化函数 ( cancel ) 的调用位置 here , 作为计算的一部分是必要的,但最终做了很多工作,因为它试图简化你非常大的表达式。仅进行取消行列式本身的项所需的简化可能会更明智。我开了 an issue为了这。

另一种加快速度的可能性(我不确定是否可行)是选择不同的行列式算法。选项是 Matrix.det(method=alg)哪里 alg"bareis" 之一(默认), "berkowitz" , 或 "det_LU" .

关于sympy - 加速SymPy中符号行列式的计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37026935/

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