线性代数的SAGE快速入门

Sage 快速入门教程是为MAA预备研讨会“SAGE:在本科生中使用开源数学软件”开发的(由美国国家科学基金会提供,截止日期0817071)。它是在知识共享署名-Share Alike 3.0许可证下授权的 (CC BY-SA )。

线性代数是Sage的许多算法的基础,因此它是快速、健壮和全面的。我们已经了解了一些基本的线性代数,包括矩阵、行列式和 .rref() 控件中减少行的梯形的方法 Programming Tutorial ,所以这里的内容在某种程度上是从那里继续的。

矩阵和向量

通过传递行列表,我们可以很容易地生成一个矩阵。不要忘记使用制表符-完成来查看可能的例程。

sage: A = matrix([[1,2,3],[4,5,6]]); A
[1 2 3]
[4 5 6]

但还有很多其他的方法来制作矩阵。其中的每一个都显示了使用不同输入假设的内容;在阅读命令 matrix? 提供了什么?

这是一个好主意,养成告诉Sage用什么戒指来制作矩阵的习惯。否则,Sage会根据元素进行猜测,因此您可能不会有一个字段上的矩阵!在这里,我们告诉Sage要在有理逻辑上做文章。

sage: B = matrix(QQ, 3, 2, [1,2,3,4,5,6]); B
[1 2]
[3 4]
[5 6]
sage: C = matrix(QQ, 3, [1,2,3,4,5,6]); C
[1 2]
[3 4]
[5 6]
sage: D = matrix(CC, 20, range(400)); D
20 x 20 dense matrix over Complex Field with 53 bits of precision (use the '.str()' method to see the entries)

不要忘记,当您在笔记本中查看时,您可以点击矩阵的左侧,以便在输出的“包装”、“展开”和“隐藏”模式之间循环。

