线性代数
讲线性代数,被同济版线性代数毒害过的人可能都会被唤醒藏于心底的恐惧:哇!又要讲行列式、对角化、增广矩阵算来算去了!
其实线性代数没那么可怕。我们可以很直观地、很感性地去理解线性代数。
什么是线性
线性代数,关键当然在于“线性”。(应该没人会觉得线性代数的关键在于“代数”吧?)如果一个函数 f(x) 有以下性质:
f(ax+by)=af(x)+bf(y)
则我们称这个函数 f(x) 是线性的,有线性性(Linearity)。其中,X 与 Y 都为 f(x) 定义域上的自变量,可以是一个向量(如果 f(x) 是一个多元函数)。 a 与 b 是一个数,一般理解上可以认为就是实数。(但实际上可以是任何域上的元素,如有理数域、实数域、复数域等。)
如果称一个函数 L(x) 是线性的,指 L(x) 同时具有以下两种性质:
- 可加性: L(x+t)=L(x)+L(t)
- 一次齐次性: L(ax)=aL(x)
可这个时候就有人要问啦,为什么有这种性质就叫做线性?这跟线有什么关系?
我们可以从两个方面来理解:
一方面,最简单的直线:截距为零的一次函数(即正比例函数) f(x)=kx ,是线性的。我们可以简单证明这一点:
f(ax)f(x+y)=af(x)=f(x)+f(y)⟸⟸k(ax)k(x+y)=akx=kx+ky
另一方面,在空间中的直线(这里没有限制空间的维度哦),所有点输入这种线性的函数后,输出的所有点依然构成一条直线(输出的空间也没有限制纬度,而且与输入的空间维度不一定相同哦)。我们一步一步来证明。
我们假设直线过点 p ,且方向向量为 v ,则直线上的所有点可以表示为: p+kv ,其中 k 为任意实数,取全体实数可得直线上的所有点。
让我们把直线上的所有点输入函数中,可得:
f(p+kv)=f(p)+kf(v)
其中 f(p) 就是输出空间中的一个点,而 f(v) 就是输出空间中直线的方向向量, f(p)+kf(v) 依旧是一条直线(不过是输出空间中的一条直线)。
有了线性的直观理解,我们可以具体地、准确地说线性代数是什么了。
线性代数(Linear Algebra)是研究向量空间和线性映射的一个数学分支。
向量空间就是指上面函数 f(x) 的输入或输出元素组成的集合。给定一个域,如果一个集合具有向量加法、标量乘法两种运算且符合八条公理,就称这个集合为向量空间。
线性映射就是指上面的有线性性的这个函数 f 。如果映射 f 将输入向量空间里的元素映射到输出向量空间里,且能维持向量加法与标量乘法,就成这个映射 f 为线性映射。
定义在向量空间上,可以被线性映射维持的这种形如 ax+by 的运算组合形式,就叫作线性组合。线性映射的定义也可以换个说法:能维持线性组合的映射叫线性映射。
线性空间( Vector Space )的严格定义
线性组合(Linear Combination)的严格定义
我们可以从上面这些定义中引申出线性映射两个重要的性质:
- 线性映射的复合还是线性映射
- 线性映射的线性组合还是线性映射
线性映射的两个重要性质
首先,线性映射的复合依然是线性映射。怎么理解呢?我们可以试着将线性映射出来的结果输入另一个线性映射中:
g(f(ax+by))=g(af(x)+bf(y))=ag(f(x))+bg(f(y))
其中 g 与 f 都为线性映射。假设 f 将 N 维向量映射到 M 维向量空间中( f:Rn→Rm ),而 g 将 M 维向量映射到 L 维向量空间中( g:Rm→Rl )。
那么如果我们将 g 与 f 这样复合起来( g∘f )的新的映射称为 h ,则这个新的映射 h 将会是一个能将 N 维向量映射到 L 维向量空间中的映射( h:Rn→Rl ),而且依然是一个线性映射:
⟹g(f(ax+by))h(ax+by)=ag(f(x))+bg(f(y))=ah(x)+bh(y)
虽然上面的描述中线性映射 f 与 g 都是基于有限维空间的向量,但实际上这个性质对于任意线性空间上的映射都适用。包括下文提到的线性映射组成的向量空间。
其次,线性映射的线性组合还是线性映射。要聊这条性质之前我们还缺了点定义,我们先补上:
假设有定义在 V→W 上的两个线性映射 f 与 g 。我们定义:
- f+g 为映射的加法,有 : (f+g)(x)=f(x)+g(x)
- kf 为映射的数乘,有: (kf)(x)=kf(x)
- L(V,W) 为所有定义在 V→W 上的线性映射组成的集合。即 f∈L(V,W) 且 g∈L(V,W)
脑袋灵活的同学就会发现了:哎哟,这个加法和数乘出来的结果还是一个定义在 V→W 上的线性映射哦!换句话说,结果还在 L(V,W) 里!
对于映射的加法 f+g=h ,有:
h(ax+by)=f(ax+by)+g(ax+by)=af(x)+bf(y)+ag(x)+bg(y)=a(f(x)+g(x))+b(f(y)+g(y))=ah(x)+bh(y)
对于映射的乘法 kf=h ,有:
h(ax+by)=kf(ax+by)=k(af(x)+bf(y))=akf(x)+bkf(y)=ah(x)+bh(y)
再推广一点,如果我们称形如 af+bg 为线性映射 f 、 g 的线性组合,那么其线性组合的结果 h(x)=(af+bg)(x) 依然是一个线性映射。(即得易见平凡。)
换一种说法,映射的加法与数乘就是定义在 L(V,W) 上的向量加法与标量乘法,而且还符合向量空间需要符合的8条公理。(仿照上例显然。)没想到吧,不仅 V 与 W 是向量空间,线性映射的集合 L(V,W) 也是一个向量空间!
线性映射与矩阵
实际上,我们可以很直觉地知道,如果我们将列向量左乘一个矩阵视为一个关于该向量的函数,那么这个函数是一种线性映射:
若K=k11k21⋮km1k12k22⋮km2……⋱…k1nk2n⋮kmn为一个M×N维矩阵,x=x1x2⋮xn为N维向量自变量。令f(x)=Kx,有:
f(ax)f(x+y)=af(x)=f(x)+f(y)⟸⟸K(ax)K(x+y)=aKx=Kx+Ky(矩阵乘法与数乘的交换律)(矩阵乘法的分配律)
而另一方面,对于有限维的向量空间 V 与 W ,假设 T:V→W 是一个线性映射,那么 T 就能表示为一个矩阵。相关证明这里就略去了,大家可以自行查找资料证明。(留作习题答案略,读者自证不难。) 1
一旦将线性变换理解为左乘矩阵,那线性映射的两个重要性质就变得很直观自然了!
对于线性映射的复合:
- 线性变换后再套一层线性变换,在矩阵层面就是左乘两个矩阵
- 由于矩阵乘法的结合律,我们可以先算两个矩阵之间的乘法
- 两个矩阵相乘依然是一个矩阵,也就是结果依然是一个线性变换
对于线性映射的线性组合:
- Rm→Rn 的线性映射,在矩阵层面就是 M×N 维矩阵,映射的加法、数乘就是矩阵的加法、数乘
- 对于相同维度的矩阵,矩阵加法的结果仍为维矩阵,矩阵数乘的结果仍为矩阵
- 相同维度矩阵的线性组合依然是矩阵,也就是线性变换的线性组合依然是线性变换
从矩阵乘法的角度来看线性变换,线性映射的复合依然是线性映射,线性映射的线性组合依然是线性映射,这两个结论可太自然了!
向量的长度:模,或者 L2 范数
严格来说,讲 L2-范数之前应该先讲向量内积 <x,y> 的定义,向量自己与自己内积的开方才是向量的模——或者说 L2-范数的定义: ∣∣x∣∣=<x,x>=∑xi2 。
然而,内积相关的内容展开讲可以讲一大堆,而这些内容与这篇文章的主线偏离太大了。现在网上已经有许多很好的相关讲解,大家可以自行查阅。2
L2 范数代表了一个向量的长度。如果我们想要测量两个向量 x y 相差的大小,我们可以计算他们之间差的 L2 范数: ∣∣x−y∣∣=<x−y,x−y>=∑(xi−yi)2 。
微积分
有了线性代数基础,终于可以开始讲微积分了。大学上过高等数学课的同学要坐不住啦:什么!?微积分的基础不是 ϵ−δ 语言和极限吗?不急,我们娓娓道来。
微分的本质是线性逼近
这时候就要回忆起我们当初是怎么学导数的了:“在函数上一点做一条切线,这样那样这样那样……”。其实这就是在函数上的一点做线性逼近:
dy=f′(x)dx
看着像正比例函数 y=kx 吧?这里的导数 f′(x) 就是切线的斜率,在函数的某一点附近,因变量微分 dy 与自变量微分 dx (也就是 Δx )成正比例关系,也就是线性关系。所以也称 dy 为 Δy=f(x0+Δx)−f(x0) 的线性主部。
所以我们能很直观的感受什么叫微分啦:在离函数上一点足够近的范围内,我们用一个随自变量线性变化的值去近似代替这一点附近的函数值本身,这个线性变化的值就是微分 dy 。
可这又有人要说了:你这定义不严谨呀!什么叫做“足够近的范围内”?多近才叫做足够近?怎么样的线性变化的值才能跟函数值本身足够像?从上面的图我们也能很清楚的看出, dy 跟 Δy 可不相等呀!
这就要说到“线性逼近”的另一个重点了:线性逼近一个重点是线性,另一个终点就是逼近,也就是极限 limx→x0 这个符号。
说人话,就是能够找到一个 L ,使得不管给定精度范围要求多精确,都能找到一个 x0 附近足够窄的范围,使得在这范围内的所有函数值都符合精度要求地近似于 L 。
套回微分里,就是能够找到一个比例系数 f′(x0) ,使得不管要求有多精确,都能找到一个足够窄的范围,使得在这范围里所有的 dy=f′(x0)dx 都符合精度要求地近似于 Δy=f(x+Δx)−f(x) 。
设函数 y=f(x) 在某区间 I 内有定义。
对于 I 内一点 x0 ,当 x0 变动到附近的 x0+Δx (也在此区间内)时,如果函数的增量 Δy=f(x0+Δx)−f(x0) 可表示为 Δy=AΔx+o(Δx) (其中 A 是不依赖于 Δx 的常数),而 o(Δx) 是比 Δx 高阶的无穷小,那么称函数 f(x) 在点 x0 是可微的,且 AΔx 称作函数在点 x0 相应于自变量增量 Δx 的微分,记作 dy ,即 dy=AΔx , dy 是 Δy 的线性主部。
通常把自变量 x 的增量 Δx 称为自变量的微分,记作 dx ,即 dx=Δx 。
多元函数与多值函数的微分
线性代数部分我们也提到了,对于多元、多值函数,我们可以看成是自变量、因变量为向量的函数。那对于多元多值函数,我们能做微分吗?怎么定义微分呢?
我们还是回到微分的两个重点,也就是线性逼近的两个重点:线性与逼近。
首先是逼近。对于一个 N 维向量 x0 ,怎么定义“ x0 附近足够窄的范围”呢?
我们想啊,“ x0 附近足够窄的范围“ 里的元素,不就是距离 x0 足够近的元素吗?那简单呀!用我们在线性代数里提到过的 L2 范数 ∣∣x−y∣∣=∑(xi−yi)2 定义不就好咯!
然后是线性。这也简单呀!一个输入为 N 维向量,输出为 M 维向量的线性变换,不就是向输入变量左乘一个 M×N 维的矩阵嘛!
于是我们就能直观定义多元、多值函数上的微分了:
对于一个输入为 N 维向量 x ,输出为 M 维向量 y 的多元多值函数 y=f(x) ,我们称在点 x0 处的微分为:
dy=Jdx
对于如果我们能找到这样的一个系数矩阵 J ,使得不管要求有多精确,都能找到一个足够窄的范围 ∣∣Δx∣∣<δ ,使得这个范围内所有的 dy=Jdx 都符合精度地近似于 Δy=f(x0+Δx)−f(x0) ,即对于任何方向 e 的 Δx=he ,都有 ∣∣hΔy−dy∣∣<ϵ ,其中 h=∣∣Δx∣∣ 。
其中系数矩阵 J 为 M×N 维矩阵,称为雅可比矩阵:
J=∂x1∂y1∂x1∂y2⋮∂x1∂ym∂x2∂y1∂x2∂y2⋮∂x2∂ym……⋱…∂xn∂y1∂xn∂y2⋮∂xn∂ym其中 ym 为因变量 y 的第 m 个分量, xn 为自变量 x 的第 n 个分量。∂xn∂ym 为因变量第 m 个分量对自变量第 n 个分量的偏导数。
这样说可能不够直观。让我们举一个例子作图更直观地感受多元函数的微分。
我们令函数 z=f(x,y)=−x2−y2+1 ,这是一个倒扣的抛物面,在点 (x0,y0)=(0.5,0.5) 处的线性逼近应为:
dz=−dx−dy=[−1−1][dxdy]
从 desmos 的函数图像里也可以看出,线性逼近组成一个点 (x0,y0) 处的切平面,这是一个在三维空间中有两个自由度的线性图形。
我们可以直观感受到,多元单值函数的微分就是所谓全微分。
加减法法则、数乘法则与链式法则
回顾我们在线性代数中推导过的线性映射的两个重要性质:
- 线性映射的复合还是线性映射
- 线性映射的线性组合还是线性映射
既然我们已经知道,微分的本质是线性逼近,那这两个重要性质在微分中有没有什么体现呢?
有的兄弟,有的!
其一,从线性映射的复合可以推导出微分的链式法则。给出函数 y=f(u) 和 u=g(x) (都是多元多值函数哦,不过也对一元单值函数适用),我们要考虑复合函数 y=h(x)=f(g(x)) 的微分 dy 长什么样。
你们想啊,既然我们的微分是一个对原函数的逼近,也就是跟原函数的局部足够像!那既然原函数复合起来了,那我们微分是不是也要复合起来?那线性映射的复合,不就表现为矩阵乘法嘛。于是我们就有:
⟹即:dy=Jfdudu=Jgdxdy=JfJgdx=JhdxJh=JfJg
其二,从线性映射的线性组合还是线性映射,我们可以得到微分的加减法法则与乘法法则。给出函数 y1=f(x) 与 y2=g(x) (函数值 y1 与 y2 属于同一个向量空间),考虑函数值线性组合得到的新函数 y=h(x)=af(x)+bg(x) 的微分长什么样。
你们再想啊,函数的线性组合的结果的变化量,不也是变化量的线性组合嘛 Δ(af(x)+bg(x))=aΔf(x)+bΔg(x) !(线性组合的差分是差分的线性组合,读者自证不难。)那既然我们的微分 dy 近似于函数的变化量 Δy ,那函数线性组合的微分,不也应该是微分的线性组合嘛!
dy⟹即:Jh=d(ay1+by2)=ady1+bdy2=aJfdx+bJgdx=Jhdx=aJf+bJg
其中当 a=b=1 时即为加法法则, b=0 时就为数乘法则。
哎哟,这么一看,微分的加减法法则、数乘法则、链式法则,都挺直观的哦!
其实这两个法则可以换一种说法:
- 函数复合的线性逼近是线性逼近的复合
- 函数线性组合的线性逼近是线性逼近的线性组合
乘法法则
与加减法、数乘法则和链式法则不同,函数值相乘的微分乘法法则似乎不能直接从线性映射的性质推导出来。
这是对的,因为乘法运算本身不是线性的(而是双线性的)。但也无妨,我们可以引入一个双线性函数 ϕ(u,v)=uv ,就可以把乘积函数 h(x)=f(x)g(x) 看作是 f(x) 和 g(x) 与双线性函数的复合: h(x)=ϕ(f(x),g(x)) 。
复合函数的微分链式法则我们上面已经研究过了,所以我们可以着重于研究双线性函数 ϕ(u,v) 的微分性质。
双线性函数 ϕ(u,v) 是一个二元函数,我们视 (u,v) 为一个向量,自然也可以套入线性代数部分中已经推导得到的多元函数的微分:
dϕ(u,v)=[∂u∂ϕ∂v∂ϕ][dudv]=∂u∂ϕdu+∂v∂ϕdv=vdu+udv
再应用回微分的链式法则,线性映射的复合还是线性映射,即可得:
dh(x)=dϕ(f(x),g(x))=g(x)df(x)+f(x)dg(x)=g(x)f′(x)dx+f(x)g′(x)dx
即 h′(x)=f′(x)g(x)+f(x)g′(x) 。
泛函分析
上面推导微分的加减法法则、数乘法则中,我们将函数值进行了线性组合。这是当然可行的,因为函数值是一个向量。
可是另一方面,将函数值进行线性组合后,从自变量映射到因变量依然是一个新的函数呀!那是不是能把这样的组合称为函数间的线性组合?难道……
函数是无穷维向量
没错,函数空间也是向量空间,函数也是向量。
要说明函数空间也是向量空间,我们还是回到向量空间的定义:定义两种运算,符合八条公理。
我们可以定义如下两种运算:
- 函数加法:对于函数空间中的函数 f 与 g ,定义 (f+g)(x)=f(x)+g(x)
- 函数标量乘法:对于函数空间中的函数 f 与域上的标量 a ,定义 (af)(x)=af(x)
容易证明得这两种运算符合八条公理。
我们也可以感性地去认知“函数是无穷维向量”这个结论:对于有限维向量如 v=[v1v2] ,有两个分量 v1 和 v2 ,其下标 1 和 2 映射到对应的分量,本身就可以认为是定义在集合 {1,2} 上的函数。向量的加法、数乘就是相同下标对应分量之间的加法、数乘。
而对于一个定义在 (a,b) 上的函数 f ,他的所有自变量的值都是其分量的下标,所有函数值 f(x0) 都是其对应于下标 x0 的分量。对于函数的加法、数乘,都是相同下标下对应分量之间的加法、数乘。 (a,b) 中有无穷个自变量,也即函数 f 是无穷维的向量。
函数空间里的 L2 范数
要定义两个函数之间的“距离”,我们跟普通向量一样,需要定义函数空间里的 L2 范数。类比于有限维向量空间:
| 有限维向量空间 Rn | 函数空间 |
---|
向量 | 一个N维向量 v=v1v2⋮vn | 一个定义在 (a,b) 上的函数 f(x) |
内积 | 所有分量相乘之和 u⋅v=Σuivi | 所有分量相乘之和 <f,g>=∫abf(x)g(x)dx |
L2 范数 | 向量与自己内积的开方 ∥v∥=(Σvi2) | 向量与自己内积的开方 ∥f∥=∫ab[f(x)]2dx |
微元 | 变化量趋于零( ∥Δx∥→0 )时的微小变化 dv | 变化量趋于零( ∥Δf∥→0 )时的微小变化 δf |
泛函——函数的函数
没想到吧,泛函分析讲这么久,居然还没讲“泛函”。
其实泛函没什么神秘——泛函就是输入为一个函数 y(x) ,输出为一个数 J[y] 的函数。想想编程语言里的高阶函数:既然函数也是一等公民,那函数的参数为一个函数也没什么奇怪的了,对吧。
再回到我们的线性代数与函数空间,我们之前说多元单值函数 f(x,y) 实际上就是输入为一个向量 [xy],输出为一个数 f(x,y) 的函数,那泛函不就是输入为一个无穷维向量的函数呗。
这样干说可能比较抽象,我们来举个🌰:
给定两个点 A(xa,ya) 与 B(xb,yb) 。在 [xa,xb] 区间上有定义,且过 A 、 B 两点的不同函数,就是两点间的不同路径,他们组成一个函数空间。那么我们可以在这个函数空间上定义如下泛函:
L[y]=∫ab1+(y′(x))2dx
很明显,这个泛函的值就是输入函数在 A 、 B 两点之间的长度。
泛函这个概念最早在欧拉与拉格朗日研究变分问题(寻求具有某种极大或极小性质的曲线)的时候开始有研究。当时还没有泛函(functional)这个名词,而是模糊地称为“曲线的某种极小值”、“最优路径”、“最优形状”。正因这个历史背景,泛函说是函数的函数,但一般输出为一个标量值,与软件工程领域里说的高阶函数有些不同。
但也存在“输入为一个函数,输出为一个函数的函数”,我们一般称之为算子。比如求导算子 D 就是这样的一个算子,输入输出都为函数空间里的元素,而且还是一个线性算子: D(af+bg)=aD(f)+bD(g) 。
变分——函数的微小变化
变分问题最早提出时,是因为欧拉与拉格朗日在研究类似“寻求具有某种极大或极小性质的曲线”的问题。后来,拉格朗日引入变分符号 δ 来表示函数的微小变化,从而将求极值问题转化为解微分方程的问题,使得推导过程更加系统和严谨。
回想起我们对微分的定义——函数在局部的线性逼近:
dy=Jdx
如果我们能找到这样的一个系数矩阵 J ,使得不管要求有多精确,都能找到一个足够窄的范围 ∣∣Δx∣∣<δ ,使得这个范围内所有的 dy=Jdx 都符合精度地近似于 Δy=f(x0+Δx)−f(x0) ,即对于任何方向 e 的 Δx=he ,都有 ∣∣hΔy−dy∣∣<ϵ ,其中 h=∣∣Δx∣∣ 。
既然函数空间也是一个向量空间,那我们也可以仿照向量微分来定义函数的变分 δy 与泛函的变分 δJ[y]。
假设我们有定义在区间 [a,b] 上的一个光滑函数 y^=y^(x) ,假如有一个与 y^ 足够像的光滑函数 y=y^+δy ,使得:
∣∣δy∣∣=∫ab[δy(x)]2dx
足够小,则我们称 δy 为函数 y 的变分。
可以知道,变分 δy 也是一个函数,但他的函数值处处都非常接近为 0 。我们也可类似的到 δy′=y′−y^′ ,也是一个函数值处处都几乎为零的函数。(变分可以理解为一个趋向于零的函数空间里的差分 Δy ,因此对于线性的求导算子 D 有保持性。)
从此我们就可以定义泛函的变分 δJ[y] :
不管要求的精度范围 δ 有多么精确,都能找到一个足够窄的范围 ∣∣δy∣∣<ϵ ,使得在这个范围内对任何方向 δy 的微小变化 ϵδy ,都能找到一个值 δJ[y] ,使得 ∣ϵJ[y+ϵδy]−J[y]−δJ[y]∣<δ 。则称这个 δJ[y] 为泛函 J[y] 的变分。
即:
δJ[y;δy]=ϵ→0limϵJ[y+ϵδy]−J[y]=dϵdJ[y+ϵδy]ϵ=0
其实我们对比回函数的微积分可以发现,泛函的变分 δJ[y] 与其说像微积分里的微分 dy ,不如说更像是导数 f′(x) 。泛函的变分代表了泛函 J[y] 在某一输入函数 y^ 附近的,在 δy 方向上的变化率,是一个标量值。
泛函的变分 δJ[y] 描述了:给输入函数 y 一点微小扰动 δy ,泛函 δJ[y] 的结果值是增加还是减少,增加得有多快。
变分法基本引理
在讲变分法基本原理之前,我们先从有限维的向量引入。我们考虑以下问题:什么样的向量 v ,能对任何方向的向量 u ,都有内积 ⟨u,v⟩=0 成立?
很明显,这个命题成立,当且仅当 v=0 。因为如果 v=0 ,总能找到一个与 v 同方向的非零向量 u ,使得 ⟨u,v⟩>0 。(因为内积有正定性,同向向量的内积总是大于等于 0 )。
那么,既然函数空间也是一个向量空间,函数是不是也有类似的性质?
是的,这个类似的性质就是“变分法基本引理”。
对于区间 [a,b] 内无限光滑的所有函数 f(x) 组成的集合 C∞[a,b] ,容易证明其组成一个向量空间。而满足 h(a)=h(b)=0 的任意函数 h(x) 也属于这个函数空间。
若函数 f(x)∈C∞[a,b] 满足对任意 h(x) ,都有:
⟨f,h⟩=∫abf(x)h(x)dx=0那么这个 f(x) 必然为零函数,即 f(x)≡0 。换句话说,对于 ∀x∈[a,b] ,都有 f(x)=0 。
证明方法与有限维向量的证明类似,使用反证法:证明只要 f(x) 不为零函数,则必然能找到一个 h(x) 使得 ⟨f,h⟩=0 。
假如函数 f(x) 不为零函数,我们可以设计一个函数 r(x)∈C∞[a,b] ,满足:
r(a)=r(b)=0∀x∈(a,b),有:r(x)>0
则令 h(x)=r(x)f(x) ,易知 h(a)=h(b)=0 且 h(x)∈C∞[a,b] 。而且:
⟨f,h⟩=∫abr(x)[f(x)]2dx>0
与前提矛盾。
因此,如果 ⟨f,h⟩=∫abf(x)h(x)dx=0 ,这个 f(x) 必然为零函数。