Ошибка при вычислении sympy.solve - AttributeError
Всем привет.
В представленной выше матрице sigma, значения элементов не важны, важно лишь, что не равны нулю. Далее идет вычисление функции с помощью sympy.solve, y1, y2, w1, w2 - символы sympy, C - матрица.
import numpy as np
from sympy import *
# Matrices from system of equations
w = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]])
A = np.array([[1, 1, 1], [1, 1, 1], [1, 1, 1]])
chi = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]])
# Creating B-matrix which is the matroid and C-matrix
ksi = w.dot(A)
d = int(np.linalg.det(w))
ksi_wavy = ksi - d * chi
b1 = -d * np.eye(3)
b2 = ksi
b3 = ksi_wavy.astype(int)
B = np.vstack((b1, b2, b3)).astype(int)
C = np.vstack((-b1, -b2, b3)).astype(int)
print('\n Matrix B is\n', B)
print('\n Matrix C is\n', C)
n = len(B[:, ]) # The number of rows of B
print('\nN =', n)
f_1 = 0 # The number of flats of rank 1 length 1 of matroid B
f_2 = 0 # The number of flats of rank 2 length 2 of matroid B
f_3 = 0 # The number of flats of rank 2 length 3 of matroid B
f_4 = 0
f_5 = 0
array_of_flats_1 = [] # The array of flats rank of matroid B
array_of_flats_2 = [] # The array of flats rank 2 of matroid B
vec_of_incident = np.array([[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0]]) # The array of vectors e (to be changed!)
flat_length_2 = np.array([[0, 0],
[0, 0]])
flat_length_3 = np.array([[0, 0, 0],
[0, 0, 0]])
flat_length_4 = np.array([[0, 0, 0, 0],
[0, 0, 0, 0]])
flat_length_5 = np.array([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]])
sigma = np.array([[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0]]) # The array of trop(B) (to be changed!)
# Searching for flats length 1 of matroid B
def flat_one():
global array_of_flats_1, r, vec_of_incident
for i in range(n):
cond = True
for j in range(n):
if j == i:
continue
D = np.array(B[i, :])
r = np.linalg.matrix_rank(D)
E = np.array(B[j, :])
if np.linalg.matrix_rank(np.vstack((D, E))) == r:
cond = False
break
if cond:
new_line = np.zeros([1, n]).astype(int)
new_line[0, i] = 1
vec_of_incident = np.append(vec_of_incident, new_line, axis=0)
array_of_flats_1.append(i)
return
# Searching for flats length 2 of matroid B
def flat_two():
global array_of_flats_1, array_of_flats_2, r, vec_of_incident, flat_length_2
for i in range(n):
for j in range(i + 1, n):
cond = True
for k in range(n):
if k == i or k == j:
continue
D = np.array([B[i, :], B[j, :]])
r = np.linalg.matrix_rank(D)
E = np.array([B[k, :]])
if np.linalg.matrix_rank(np.vstack((D, E))) == r:
cond = False
break
if cond:
flat_line = [i, j]
if r == 1:
new_line = np.zeros([1, n]).astype(int)
new_line[0, i] = 1
new_line[0, j] = 1
vec_of_incident = np.append(vec_of_incident, new_line, axis=0)
array_of_flats_1.append(flat_line)
elif r == 2:
flat_length_2 = np.append(flat_length_2, np.array([[i, j]]), axis=0)
array_of_flats_2.append(flat_line)
return
# Searching for flats length 3 of matroid B
def flat_three():
global array_of_flats_1, array_of_flats_2, r, vec_of_incident, flat_length_3
for i in range(n):
for j in range(i + 1, n):
for k in range(j + 1, n):
cond = True
for q in range(n):
if q == k or q == j or q == i:
continue
D = np.array([B[i, :], B[j, :], B[k, :]])
r = np.linalg.matrix_rank(D)
E = np.array([B[q, :]])
if np.linalg.matrix_rank(np.vstack((D, E))) == r:
cond = False
break
if cond:
flat_line = [i, j, k]
if r == 1:
new_line = np.zeros([1, n]).astype(int)
new_line[0, i] = 1
new_line[0, j] = 1
new_line[0, k] = 1
vec_of_incident = np.append(vec_of_incident, new_line, axis=0)
array_of_flats_1.append(flat_line)
elif r == 2:
flat_length_3 = np.append(flat_length_3, np.array([[i, j, k]]), axis=0)
array_of_flats_2.append(flat_line)
return
# Searching for flats length 4 of matroid B
def flat_four():
global array_of_flats_1, array_of_flats_2, r, vec_of_incident, flat_length_4
for i in range(n):
for j in range(i + 1, n):
for k in range(j + 1, n):
for t in range(k + 1, n):
cond = True
for q in range(n):
if q == k or q == j or q == i or q == t:
continue
D = np.array([B[i, :], B[j, :], B[k, :], B[t, :]])
r = np.linalg.matrix_rank(D)
E = np.array([B[q, :]])
if np.linalg.matrix_rank(np.vstack((D, E))) == r:
cond = False
break
if cond:
flat_line = [i, j, k, t]
if r == 1:
new_line = np.zeros([1, n]).astype(int)
new_line[0, i] = 1
new_line[0, j] = 1
new_line[0, k] = 1
new_line[0, t] = 1
vec_of_incident = np.append(vec_of_incident, new_line, axis=0)
array_of_flats_1.append(flat_line)
elif r == 2:
flat_length_4 = np.append(flat_length_4, np.array([[i, j, k, t]]), axis=0)
array_of_flats_2.append(flat_line)
return
# Searching for flats length 5 of matroid B
def flat_five():
global array_of_flats_1, array_of_flats_2, r, vec_of_incident, flat_length_5
for i in range(n):
for j in range(i + 1, n):
for k in range(j + 1, n):
for t in range(k + 1, n):
for m in range(t + 1, n):
cond = True
for q in range(n):
if q == k or q == j or q == i or q == t or q == m:
continue
D = np.array([B[i, :], B[j, :], B[k, :], B[t, :], B[m, :]])
r = np.linalg.matrix_rank(D)
E = np.array([B[q, :]])
if np.linalg.matrix_rank(np.vstack((D, E))) == r:
cond = False
break
if cond:
flat_line = [i, j, k, t, m]
if r == 1:
new_line = np.zeros([1, n]).astype(int)
new_line[0, i] = 1
new_line[0, j] = 1
new_line[0, k] = 1
new_line[0, t] = 1
new_line[0, m] = 1
vec_of_incident = np.append(vec_of_incident, new_line, axis=0)
array_of_flats_1.append(flat_line)
elif r == 2:
flat_length_5 = np.append(flat_length_5, np.array([[i, j, k, t, m]]), axis=0)
array_of_flats_2.append(flat_line)
return
flat_one()
flat_two()
flat_three()
flat_four()
flat_five()
print('\nFlats rank 1\n', array_of_flats_1)
print('\nFlats rank 2\n', array_of_flats_2)
vec_of_incident = np.delete(vec_of_incident, 0, 0)
vec_of_incident = np.delete(vec_of_incident, 0, 0)
print('\nvec_of_incident\n', vec_of_incident)
flat_length_2 = np.delete(flat_length_2, 0, 0)
flat_length_2 = np.delete(flat_length_2, 0, 0)
flat_length_3 = np.delete(flat_length_3, 0, 0)
flat_length_3 = np.delete(flat_length_3, 0, 0)
flat_length_4 = np.delete(flat_length_4, 0, 0)
flat_length_4 = np.delete(flat_length_4, 0, 0)
flat_length_5 = np.delete(flat_length_5, 0, 0)
flat_length_5 = np.delete(flat_length_5, 0, 0)
print('\nFlat length 2\n', flat_length_2)
print('\nFlat length 3\n', flat_length_3)
print('\nFlat length 4\n', flat_length_4)
print('\nFlat length 5\n', flat_length_5)
# Filling in sigma
sigma_line = np.zeros([1, len(B)]).astype(int)
for i in np.arange(len(flat_length_2)):
for j in np.arange(len(flat_length_2[0, :])):
for k in np.arange(len(vec_of_incident)):
if vec_of_incident[k, flat_length_2[i, j]] == 1:
new_line = np.array([vec_of_incident[k, :]])
sigma_line += new_line
sigma = np.append(sigma, sigma_line, axis=0)
sigma_line = np.zeros([1, len(B)]).astype(int)
for i in np.arange(len(flat_length_3)):
for j in np.arange(len(flat_length_3[0, :])):
for k in np.arange(len(vec_of_incident)):
if vec_of_incident[k, flat_length_3[i, j]] == 1:
new_line = np.array([vec_of_incident[k, :]])
sigma_line += new_line
sigma = np.append(sigma, sigma_line, axis=0)
sigma_line = np.zeros([1, len(B)]).astype(int)
for i in np.arange(len(flat_length_4)):
for j in np.arange(len(flat_length_4[0, :])):
for k in np.arange(len(vec_of_incident)):
if vec_of_incident[k, flat_length_4[i, j]] == 1:
new_line = np.array([vec_of_incident[k, :]])
sigma_line += new_line
sigma = np.append(sigma, sigma_line, axis=0)
sigma_line = np.zeros([1, len(B)]).astype(int)
for i in np.arange(len(flat_length_5)):
for j in np.arange(len(flat_length_5[0, :])):
for k in np.arange(len(vec_of_incident)):
if vec_of_incident[k, flat_length_5[i, j]] == 1:
new_line = np.array([vec_of_incident[k, :]])
sigma_line += new_line
sigma = np.append(sigma, sigma_line, axis=0)
sigma_line = np.zeros([1, len(B)]).astype(int)
sigma = np.delete(sigma, 0, 0)
sigma = np.delete(sigma, 0, 0)
print('\nsigma\n', sigma)
# Searching for intersections
y1, y2, w1, w2 = symbols('y1 y2 w1 w2')
s = -1
k = -1
def f(s, new_line_1, k, new_line_2):
return np.dot(y1, C[s, :]) + np.dot(y2, new_line_1) - np.dot(w1, C[k, :]) - np.dot(w2, new_line_2)
new_line_1 = np.zeros([1, len(C[0, :])]).astype(int)
new_line_2 = np.zeros([1, len(C[0, :])]).astype(int)
intersection_1 = [] # The list of intersections
intersection_2 = [] # The list of intersections
for i in np.arange(len(sigma[:, ]) - 1):
for t in np.arange(i + 1, len(sigma[:, ])):
for j in np.arange(len(sigma[0, :])):
if sigma[i, j] != 0:
if s == -1:
s = j
intersection_1.append(s)
else:
new_line_1 += C[j, :]
intersection_1.append(j)
if sigma[t, j] != 0:
if k == -1:
k = j
intersection_2.append(k)
else:
new_line_2 += C[j, :]
intersection_2.append(j)
solution = solve(f(s, new_line_1, k, new_line_2), [y1, y2, w1, w2])
s = -1
k = -1
intersection_1 = []
intersection_2 = []
В результате чего выдает ошибку:
Traceback (most recent call last):
File "D:\PythonAssignments\Python3.9\VKR.py", line 307, in <module>
solution = solve(f(s, new_line_1, k, new_line_2), [y1, y2, w1, w2])
File "D:\PythonAssignments\Python3.9\Python\lib\site-packages\sympy\solvers\solvers.py", line 1097, in solve
solution = _solve_system(f, symbols, **flags)
File "D:\PythonAssignments\Python3.9\Python\lib\site-packages\sympy\solvers\solvers.py", line 1797, in _solve_system
i, d = _invert(g, *symbols)
File "D:\PythonAssignments\Python3.9\Python\lib\site-packages\sympy\solvers\solvers.py", line 3028, in _invert
indep, dep = lhs.as_independent(*symbols)
AttributeError: 'ImmutableDenseNDimArray' object has no attribute 'as_independent'
Кто-нибудь может подсказать в связи с чем возникает ошибка? Из-за того, что в функцию передаю ndarray? Буду благодарен за Ваш ответ.