sage: print(D.str())
[0.000000000000000  1.00000000000000  2.00000000000000  3.00000000000000  4.00000000000000  5.00000000000000  6.00000000000000  7.00000000000000  8.00000000000000  9.00000000000000  10.0000000000000  11.0000000000000  12.0000000000000  13.0000000000000  14.0000000000000  15.0000000000000  16.0000000000000  17.0000000000000  18.0000000000000  19.0000000000000]
[ 20.0000000000000  21.0000000000000  22.0000000000000  23.0000000000000  24.0000000000000  25.0000000000000  26.0000000000000  27.0000000000000  28.0000000000000  29.0000000000000  30.0000000000000  31.0000000000000  32.0000000000000  33.0000000000000  34.0000000000000  35.0000000000000  36.0000000000000  37.0000000000000  38.0000000000000  39.0000000000000]
[ 40.0000000000000  41.0000000000000  42.0000000000000  43.0000000000000  44.0000000000000  45.0000000000000  46.0000000000000  47.0000000000000  48.0000000000000  49.0000000000000  50.0000000000000  51.0000000000000  52.0000000000000  53.0000000000000  54.0000000000000  55.0000000000000  56.0000000000000  57.0000000000000  58.0000000000000  59.0000000000000]
[ 60.0000000000000  61.0000000000000  62.0000000000000  63.0000000000000  64.0000000000000  65.0000000000000  66.0000000000000  67.0000000000000  68.0000000000000  69.0000000000000  70.0000000000000  71.0000000000000  72.0000000000000  73.0000000000000  74.0000000000000  75.0000000000000  76.0000000000000  77.0000000000000  78.0000000000000  79.0000000000000]
[ 80.0000000000000  81.0000000000000  82.0000000000000  83.0000000000000  84.0000000000000  85.0000000000000  86.0000000000000  87.0000000000000  88.0000000000000  89.0000000000000  90.0000000000000  91.0000000000000  92.0000000000000  93.0000000000000  94.0000000000000  95.0000000000000  96.0000000000000  97.0000000000000  98.0000000000000  99.0000000000000]
[ 100.000000000000  101.000000000000  102.000000000000  103.000000000000  104.000000000000  105.000000000000  106.000000000000  107.000000000000  108.000000000000  109.000000000000  110.000000000000  111.000000000000  112.000000000000  113.000000000000  114.000000000000  115.000000000000  116.000000000000  117.000000000000  118.000000000000  119.000000000000]
[ 120.000000000000  121.000000000000  122.000000000000  123.000000000000  124.000000000000  125.000000000000  126.000000000000  127.000000000000  128.000000000000  129.000000000000  130.000000000000  131.000000000000  132.000000000000  133.000000000000  134.000000000000  135.000000000000  136.000000000000  137.000000000000  138.000000000000  139.000000000000]
[ 140.000000000000  141.000000000000  142.000000000000  143.000000000000  144.000000000000  145.000000000000  146.000000000000  147.000000000000  148.000000000000  149.000000000000  150.000000000000  151.000000000000  152.000000000000  153.000000000000  154.000000000000  155.000000000000  156.000000000000  157.000000000000  158.000000000000  159.000000000000]
[ 160.000000000000  161.000000000000  162.000000000000  163.000000000000  164.000000000000  165.000000000000  166.000000000000  167.000000000000  168.000000000000  169.000000000000  170.000000000000  171.000000000000  172.000000000000  173.000000000000  174.000000000000  175.000000000000  176.000000000000  177.000000000000  178.000000000000  179.000000000000]
[ 180.000000000000  181.000000000000  182.000000000000  183.000000000000  184.000000000000  185.000000000000  186.000000000000  187.000000000000  188.000000000000  189.000000000000  190.000000000000  191.000000000000  192.000000000000  193.000000000000  194.000000000000  195.000000000000  196.000000000000  197.000000000000  198.000000000000  199.000000000000]
[ 200.000000000000  201.000000000000  202.000000000000  203.000000000000  204.000000000000  205.000000000000  206.000000000000  207.000000000000  208.000000000000  209.000000000000  210.000000000000  211.000000000000  212.000000000000  213.000000000000  214.000000000000  215.000000000000  216.000000000000  217.000000000000  218.000000000000  219.000000000000]
[ 220.000000000000  221.000000000000  222.000000000000  223.000000000000  224.000000000000  225.000000000000  226.000000000000  227.000000000000  228.000000000000  229.000000000000  230.000000000000  231.000000000000  232.000000000000  233.000000000000  234.000000000000  235.000000000000  236.000000000000  237.000000000000  238.000000000000  239.000000000000]
[ 240.000000000000  241.000000000000  242.000000000000  243.000000000000  244.000000000000  245.000000000000  246.000000000000  247.000000000000  248.000000000000  249.000000000000  250.000000000000  251.000000000000  252.000000000000  253.000000000000  254.000000000000  255.000000000000  256.000000000000  257.000000000000  258.000000000000  259.000000000000]
[ 260.000000000000  261.000000000000  262.000000000000  263.000000000000  264.000000000000  265.000000000000  266.000000000000  267.000000000000  268.000000000000  269.000000000000  270.000000000000  271.000000000000  272.000000000000  273.000000000000  274.000000000000  275.000000000000  276.000000000000  277.000000000000  278.000000000000  279.000000000000]
[ 280.000000000000  281.000000000000  282.000000000000  283.000000000000  284.000000000000  285.000000000000  286.000000000000  287.000000000000  288.000000000000  289.000000000000  290.000000000000  291.000000000000  292.000000000000  293.000000000000  294.000000000000  295.000000000000  296.000000000000  297.000000000000  298.000000000000  299.000000000000]
[ 300.000000000000  301.000000000000  302.000000000000  303.000000000000  304.000000000000  305.000000000000  306.000000000000  307.000000000000  308.000000000000  309.000000000000  310.000000000000  311.000000000000  312.000000000000  313.000000000000  314.000000000000  315.000000000000  316.000000000000  317.000000000000  318.000000000000  319.000000000000]
[ 320.000000000000  321.000000000000  322.000000000000  323.000000000000  324.000000000000  325.000000000000  326.000000000000  327.000000000000  328.000000000000  329.000000000000  330.000000000000  331.000000000000  332.000000000000  333.000000000000  334.000000000000  335.000000000000  336.000000000000  337.000000000000  338.000000000000  339.000000000000]
[ 340.000000000000  341.000000000000  342.000000000000  343.000000000000  344.000000000000  345.000000000000  346.000000000000  347.000000000000  348.000000000000  349.000000000000  350.000000000000  351.000000000000  352.000000000000  353.000000000000  354.000000000000  355.000000000000  356.000000000000  357.000000000000  358.000000000000  359.000000000000]
[ 360.000000000000  361.000000000000  362.000000000000  363.000000000000  364.000000000000  365.000000000000  366.000000000000  367.000000000000  368.000000000000  369.000000000000  370.000000000000  371.000000000000  372.000000000000  373.000000000000  374.000000000000  375.000000000000  376.000000000000  377.000000000000  378.000000000000  379.000000000000]
[ 380.000000000000  381.000000000000  382.000000000000  383.000000000000  384.000000000000  385.000000000000  386.000000000000  387.000000000000  388.000000000000  389.000000000000  390.000000000000  391.000000000000  392.000000000000  393.000000000000  394.000000000000  395.000000000000  396.000000000000  397.000000000000  398.000000000000  399.000000000000]
sage: E = diagonal_matrix( [0..40,step=4] ); E
[ 0  0  0  0  0  0  0  0  0  0  0]
[ 0  4  0  0  0  0  0  0  0  0  0]
[ 0  0  8  0  0  0  0  0  0  0  0]
[ 0  0  0 12  0  0  0  0  0  0  0]
[ 0  0  0  0 16  0  0  0  0  0  0]
[ 0  0  0  0  0 20  0  0  0  0  0]
[ 0  0  0  0  0  0 24  0  0  0  0]
[ 0  0  0  0  0  0  0 28  0  0  0]
[ 0  0  0  0  0  0  0  0 32  0  0]
[ 0  0  0  0  0  0  0  0  0 36  0]
[ 0  0  0  0  0  0  0  0  0  0 40]
sage: column_matrix(QQ,[[1,2,3],[4,5,6],[7,8,9]])
[1 4 7]
[2 5 8]
[3 6 9]

