线性代数的Sage快速入门¶
这个 Sage 快速入门教程是为MAA准备工作坊“Sage:对本科生使用开源数学软件”开发的(由NSF提供资金,到期日:0817071)。它是根据Creative Commons Attribution -ShareLiked 3.0许可证授权的 (CC BY-SA )
线性代数是Sage算法的基础,因此它是快速、健壮和全面的。我们已经看过一些基本的线性代数,包括矩阵、行列式和 .rref()
一种行归约阶梯形的方法 Programming Tutorial ,所以这里的内容在某种程度上是继续的。
矩阵和向量¶
我们可以通过传递一个行列表轻松地生成矩阵。别忘了使用tab-completion来查看可能的例程。
sage: A = matrix([[1,2,3],[4,5,6]]); A
[1 2 3]
[4 5 6]
但是有很多其他的方法来做矩阵。每一个都显示了不同输入下的假设;在您阅读该命令的文档之前,您能理解Sage是如何解释它们的吗 matrix?
提供?
这是一个好主意,养成习惯告诉塞奇什么环,使矩阵结束。否则,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 )
<type '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)
]
注解
果仁是 向量空间 基地是“梯队化 “(规范化)。
这就是为什么 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) # random
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 .