Мне нужно найти $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)
Каков ожидаемый результат? Можете ли вы добавить это к вопросу? Вам нужны только размеры?
@hpaulj он использовался в другом вопросе, где это требовалось, здесь это не требуется.
@user24714692 user24714692 Я не знаю ответа, мне бы хотелось иметь возможность распечатать каждый шаг пути для моего понимания и отладки, но да, мне нужно только окончательное решение (которое представляет собой dim(span(intersect(H,G)) ))
Имейте в виду, что у вас есть несколько типов читателей. Некоторые уже работали с подобными проблемами раньше и могут ответить, не задумываясь и не исследуя их. Другие заинтересованы достаточно, чтобы скопировать и вставить ваш пример в интерактивный сеанс и изучить промежуточные значения. Я, например, хотел бы сначала увидеть эти отладочные значения (я не всегда читаю эти вопросы со своего компьютера). А есть те, у которых 30 секунд концентрации внимания заканчиваются, прежде чем они понимают эту проблему. :)
@hpaulj, ты прав, но в этом задании я должен давать только окончательные ответы (это веб-задание)
Пересечение нулевых пространств охватывается набором векторов 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())?
Я обновил свой ответ. Прошло очень много времени с тех пор, как я изучал линейную алгебру, поэтому вы можете написать об обмене математическим стеком, чтобы получить лучшее объяснение.
просто чтобы уточнить, ранг Cn равен пересечению, а ранг Dn равен объединению?
Да. Однако, пожалуйста, изучите теорию, если это задание. Вы можете сделать вывод, что Cn
— это пересечение, просто потому, что пересечение будет меньше объединения, а 7 меньше 16.
Почему
sympy
импорт? Числовые и символические пакеты плохо интегрированы.