您还可以用不同的方式组合矩阵。

sage: F1=matrix(QQ,2,2,[0,1,1,0])
sage: F2=matrix(QQ,2,2,[1,2,3,4])
sage: F3=matrix(QQ,1,2,[3,1])
sage: block_matrix(2,2,[F1,F2,0,F3])
[0 1|1 2]
[1 0|3 4]
[---+---]
[0 0|3 1]
sage: F1.augment(F2)
[0 1 1 2]
[1 0 3 4]
sage: F1.stack(F2)
[0 1]
[1 0]
[1 2]
[3 4]
sage: block_diagonal_matrix([F1,F2])
[0 1|0 0]
[1 0|0 0]
[---+---]
[0 0|1 2]
[0 0|3 4]

向量是行或列,随你喜欢,Sage将它们解释为在乘法上下文中合适。

sage: row = vector( (3, -1, 4))
sage: col = vector( QQ, [4, 5] )
sage: row; col
(3, -1, 4)
(4, 5)
sage: F = matrix(QQ, 3, 2, range(6)); F
[0 1]
[2 3]
[4 5]
sage: F*col
(5, 23, 41)
sage: row*F
(14, 20)

尽管我们的“向量”(特别是在环上而不是域上)可能被认为是适当自由模的元素,但就我们的目的而言,它们基本上表现为向量。

sage: ring_vec = vector(SR, [2, 12, -4, 9])
sage: field_vec = vector( QQ, (2, 3, 14) )
sage: ring_vec; field_vec
(2, 12, -4, 9)
(2, 3, 14)
sage: type( ring_vec )
<class 'sage.modules.free_module.FreeModule_ambient_field_with_category.element_class'>
sage: type( field_vec )
<class 'sage.modules.vector_rational_dense.Vector_rational_dense'>

左撇子还是右撇子?

Sage“更喜欢”行而不是列。例如, kernel 矩阵的方法 A 计算左核--所有向量的向量空间 v 为了什么? v cdot A = 0 --并将向量打印为矩阵的行。

sage: G = matrix(QQ, 2, 3, [[1,2,3],[2,4,6]])
sage: G.kernel()
Vector space of degree 2 and dimension 1 over Rational Field
Basis matrix:
[   1 -1/2]
sage: G.left_kernel()
Vector space of degree 2 and dimension 1 over Rational Field
Basis matrix:
[   1 -1/2]

