Решение проблем с сиболами: неподдерживаемые типы операндов для *: ‘Symbol’ и ‘Equality’

#python #equation #solver #symbolic-math

#python #уравнение #решатель #символьно-математический

Вопрос:

У меня возникла проблема при использовании solve. Я пытаюсь решить с помощью сиболической математики, и она отлично работает с 2 уравнениями и 2 переменными, см. Первый ввод и вывод.

Когда я использую решение с 4 уравнениями и 4 переменными, я получаю ошибку, показанную во втором вводе.

Ввод: для 2 уравнений и 2 переменных

 from sympy import *
import numpy as np
import math
import matplotlib.pyplot as plt
import scipy.linalg as la

a, a0, a1, a2, a3 = symbols('a, a_0, a_1, a_2, a_3')
b, b0, b1, b2, b3 = symbols('b, b_0, b_1, b_2, b_3')
u1, u2 = symbols('u_1, u_2')

a = Eq(0,a0 a1*0 a2*0 a3*0*0)
b = Eq(0,a0 a1*0 a2*b a3*0*b)

sol = solve((a, b),(a0,a2))
pprint(sol)
 

Вывод

 {a₀: 0, a₂: 0}
 

Ввод: для 4 уравнений 4 переменные

 from sympy import *
import numpy as np
import math
import matplotlib.pyplot as plt
import scipy.linalg as la
a, a0, a1, a2, a3 = symbols('a, a_0, a_1, a_2, a_3')
b, b0, b1, b2, b3 = symbols('b, b_0, b_1, b_2, b_3')
u1, u2 = symbols('u_1, u_2')

a = Eq(0,a0 a1*0 a2*0 a3*0*0)
b = Eq(0,a0 a1*0 a2*b a3*0*b)
c = Eq(u1,a0 a1*a a2*0 a3*a*0)

sol = solve((a,b,c),(a0,a1,a2))
 

Вывод

 ---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-268-eb18268f41f0> in <module>
      6 a = Eq(0,a0 a1*0 a2*0 a3*0*0)
      7 b = Eq(0,a0 a1*0 a2*b a3*0*b)
----> 8 c = Eq(u1,a0 a1*a a2*0 a3*a*0)
      9 d = Eq(u2,a 0 a1*a a2*b a3*a*b)
      10 

 TypeError: unsupported operand type(s) for *: 'Symbol' and 'Equality'
 

Я не могу понять это сообщение об ошибке, я имею в виду, что я также использую символы в версии с 2 переменными.

Ответ №1:

Ошибки в python, как правило, носят довольно описательный характер. A TypeError подсказывает, что вы пытались выполнить какую-то операцию с типом объекта, который его не поддерживает, например, деление числа на строку. Если вы когда-нибудь столкнетесь с обработчиком заголовков с такой ошибкой, начните разбивать нарушающую строку на более мелкие части и вызывайте type() , чтобы узнать, какой тип он выдает, пока не найдете неправильный. Затем вы можете выяснить, почему это было не то, что вы ожидали.

В этом случае ошибка говорит, что вы не можете умножить символ и равенство. Вы начинаете с этой строки

 a, a0, a1, a2, a3 = symbols('a, a_0, a_1, a_2, a_3')
 

где a это символ. Но тогда вы делаете

 a = Eq(0,a0 a1*0 a2*0 a3*0*0)
 

и вы переназначили a равенство. Итак, когда придет время сделать a1*a в следующей строке

 c = Eq(u1,a0 a1*a a2*0 a3*a*0)
 

вы получаете ошибку, упомянутую выше. Если вы присвоите свои равенства чему-то другому, например, A , B , и C , у вас не будет никаких проблем. Предполагая, что a , b , и c являются правильными символами. Все зависит от того, какие уравнения вы пытаетесь выразить.


На самом деле у вас та же проблема, что и в вашем первом примере, но она не выражается, потому что вы не выполняете никаких математических операций с равенствами и символами.

 b = Eq(0,a0 a1*0 a2*b a3*0*b)
 

Причина, по которой это работает, заключается в том, что вы сначала вычисляете RHS, а затем присваиваете результат этому LHS. Таким b образом, в равенстве все еще ссылается на символ, и выражение является законным. Но после переназначения переменной b вы больше не сможете использовать ее в качестве символа.

Комментарии:

1. Спасибо за помощь и отличный совет. Я новичок в python, поэтому каждый маленький совет помогает 🙂