1. 方程 vs. 数据,解析式 vs. 数值计算
遇到过不止一位同学讨论的时候提到:如果要对这些数据处理—比如求导—是不是需要先求出这些数据的公式来,用拟合?
不。
函数,是从一组量到另一组量的映射。这并不意味着映射需要由公式来表达。典型的,在数字电路中,我们只需要直值表就可以完成映射,逻辑表达式并非必须。同样,只要有了数据,有了横坐标和纵坐标的对应,并不一定需要方程就能表达一种量和另一种量的映射或约束关系。如果不求解析解的话,数值计算并不需要解析式。
比如下面这组数据。
我们并不需要总结它是锯齿波的变形,就可以做针对它的数值计算。事实上,它也并不是锯齿波的变形,而是我随手瞎写的。随便再改一下,就可以换成另一个波形,两种波形之间没什么共性。
一直琢磨如何向同学们解释这个问题能更直观一些,看到书里的实例感觉很适合。还是这本书《程序员数学》 https://book.douban.com/subject/35689348/,用 python 讲解的。
书里的例子是用 python 做已知波形/数据的傅里叶级数。我用Excel重现一遍,再略加扩展。
数据就是数据,不需要转为公式,就可以做各种计算。计算的本质,是对数据的加工,公式作为模型只要在头脑里或者纸上就可以了,代码里不见得能看得见。
以上两组数据中的任意一组,就是Excel中的一列,我们称为 波。
2. 验证函数正交
在做这个波形的傅里叶级数以前,我们首先验证一个结论:傅里叶级数中的各个三角函数是正交基。即使不验证个结论,靠公式推导,或者我们就简单相信(数学课上我常有的状态,我信了还不行么)了,后面的工作也并不影响。不过这个工作也可以由Excel完成,不必更吓人的工具,非常简单,所以不妨拿来熟悉一下Excel做傅里叶级数的路数。
傅里叶级数中的各个三角函数是正交基,这个论断中有两点需要展开。
(1) 各个三角函数是哪些三角函数。包括 正弦 和 余弦。更具体地说,包括某个频率(一般写作ω,即omiga,角速度)的正弦和余弦,以及这个频率倍数的正弦和余弦。
比如sin(1 t),cos(1 t),sin(2t),cos(2t), sin(3t),cos(3t)……
或者sin(2πωt),cos(2πωt), sin(4πωt),cos(4πωt), sin(6πωt),cos(6πωt) ……
这些三角函数的参数怎么确定,我们后面再细说。
(2)什么是正交。正交是指两个基相乘的结果是0,具体什么意思我们不展开。
例如sin(t)和cos(t)相乘的结果如果是0,那么我们说sin(t)和cos(t)是正交的。
有的同学会说,sin(t)和cos(t)相乘,这不还是公式么,并不是仅使用数值判定啊?
任何两个函数,如果它们相乘的结果是0,我们说这两个函数是正交的。两个函数,如果没有公式,如何相乘呢。
(粗糙的)原理是 通过两个函数的内积,像下图这样。
这还是公式,因为里面有 f(x)g(x)这样的表达式。在离散的情况下,它可以等价于下面的(黎曼和)形式。
其中 f(xi) 不是函数表达式,而是执行以下步骤:
对于f这个函数,在一个周期范围内;
查找第i个x;
查表第i个x所对应的y;
这个y就是 f(xi)。
在上一节的表格中,我们增补x的序号,作为最左边的一列。在下图中,列x中的10是i的取值(x的值不重要,或者等于i),波这列的11是f(xi)即f(x11)的值。
类似地,g(xi)也是作数据表示函数。
这里的a和b是我们用于计算的数据的下标的上界和下界,假设为一个周期。N,是把a到b等分为N份。
所以这个等式的意思是
函数f的每一行 * 函数g的每一行 * 1/N;
把上面这句的所有结果相加。
我们 sin(t)*cos(t) 为例,操作步骤如下。
(1)角度
建立一列,标题为角度。A2即第一个单元格,手写1。A3用公式 =A2+1。复制这个公式,至第361行,这样得到角度1~360。
隐藏其中大多数行,为了以后操作方便,不然每次增加或修改数据需要连续翻页几次。
得到以下效果。增加列或修改数据的时候,跨越“隐藏”的7~360行粘贴公式,数据更新也会作用于隐藏的部分。
(2)弧度
新建一列,名为弧度。B2值为 =A2/360*2*PI()。复制这个单元格到整列,如下图所示。我们可以看到,最大弧度6.28,大约 2π.
(3)sin(t)
新建一列,名为sin。C2值为=SIN(B2),复制至整列。
取消隐藏的话,可以画出C列数据,或者画A-C的XY散点图。旁证我们的数据是正确的。
不取消隐藏的话,按下图操作,就可以 在隐藏部分数据的情况下绘出完整的图表了。
(4)cos(t)
用类似sin的方法得到cos列。
(5)内积 <sin(t), cos(t)>
函数正交与否的判定,等价于内积。内积为0的两个函数,相互垂直。
求内积,应用黎曼和公式。
求和即内积即正交与否,结果为3.81699E-17,即0.00000000000000003817,
非常接近于0。旁证了 sin(t) 和 cos(t)正交。
我们虽然用到了黎曼和公式,但是在数值计算的过程中并没有用 解析表示的函数,而是把数据本身作为自变量和函数值,把映射视为函数。
(6)sin(t)和sin(2t),sin(t)和cos(2t),cos(t)和cos(2t)……的内积
所有不同的函数,无论正弦与余弦之不同,还是角频率不同,我们都视为不同的函数。这些不同的函数两两相乘,结果都应为0。
以上组合相当之多,我们挑几个验证。
我们先创建 sin(2t)和cos(2t),像下面这样。只有每列一个单元格是手写的,其余全来自复制。事实上,连B2我也不是手写的,而是在写Excel公式的时候用鼠标点击的。
按sin(t)*cos(t)的方法,得到黎曼和——sin(t)*sin(2t),如下图所示。
结果为-4.22588E-16,非常接近0。
是不是全接近0啊,并不。
(7)sin(t)和sin(t)的内积,以及内积为1
我们选相同的函数,做内积。
结果不是0,是……像是π.
这个结果对不对呢,我们可以用其他数学工具交叉验证一下。
Wolfram|Alpha 说:
上图中的积分范围是 -π,+ π,Excel中的积分范围是0,2π即0,360度。都是sin(x) 的一个周期,所以是等价的。
既然Wolfram|Apha有图,我们也可以在Excel中画一个,再交叉检验。如下图所示,是相同的。
用 Geogebra交叉检验一下,如下图所示,结果也是相同的。
如果你也读《程序员数学》,会发现书中的同一函数s(x) 和s(x)内积的积分结果是1,解释理由是 基底的长度为1。这个结果与我们的不同。为什么呢?
因为s(x)并非sin(x),而是sin(2πx),周期2π,ω为1。我们在 geogebra中从-1到1积分,所得结果与《程序员数学》书中函数sin(2πx)的内积相同。
在Excel中积分-1,1的一半附近,即 0,1 ,如下图所示。
所得结果为0.5。
0,1为-1,1的一半,因此可以推断得到 -1,1积分的结果应为 1。与《程序员数学》书中一致。
(8)小结
以上,我们使用到了 函数正交、内积(事实上还有相关性)、定积分、黎曼和 这些概念,我们使用了一些公式。
但是!在求内积(其他都是原理,对计算过程没有影响)的过程中,我们并不需要任何公式。包括sin和cos这些三角函数,在计算它们的内积时,我们只需要数据。虽然三角函数的数据由函数公式生成,但是在内积计算时,我们无视函数公式是什么,而只需要数据就可以了。即使那些求内积的函数不是三角函数,甚至没有解析式,对计算过程也没有影响——回归到函数的定义,数(的集合)到数(的集合)的映射。
用内积佐证傅里叶的基底,那些三角函数,它们之间是正交的。它们正交这一点,并不是对某个函数/信号傅里叶分析的必要步骤,因为早就已经由前人证明过了。用解析法证明,一般会被视为更优雅吧。讨论内积的原因是,这种做法正是后面用Excel手搓傅里叶级数的手法。所以,此处也算作预备。
2.5 李萨如图形
所谓 既然气氛渲染到这种程度,数据都有了,不画个莉萨如/李萨如图形,说不过去啊。
李萨如图形,是测量两个信号周期比例的方法。不同周期、不同相位的周期函数,一个画横坐标,一个画纵坐标,可以得到非常漂亮且容易识别的图形。在双踪示波器上接两路信号,可以通过画李萨如图形求这两路信号的周期比例。如果其中一路信号是我们生成的,因此周期已知(多么熟悉的路线),另一路信号的周期可以通过李萨如图形求出。
如下图所示,用刚刚Excel中的数据画出的李萨如图形。用XY散点图。
以下是随手做的其他几个例子,好看吧。
(待续)