这个 right_kernel 方法计算向量的空间。 w 所以 A cdot w = 0 当然了。

向量空间

因为Sage知道内核是一个向量空间,所以您可以计算对向量空间有意义的东西。

sage: V=G.right_kernel()
sage: V
Vector space of degree 3 and dimension 2 over Rational Field
Basis matrix:
[   1    0 -1/3]
[   0    1 -2/3]
sage: V.dimension()
2

这里我们计算的坐标向量是 \((1,4,-3)\) 相对于 \(V\) **

sage: V.coordinate_vector([1,4,-3])
(1, 4)

这里我们得到了基矩阵(请注意,基向量是 rows 矩阵)::

sage: V.basis_matrix()
[   1    0 -1/3]
[   0    1 -2/3]

或者,我们可以以向量列表的形式显式获取基向量::

sage: V.basis()
[
(1, 0, -1/3),
(0, 1, -2/3)
]

备注

内核是 vector spaces 而基数是“echelonized “(规范化)。

这就是为什么 ring 因为矩阵是很重要的。使用仅在整数上定义的矩阵将上面的核与核进行比较。

sage: G = matrix(ZZ,2, 3, [[1,2,3],[2,4,6]])
sage: G.kernel()
Free module of degree 2 and rank 1 over Integer Ring
Echelon basis matrix:
[ 2 -1]

计算

下面是一些关于矩阵和向量的更多计算。

如您所料,随机矩阵是随机的。

sage: H = random_matrix(QQ, 5, 5, num_bound = 10, den_bound = 4)
sage: H.det() # random
15416
sage: H.eigenvalues() # random
[-10.08361801792048?, -2.682220984496031?, 4.739405672111427?, -1.320116668180795? - 10.88676412262347?*I, -1.320116668180795? + 10.88676412262347?*I]

根据 Numerical analysis quickstart ,问号表示实际数字在通过递增和递减打印数字的最后一位而找到的间隔内。所以是9.1?是介于9.0和9.2之间的数字。Sage确切知道这是什么数(因为它是多项式的根),但为了便于使用,使用区间表示法打印近似值。

这个 eigenvectors_right 命令打印出一个列表 (eigenvalue, [list of eigenvectors], algebraic multiplicity) 每个本征值的元组。

sage: H.eigenvectors_right() # random
[(-10.08361801792048?, [(1, -0.3820692683963385?, -0.4659857618614747?, -0.1264082922197715?, -0.3548156445133095?)], 1), (-2.682220984496031?, [(1, -1.855347152382563?, -0.4203899923232704?, 0.004411201577480876?, -0.5050698736445243?)], 1), (4.739405672111427?, [(1, 0.3284800982819703?, 2.059182569319718?, -1.428547399599918?, 0.5455069936349178?)], 1), (-1.320116668180795? - 10.88676412262347?*I, [(1, 0.710831790589076? + 0.2646474741698805?*I, 0.4504038344112447? + 3.145667601780920?*I, 2.763061217778457? + 0.9994136057023008?*I, 3.092272491890536? - 2.105461094305392?*I)], 1), (-1.320116668180795? + 10.88676412262347?*I, [(1, 0.710831790589076? - 0.2646474741698805?*I, 0.4504038344112447? - 3.145667601780920?*I, 2.763061217778457? - 0.9994136057023008?*I, 3.092272491890536? + 2.105461094305392?*I)], 1)]

可能会更方便地使用 eigenmatrix_right 命令,该命令给出特征值的对角矩阵和特征向量的列矩阵。

sage: D,P=H.eigenmatrix_right()
sage: P*D-H*P
[0 0 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0]

矩阵求解

我们可以很容易地使用反斜杠来解线性方程,就像在MatLab中一样。

sage: A = random_matrix(QQ, 3, algorithm='unimodular')
sage: v = vector([2,3,1])
sage: A,v  # random
(
[ 0 -1  1]
[-1 -1 -1]
[ 0  2  2], (2, 3, 1)
)
sage: x=A\v; x  # random
(-7/2, -3/4, 5/4)
sage: A*x  # random
(2, 3, 1)

lots 更多(简明)信息,请参阅Sage Linear Algebra Quick Reference