Ошибка при вычислении 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? Буду благодарен за Ваш ответ.


Ответы (0 шт):