使用 SymPy 的 solve 函数反汇编 Python 程序(幕后发生了什么?)

Disassembly of a Python program using SymPy's solve function (what's going on behind the scenes?)

我有这个 Python 代码可以求解 3 变量线性方程。

import numpy as np

from sympy import *

init_printing(use_latex='mathjax')

A = Matrix([[-2,3,-1],[2,2,3],[-4,-1,1]])

x,y,z= symbols('x,y,z')
In[12]:

X =Matrix([[x],[y],[z]])

B = Matrix([[1],[1],[1]])

solve(A*X-B)

我很高兴也对那个输出感到困惑。我想了解 sympy 遵循哪些步骤来解决这个问题,以及它使用的是什么求解器?

问题的第 1 部分是 sympy 如何解决上面的 AX-B

第 2 部分:通常是否有 方法 来查看任何 python 程序的反汇编(为了理解它)?

有两种基本方法:

阅读源码

理解它的最好方法是阅读源代码。在 IPython 中,您可以键入 solve??,它会向您显示源代码,以及源代码所在的文件。您还可以查看 SymPy GitHub.

SymPy 中的

solve 有点复杂,因为它可以求解许多不同类型的方程。我相信在这种情况下,您想在未来的版本中查看 solve_linear_system, which uses row reduction. That will be replaced with linsolve,它使用基本相同的算法(Gauss-Jordan 消除)。

使用可视化调试器

了解正在发生的事情的另一种方法是在可视化调试器中单步执行代码。我推荐一个调试器,它可以向您显示正在 运行 的函数代码,以及变量列表及其值(在这方面 pdb 不是一个很好的调试器)。我个人更喜欢 PuDB,它在终端中 运行s,但也有其他好的。使用调试器的好处是您可以准确地看到正在遍历的代码路径以及变量在每个步骤中的值。