.. _section-linalg: ÐÐ¸Ð½ÐµÐ¹Ð½Ð°Ñ Ð°Ð»Ð³ÐµÐ±Ñа ================ Sage поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑÑандаÑÑнÑе конÑÑÑÑкÑии из линейной алгебÑÑ, как Ñ Ð°ÑакÑеÑиÑÑиÑеÑкие полиномÑ, ÑÑÑпенÑаÑÑе ÑоÑмÑ, ÑÑÐ¼Ð¼Ñ ÑлеменÑов главной диагонали маÑÑиÑÑ, ÑазложениÑ. СоздаваÑÑ Ð¸ пеÑемножаÑÑ Ð¼Ð°ÑÑиÑÑ Ð»ÐµÐ³ÐºÐ¾: :: sage: A = Matrix([[1,2,3],[3,2,1],[1,1,1]]) sage: w = vector([1,1,-4]) sage: w*A (0, 0, 0) sage: A*w (-9, 1, -2) sage: kernel(A) Free module of degree 3 and rank 1 over Integer Ring Echelon basis matrix: [ 1 1 -4] РеÑение маÑÑиÑнÑÑ ÑÑавнений Ñакже вÑполнÑеÑÑÑ Ð±ÐµÐ· заÑÑÑднений, иÑполÑзÑÑ Ð¼ÐµÑод ``solve_right``. ÐÑÑиÑление ``A.solve_right(Y)`` возвÑаÑÐ¸Ñ Ð¼Ð°ÑÑиÑÑ (или векÑоÑ) :math:`X` Ñакой, ÑÑо :math:`AX=Y`: .. link :: sage: Y = vector([0, -4, -1]) sage: X = A.solve_right(Y) sage: X (-2, 1, 0) sage: A * X # пÑовеÑка... (0, -4, -1) ``\`` Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ÑполÑзован вмеÑÑо ``solve_right``; иÑполÑзÑйÑе ``A \ Y`` вмеÑÑо ``A.solve_right(Y)``. .. link :: sage: A \ Y (-2, 1, 0) ÐÑли ÑеÑÐµÐ½Ð¸Ñ Ð½Ðµ ÑÑÑеÑÑвÑеÑ, Ñо Sage веÑÐ½ÐµÑ Ð¾ÑибкÑ: .. skip :: sage: A.solve_right(w) Traceback (most recent call last): ... ValueError: matrix equation has no solutions ÐÑполÑзÑйÑе ``A.solve_left(Y)``, ÑÑÐ¾Ð±Ñ Ð½Ð°Ð¹Ñи :math:`X` в :math:`XA=Y`. Sage Ð¼Ð¾Ð¶ÐµÑ Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑ ÑобÑÑвенное ÑиÑло и ÑобÑÑвеннÑй векÑоÑ:: sage: A = matrix([[0, 4], [-1, 0]]) sage: A.eigenvalues () [-2*I, 2*I] sage: B = matrix([[1, 3], [3, 1]]) sage: B.eigenvectors_left() [(4, [ (1, 1) ], 1), (-2, [ (1, -1) ], 1)] (РезÑлÑÑÐ°Ñ ``eigenvectors_left`` - ÑÑо ÑпиÑок ÑÑоек: (ÑобÑÑвенное ÑиÑло, ÑобÑÑвеннÑй векÑоÑ, многообÑазие).) СобÑÑвеннÑе ÑиÑла и векÑоÑа Ð´Ð»Ñ ``QQ`` или ``RR`` Ñакже могÑÑ Ð±ÑÑÑ Ð²ÑÑиÑÐ»ÐµÐ½Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Maxima (Ñм. :ref:`section-maxima`). Ðак Ñказано в Ñазделе :ref:`section-rings`, колÑÑо, в коÑоÑом опÑеделена маÑÑиÑа, влиÑÐµÑ Ð½Ð° некоÑоÑÑе ее ÑвойÑÑва. Ð ÑледÑÑÑем пÑимеÑе пеÑвÑй аÑгÑÐ¼ÐµÐ½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ``matrix`` ÑообÑÐ°ÐµÑ Sage, ÑÑÐ¾Ð±Ñ Ð¼Ð°ÑÑиÑа ÑаÑÑмаÑÑивалаÑÑ ÐºÐ°Ðº маÑÑиÑа ÑелÑÑ ÑиÑел (ÑлÑÑай Ñ ``ZZ``), как маÑÑиÑа ÑаÑионалÑнÑÑ ÑиÑел (``QQ``) или как маÑÑиÑа веÑеÑÑвеннÑÑ ÑиÑел (``RR``): :: sage: AZ = matrix(ZZ, [[2,0], [0,1]]) sage: AQ = matrix(QQ, [[2,0], [0,1]]) sage: AR = matrix(RR, [[2,0], [0,1]]) sage: AZ.echelon_form() [2 0] [0 1] sage: AQ.echelon_form() [1 0] [0 1] sage: AR.echelon_form() [ 1.00000000000000 0.000000000000000] [0.000000000000000 1.00000000000000] ÐÐ»Ñ Ð²ÑÑиÑÐ»ÐµÐ½Ð¸Ñ ÑобÑÑвеннÑÑ Ð·Ð½Ð°Ñений и ÑобÑÑвеннÑÑ Ð²ÐµÐºÑоÑов маÑÑÐ¸Ñ Ð´ÐµÐ¹ÑÑвиÑелÑнÑÑ Ð¸Ð»Ð¸ комплекÑнÑÑ ÑиÑел Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой, маÑÑиÑа должна бÑÑÑ Ð¾Ð¿Ñеделена над ``RDF`` (Real Double Field) или ``CDF`` (Complex Double Field), ÑооÑвеÑÑÑвенно. ÐÑли колÑÑо не Ñказано, и в маÑÑиÑе иÑполÑзÑÑÑÑÑ Ð´ÐµÐ¹ÑÑвиÑелÑнÑе или комплекÑнÑе конÑÑанÑÑ Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой, Ñо (по ÑмолÑаниÑ) она опÑеделена над не вÑегда поддеÑживаÑÑими Ñакие вÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»Ñми ``RR`` или ``CC``, ÑооÑвеÑÑÑвенно:: sage: ARDF = matrix(RDF, [[1.2, 2], [2, 3]]) sage: ARDF.eigenvalues() [-0.0931712199461, 4.29317121995] sage: ACDF = matrix(CDF, [[1.2, I], [2, 3]]) sage: ACDF.eigenvectors_right() [(0.881845698329 - 0.820914065343*I, [(0.750560818381, -0.616145932705 + 0.238794153033*I)], 1), (3.31815430167 + 0.820914065343*I, [(0.145594698293 + 0.37566908585*I, 0.915245825866)], 1)] ÐаÑÑиÑное пÑоÑÑÑанÑÑво ---------------------- Создадим пÑоÑÑÑанÑÑво :math:`\text{Mat}_{3\times 3}(\QQ)`, ÑоÑÑоÑÑее из маÑÑÐ¸Ñ `3 \times 3` Ñ ÑлеменÑами из ÑаÑионалÑнÑÑ ÑиÑел: :: sage: M = MatrixSpace(QQ,3) sage: M Full MatrixSpace of 3 by 3 dense matrices over Rational Field (ÐÐ»Ñ Ñого, ÑÑÐ¾Ð±Ñ ÑоздаÑÑ Ð¿ÑоÑÑÑанÑÑво из маÑÑÐ¸Ñ 3 на 4, иÑполÑзÑйÑе ``MatrixSpace(QQ,3,4)``. ÐÑли ÑиÑло ÑÑолбÑов не Ñказано, по ÑмолÑÐ°Ð½Ð¸Ñ Ð¾Ð½Ð¾ бÑÐ´ÐµÑ Ñавно ÑиÑÐ»Ñ ÑÑÑок (``MatrixSpace(QQ,3)`` ÑквиваленÑно ``MatrixSpace(QQ,3,3)``.) ÐаÑÑиÑное пÑоÑÑÑанÑÑво Ð¸Ð¼ÐµÐµÑ Ð±Ð°Ð·Ð¸Ñ, коÑоÑÑй ÑодеÑжиÑÑÑ Ð² Sage в виде ÑпиÑка: .. link :: sage: B = M.basis() sage: len(B) 9 sage: B[1] [0 1 0] [0 0 0] [0 0 0] Создадим маÑÑиÑÑ ÐºÐ°Ðº ÑÐ»ÐµÐ¼ÐµÐ½Ñ ``M``. .. link :: sage: A = M(range(9)); A [0 1 2] [3 4 5] [6 7 8] Ðалее покажем вÑÑиÑление маÑÑиÑ, опÑеделеннÑÑ Ð² конеÑнÑÑ Ð¿Ð¾Ð»ÑÑ : :: sage: M = MatrixSpace(GF(2),4,8) sage: A = M([1,1,0,0, 1,1,1,1, 0,1,0,0, 1,0,1,1, ... 0,0,1,0, 1,1,0,1, 0,0,1,1, 1,1,1,0]) sage: A [1 1 0 0 1 1 1 1] [0 1 0 0 1 0 1 1] [0 0 1 0 1 1 0 1] [0 0 1 1 1 1 1 0] sage: rows = A.rows() sage: A.columns() [(1, 0, 0, 0), (1, 1, 0, 0), (0, 0, 1, 1), (0, 0, 0, 1), (1, 1, 1, 1), (1, 0, 1, 1), (1, 1, 0, 1), (1, 1, 1, 0)] sage: rows [(1, 1, 0, 0, 1, 1, 1, 1), (0, 1, 0, 0, 1, 0, 1, 1), (0, 0, 1, 0, 1, 1, 0, 1), (0, 0, 1, 1, 1, 1, 1, 0)] Создадим подпÑоÑÑÑанÑÑво в `\GF{2}`, Ð¾Ñ Ð²Ð°ÑÑваÑÑее вÑÑепеÑеÑиÑленнÑе ÑÑÑоки. .. link :: sage: V = VectorSpace(GF(2),8) sage: S = V.subspace(rows) sage: S Vector space of degree 8 and dimension 4 over Finite Field of size 2 Basis matrix: [1 0 0 0 0 1 0 0] [0 1 0 0 1 0 1 1] [0 0 1 0 1 1 0 1] [0 0 0 1 0 0 1 1] sage: A.echelon_form() [1 0 0 0 0 1 0 0] [0 1 0 0 1 0 1 1] [0 0 1 0 1 1 0 1] [0 0 0 1 0 0 1 1] РазÑÐµÐ¶ÐµÐ½Ð½Ð°Ñ Ð»Ð¸Ð½ÐµÐ¹Ð½Ð°Ñ Ð°Ð»Ð³ÐµÐ±Ñа ---------------------------- Sage поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑазÑеженнÑÑ Ð»Ð¸Ð½ÐµÐ¹Ð½ÑÑ Ð°Ð»Ð³ÐµÐ±ÑÑ. :: sage: M = MatrixSpace(QQ, 100, sparse=True) sage: A = M.random_element(density = 0.05) sage: E = A.echelon_form() ÐÑлÑÑимодÑлÑнÑй алгоÑиÑм в Sage ÑабоÑÐ°ÐµÑ Ñ Ð¾ÑоÑо Ð´Ð»Ñ ÐºÐ²Ð°Ð´ÑаÑнÑÑ Ð¼Ð°ÑÑÐ¸Ñ (но не Ñак Ñ Ð¾ÑоÑо Ð´Ð»Ñ Ð½ÐµÐºÐ²Ð°Ð´ÑаÑнÑÑ Ð¼Ð°ÑÑиÑ): :: sage: M = MatrixSpace(QQ, 50, 100, sparse=True) sage: A = M.random_element(density = 0.05) sage: E = A.echelon_form() sage: M = MatrixSpace(GF(2), 20, 40, sparse=True) sage: A = M.random_element() sage: E = A.echelon_form() ÐамеÑÑÑе, ÑÑо в Python иÑполÑзование заглавнÑÑ Ð±Ñкв игÑÐ°ÐµÑ ÑолÑ: :: sage: M = MatrixSpace(QQ, 10,10, Sparse=True) Traceback (most recent call last): ... TypeError: __classcall__() got an unexpected keyword argument 'Sparse'