首页 > 解决方案 > 如何替换 SymPy 对象中的值?

问题描述

我有一个要解决的线性系统SymPy,我将增强矩阵编写为 SymPy 对象。

a, b, c = sy.symbols('a, b, c', real = True)
A = sy.Matrix([[1, 2, -3, a], [4, -1, 8, b], [2, -6, -4, c]])
A

我明白了

在此处输入图像描述

现在我进行行缩减梯队形式,我对红框中的表达感兴趣:

A_rref = A.rref()
A_rref

在此处输入图像描述

我尝试使用a = sy.Interger(3), b = sy.Interger(6),c = sy.Interger(7),但是如何替换这些值来评估红框中的表达式?

我还检查了红色框中的表达式类型。这是一个什么样的物体?

In[13]: type(A_rref[0][0,3])
 Out[13]: sympy.core.add.Add

标签: pythonmatrixsympy

解决方案


要替换值,您可以使用subs将每个变量映射到其值的字典。

请注意,仅在使用常量的分数sy.Integer(1)时才需要使用或类似的表达式,以避免 Python 在 sympy 掌握它之前将这些分数转换为浮点数。

import sympy as sy

a, b, c = sy.symbols('a, b, c', real = True)
A = sy.Matrix([[1, 2, -3, a], [4, -1, 8, b], [2, -6, -4, c]])
A_rref = A.rref()
print(A_rref[0].subs({a: 3, b: 6, c: 7}))

输出:

Matrix([[1, 0, 0, 31/14],
        [0, 1, 0, -16/91],
        [0, 0, 1, -69/182]])

要了解 sympy 表达式是如何构建的,srepr可以派上用场:

print(sy.srepr(A_rref[0][0,3]))

这使:

Add(Mul(Rational(2, 7), Symbol('a', real=True)), Mul(Rational(1, 7), Symbol('b', real=True)), Mul(Rational(1, 14), Symbol('c', real=True)))

因此,表达式是子表达式的树。在最高级别,有一个总和,所以这就是打印type. 这篇文章包含一些将表达式树绘制为文本图的代码:

    +---> symbol Rational(1, 7)
    |   
    +---> symbol Symbol('b', real=True)
    |   
+---+ function <class 'sympy.core.mul.Mul'> had 2 arguments
|   
|   +---> symbol Rational(1, 14)
|   |   
|   +---> symbol Symbol('c', real=True)
|   |   
+---+ function <class 'sympy.core.mul.Mul'> had 2 arguments
|   
|   +---> symbol Rational(2, 7)
|   |   
|   +---> symbol Symbol('a', real=True)
|   |   
+---+ function <class 'sympy.core.mul.Mul'> had 2 arguments
|   
+ function <class 'sympy.core.add.Add'> had 3 arguments

推荐阅读