Как мне найти размерность диапазона пересечения/объединения двух нулевых пространств матриц разных размеров с помощью numpy/scipy?

Мне нужно найти $dim(span(H\cap G))$ и $dim(span(H\cup G))$, где H и G определены следующим образом:

Я понятия не имею, как найти пересечение/объединение их нулевых пространств, и после этого я не знаю, как найти пролет и яркость.

матрица А имеет размеры 5х18, а матрица Б — 8х18.

Это то, что я пробовал, используя null_space Scipy; похоже, что он находит нулевые пробелы, но терпит неудачу в части пересечения, и я не нашел специальной функции пересечения/объединения.

import numpy as np
import sympy as sp
from sympy import *
from scipy.linalg import null_space

A = np.matrix([[2 ,0 ,3 ,-1 ,2 ,-1 ,6 ,-4 ,7 ,8 ,-1 ,-4 ,7 ,0 ,0 ,0 ,0 ,7 ],
               [-6 ,-7 ,-9 ,10 ,1 ,10 ,-4 ,12 ,-7 ,4 ,-4 ,5 ,-7 ,0 ,0 ,0 ,7 ,0 ],
               [10 ,0 ,8 ,-12 ,-4 ,-5 ,-5 ,-13 ,0 ,5 ,2 ,1 ,0 ,0 ,0 ,7 ,0 ,0],
               [8 ,0 ,5 ,-4 ,1 ,-4 ,3 ,-9 ,7 ,11 ,3 ,-2 ,7 ,0 ,7 ,0 ,0 ,0 ],
               [-9 ,-7 ,-3 ,8 ,5 ,8 ,1 ,11 ,0 ,-1 ,1 ,-3 ,0 ,7 ,0 ,0 ,0 ,0 ]])

B = np.matrix([[3 ,2 ,3 ,-1 ,5 ,-5 ,2 ,0 ,-3 ,5 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,2 ],
             [39 ,26 ,27 ,-13 ,29 ,-25 ,-4 ,-2 ,-7 ,21 ,0 ,0 ,0 ,0 ,0 ,0 ,32 ,0 ],
             [-5 ,18 ,31 ,-9 ,25 ,-5 ,12 ,-26 ,5 ,17 ,0 ,0 ,0 ,0 ,0 ,32 ,0 ,0 ],
             [25 ,6 ,21 ,-3 ,19 ,-23 ,4 ,-14 ,-9 ,27 ,0 ,0 ,0 ,0 ,16 ,0 ,0 ,0 ],
             [-3 ,-6 ,-3 ,1 ,-5 ,1 ,-4 ,2 ,3 ,-1 ,0 ,0 ,0 ,4 ,0 ,0 ,0 ,0 ],
             [-47 ,-10 ,-35 ,5 ,-53 ,17 ,4 ,-14 ,79 ,-13 ,0 ,0 ,32 ,0 ,0 ,0 ,0 ,0 ],
             [67 ,66 ,71 ,-33 ,81 ,-61 ,76 ,-10 ,-67 ,41 ,0 ,32 ,0 ,0 ,0 ,0 ,0 ,0 ],
             [59 ,18 ,31 ,-41 ,57 ,-37 ,12 ,6 ,-59 ,49 ,32 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ]])

An = null_space(A)
Bn = null_space(B)

intersect = An[np.where(An==Bn)]
print(intersect)

Почему sympy импорт? Числовые и символические пакеты плохо интегрированы.

hpaulj 01.07.2024 18:50

Каков ожидаемый результат? Можете ли вы добавить это к вопросу? Вам нужны только размеры?

user24714692 01.07.2024 18:58

@hpaulj он использовался в другом вопросе, где это требовалось, здесь это не требуется.

Nate3384 01.07.2024 19:19

@user24714692 user24714692 Я не знаю ответа, мне бы хотелось иметь возможность распечатать каждый шаг пути для моего понимания и отладки, но да, мне нужно только окончательное решение (которое представляет собой dim(span(intersect(H,G)) ))

Nate3384 01.07.2024 19:19

Имейте в виду, что у вас есть несколько типов читателей. Некоторые уже работали с подобными проблемами раньше и могут ответить, не задумываясь и не исследуя их. Другие заинтересованы достаточно, чтобы скопировать и вставить ваш пример в интерактивный сеанс и изучить промежуточные значения. Я, например, хотел бы сначала увидеть эти отладочные значения (я не всегда читаю эти вопросы со своего компьютера). А есть те, у которых 30 секунд концентрации внимания заканчиваются, прежде чем они понимают эту проблему. :)

hpaulj 01.07.2024 19:29

@hpaulj, ты прав, но в этом задании я должен давать только окончательные ответы (это веб-задание)

Nate3384 01.07.2024 19:40
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
6
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пересечение нулевых пространств охватывается набором векторов vi, для которых и A @ vi = 0, и B @ vi = 0, где 0 представляет нулевой вектор соответствующего размера. Вы можете найти vi, сложив две матрицы и взяв нулевое пространство.

Cn = null_space(np.vstack((A, B)))
np.testing.assert_allclose(A @ Cn, 0, atol=5e-14)
np.testing.assert_allclose(B @ Cn, 0, atol=5e-14)
# both tests pass

Вы можете получить набор векторов, охватывающий объединение нулевых пространств, объединив векторы нулевого пространства (т. е. сложив An и Bn, которые вы нашли).

np.vstack((An.T, Bn.T))

Однако в общем случае эти векторы не будут линейно независимыми. Если вам нужен минимальный набор векторов, охватывающий объединение нулевых пространств, самый краткий способ, который я могу придумать, — это взять нулевое пространство из нулевого пространства этих векторов.

Dn = null_space(null_space(np.vstack((An.T, Bn.T))).T)

np.linalg.matrix_rank находит размерность набора векторов.

# note that it doesn't matter whether we transpose or not
np.linalg.matrix_rank(Cn)  # 7
np.linalg.matrix_rank(Dn)  # 16

Если вам просто нужен размер диапазона объединения, вам не обязательно удалять избыточность перед получением ранга.

np.linalg.matrix_rank(np.vstack((An.T, Bn.T)))  # 16

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

это для перекрестка/союза? и как мне найти dim(span())?

Nate3384 01.07.2024 21:54

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

Matt Haberland 01.07.2024 23:34

просто чтобы уточнить, ранг Cn равен пересечению, а ранг Dn равен объединению?

Nate3384 02.07.2024 08:31

Да. Однако, пожалуйста, изучите теорию, если это задание. Вы можете сделать вывод, что Cn — это пересечение, просто потому, что пересечение будет меньше объединения, а 7 меньше 16.

Matt Haberland 03.07.2024 01:48

Другие вопросы по теме