线性代数学习笔记(一)

"数学是打开科学大门的钥匙。——培根"

Posted by YelonhimX on November 6, 2019

线性代数笔记(一)

1. 向量

1.1. 什么是向量

  • 为什么线性代数如此重要?
    • 线性代数是从研究一个数拓展到一组数
  • 一组数的表示方法————向量(Vector)
  • 向量(Vector)是线性代数研究的基本元素
    • 一组数有什么用?
      • 最基本的出发点:表示方向 math-vector.jpg

      • 起始点不重要?

        • 从$(-1,-1)$到$(3,2)$和从$(0,0)$到$(4,3)$是一样的,只是坐标系不同。
        • 为了研究方便,我们定义向量都从原点开始。
        • 但是顺序是重要的!即向量是一组有序的数。
    • 如果只是表示方向,最多三个维度就够了
      • 抽象化:n维向量
        • 刻画事物的不同角度就可以理解为不同维度。比如刻画一个房子的信息:
        面积 卧室 卫生间 最近地铁站(km) 价格(万)
        120 3 2 2 666

        就可以写为5维向量:(120,3,2,2,666)

        • 此时,向量就是一组数,这组数的含义由使用者定义。
    • 两个视角看似不同,但可以互相转换
      • 一个方向,就是一个点;
      • 空间中的一个点,可以看做从原点指向这个点的一个方向
      • 在学习初始,使用方向的视角,更直观,更形象
      • 更关键的是:这两个视角,都不是简单的“一组数”
      • 一个是一个有向线段,另一个是空间中的点

1.2. 向量的更多术语和表示法

  • 更严格的一些定义:
    • 和向量相对应,一个数字,称为标量
    • 代数,用符号代表数。和标量相区别,向量的符号画箭头:

    • 个别情况下,尤其是几何学中,我们会考虑向量的起始点:

    • 行向量和列向量

    • 通常教材,论文,提到向量,都指向列向量
    • 由于横版印刷原因,列向量有时使用符号:

1.3. Python代码实现向量类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class vector:
    def __init__(self,lst):
        self._values = lst
        #初始化类,将数组传入
    def __len__(self):
        #返回向量长度(youduoshaoyuansu )
        return len(self._values)
    def __getitem__(self,index):
        #取向量的第index个元素
        return self._values[index]
    def __repr__(self):
        return "Vector({})".format(self._values)
        #使用__repr__魔法方法规定系统内调用vector类的格式
    def __str__(self):
        return "({})".format(",".join(str(e) for e in self._values))
  • __repr____str__方法的异同
    • __str__是用户使用print函数调用的。

1.4. 向量的基本运算

  • 向量加法

    • 平行四边形法则
    • 两个向量相加,相当于他们在x轴和y轴位移增量的总加和,即:

    多维空间中:

  • 数量乘法 同理,向量与标量的乘法即多次向量的加和:

    多维向量中同理。

1.5. 实现向量的基本运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class vector:

    def __init__(self,lst):
        self._values = list(lst)
        #构造函数,初始化类,将数组传入,用list方法复制lst变量,确保vector不可更改性
    def __len__(self):
        #返回向量长度(youduoshaoyuansu )
        return len(self._values)
    def __getitem__(self,index):
        #取向量的第index个元素
        return self._values[index]
    def __repr__(self):
        return "Vector({})".format(self._values)
        #使用__repr__魔法方法规定系统内调用vector类的格式
    def __str__(self):
        return "({})".format(",".join(str(e) for e in self._values)
    def __add__(self,another)
        #向量加法,返回一个新的向量
        assert len(self) == len(another),"Error"
        return Vector([a+b for a,b in zip(self,another.)])
    def __sub__(self,another):
        #向量减法
        assert len(self) == len(another),"Error"
        return vector([a - b for a,b in zip(self,another)])
    def __mul__(self,k):
        #返回数量乘法的结果向量:self*k
        return vector([a*k for a in self])
    def __rmul__(self,k):
        #返回数乘:k*self
        return vector([a*k for a in self])#可以写为self*k
    def __pos__(self):
        #对结果取正
        return 1 * self
    def __neg__(self):
        #对结果取负
        return -1 * self
    def __iter__(self)
        #通过添加迭代器保证_values的私有性
        return self._values.__iter__()

1.6. 向量运算的基本性质

  • 类比代数运算:
    • 交换律、结合律:
    • 分配率:

1.7. 零向量

  • 零向量不是直接定义的,而是从推导出一个性质出发

  • 证明:

    即:

    解方程得:

    故而有向量$O$:

    我们称这个向量,为零向量

    • 注意:这个零向量$O$没有箭头
  • 同样地:

上述$\overrightarrow{-u}$唯一(反证法证明),同时注意到:

1.8. 零向量的实现

  • 注意到创建零向量的方法不是基于类中的子方法,而是要基于类的基本方法即类方法:
1
2
3
4
5
6
7
8
9
10
class vector:

    def __init__(self,lst):
        self._values = list(lst)
        #构造函数,初始化类,将数组传入,用list方法复制lst变量,确保vector不可更改性

    @classmethod
    def zero(cls,dim):
        #返回一个dim维的零向量
        return cls([0]*dim)


TOP