Как подставить значения в объект SymPy? - PullRequest
1 голос
/ 20 марта 2020

У меня есть линейная система, которую нужно решить с помощью 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

И я получаю это

enter image description here

Теперь я выполняю форму эшелона с уменьшенным числом строк, и меня интересует выражение в красном поле:

A_rref = A.rref()
A_rref

enter image description here

Я пытаюсь использовать 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

1 Ответ

1 голос
/ 21 марта 2020

Для подстановки значений вы можете использовать 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
...