高中数学/不等式与数列/常系数线性递推数列
阅读指南
[编辑]在差分方程与微分方程理论中,若干考察量之间呈现线性比例关系是最简单的情形,也是严格说来唯一存在普遍解法的情形。而对于更普遍的非线性关系式,往往也只能想办法先转换为人们更熟悉的线性关系后,才能变得易于求解。因此,分析清楚线性情形的求解变得格外重要。
本节主要讲解一种二阶的线性递推式求解思路,并简要介绍了更高阶情形的一般结论。由于计算可能比较麻烦,我们更推荐在领会求解思路的基础上,利用计算机程序或软件解决它们。在后面的多元递推数列章节中,我们还会将其拓展到多阶多变量的情形。虽然多元递推数列从数学角度来说一般是难以求出形式简便的通解,但是原则上可以通过计算机程序自动递推求解出任意特定项,在实际问题的数学建模(也就是应用题啦)中也更常见。
预备知识
[编辑]本节大部分内容都要求读者至少了解递推数列的基本概念和一阶递推数列的常见解法,所以读者应该先阅读数列基础概念和一阶递推数列章节,然后再根据需要选读本节的内容。
考试要求
[编辑]本节介绍的数列及其求解方法一般不被列入中学常规考试的考察范围。但是其方法并不难学,可以适当了解。
后续课程联系
[编辑]本节对线性关系式的求解只是整个线性系统研究的冰山一角,这种基于特征方程的解法一般可以在有关“组合数学”或“差分方程”的大学课程中学习到。在其它后续的大学课程中,我们还将把研究线性系统的经验进一步加深,然后应用到经典力学、经典电路学、微分方程、积分变换、信号处理和量子力学等学科中。
本节提及的Fibonacci数列是特别常见的例子,与黄金分割比例也存在密切联系,进而在优选法中的分数法和外汇技术分析中的斐波那契回调都能见到它的应用。
基础知识
[编辑]定义:k阶常系数线性递推关系(linear recurrence relation of degree k with constant coefficients)的一般形式为:
其中各个都是已知常数,而是关于n的已知表达式(可以记作数列)。特别地,当时,以上关系式又叫做(k阶的)常系数齐次线性递推关系[1](linear homogeneous recurrence relation of degree k with constant coefficients[2]),否则叫做非齐次的常系数线性递推关系[3],叫做非齐次项。
“k阶”(degree k)是指关系式中出现的不同的一共有k个;“常系数”(constant coefficients)是指式子中各个都是与n的取值无关的常数;“线性”(linear)是指式子中各个都是以一次幂单项式的形式出现的;“齐次”(homogeneou)是指式子中的每个单项式都是次数相同的,在这里可以说是不含常数项的。[2]
用线性递推关系式描述的数列也叫做线性递推数列。对于n阶的常系数齐次线性递推数列,一般给定n个初始值(或者叫边界条件),即可确定所求的解。
线性递推关系看似形式单一,但不意味着它过于简单以至于缺乏实际应用。事实上,“在实际问题中常见”和“可以系统求解”这两点都是人们关注它的主要原因[2]。本节主要关注它的求解方法,在后面的应用问题的递推关系建模章节中还会看到它的更多实例。
提示:齐次线性递推关系是有通用方法求解的;而非齐次的情形仅当非齐次项的母函数形式易知时才容易求解[3]。
注意:在线性代数学的术语中,非齐次的关系式并不被认为是一种线性映射。就像是“线性方程组”一词中的“线性”与“线性映射”中的“线性”含义并不一样。但是齐次情形下的解与非齐次情形下的解存在密切联系,只要我们找到了齐次情形下的解,那么这个解也能为相关的非齐次情形下的解提供重要线索。当然在高中数学中,可以暂时不去纠结于这些概念细节。
2阶的齐次情形
[编辑]最常见的2阶齐次线性递推式是由列奥纳多·斐波那契给出的斐波那契数列(Fibonacci sequence)或者叫费氏数列问题:
提示:数列的编号具体是从0开始取还是从1开始取,并不影响这个问题的数学本质。
提示:有的人也将斐波那契数列叫做兔子序列。但是兔子序列更多的是用作斐波那契词(Fibonacci word)的别名[4][5]。它斐波那契词只是模仿斐波那契数列构造的字符序列,但与之并不相同。为避免混淆,我们不推荐将斐波那契数列简称为兔子数列。
另一个常见的2阶齐次线性递推式是由爱德华·卢卡斯给出的卢卡斯数(Lucas number)的递推问题:
这类2阶递推关系的一般形式也叫做卢卡斯数列(Lucas sequence)。
提示:卢卡斯数构成的数列和卢卡斯数列的概念并不一样。卢卡斯数列包括了由卢卡斯数组成的数列和Fibonacci数列。
卢卡斯数列的递推式可以通过待定系数法构造为以下形式的等比关系(其中和为非零的已知常数,p和q为待定系数):
通过对比变形前后的各个对应项的系数即可求出p和q的值。然后把看成一个整体,易知数列满足等比数列的定义,因而容易求出通项公式。知道的解析式后,再对其进行一次构造,即可得到的解析式。
由上述分析可知,整个过程进行了2次递推关系式的构造,每构造一次就会降低一次递推式的阶数。有时候满足要求的待定系数会是比较复杂的分数,导致运算过程冗长且易错。因此这种使用待定系数的构造方法可行,但是不太适合手工求解,我们推荐使用本节后面介绍的计算机编程的办法求解。
为简明起见,我们先直接给出Fibonacci数列的通项公式如下:
由于直接进行构造式的证明比较繁琐,我们改为在数学归纳法章节中用新方法再对这个通项公式的正确性给予证明。
卢卡斯数列吸引数学家们注意的一个主要的特点就是它的通项公式中隐藏了数秘学中的黄金分割比例。事实上,我们在后面将会学到,Fibonacci数列的相邻项比值的数列极限也是黄金分割比例。这也是后面在优选法中要介绍的分数法的由来基础。
n阶的齐次情形
[编辑]先给出结论:
对于形式为的齐次递推式,可以定义特征方程:
由代数学基本定理可知,k次代数方程一定存在k个解。假设此特征方程有k个不同的解,则原递推式的通解(即一般解)为:
其中的各个是由给定的具体初始条件而确定的待定系数。
事实上由于高次代数方程一般难于通过笔算求解,所以笔算3阶及更高阶的线性递推式通解一般并不现实。
我们在此简要说明一下上面给出的通项公式是满足齐次递推关系式的。
设满足递推式的通解具有形式,其中各是原递推式特征方程的各个不同根。
既然要说明满足递推关系式,就可以尝试用倒退法,将代入递推关系式,看看使等式成立的条件是否足够:
交换求和顺序可得:
由于各个特征方程的根一定满足特征方程,进而得到:
这说明的确满足原来的齐次递推关系式。
提示:如果规定,那么上述过程可以用连加号及其运算规律简化如下:
另一方面,要说明上述形式的通解涵盖了一切初始值下的齐次递推关系式的特解(即不会有漏掉的解),需要将k个初始条件分别代入假设成立的通项公式中,构成包含k个未知待定系数的k元线性方程组。判断此方程组在“特征根彼此不同”的条件下是否始终有解即可。由于其严格证明需要用到线性代数中的克莱姆法则和范德蒙矩阵公式,我们不再展开讲解。粗略地说,由k个独立的已知条件确定出k个未知系数基本上是足够的。
非齐次情形
[编辑]对于一个常系数非齐次线性递推式,假设已求出其齐次形式的一个通解(即先忽略掉常数项求解),如果能再求得原递推式的一个特解,则由线性系统的叠加原理可知,原非齐次递推式的通解一定满足如下形式:
读者可以仿照前面对于齐次情形的分析思路,检验此形式的通解满足非齐次线性递推式。
不过更大的难点在于非齐次项的形式可能很复杂,导致递推式的特解不一定总是很好地求出来。实际上,只有少数母函数易知的情形容易得到特解。
计算机求解
[编辑]在旧版Mathematica软件中,可以通过RSolve命令求解常系数线性齐次递推式的通项公式。在Mathematica 10中,还可以通过RSolveValue命令求解常系数线性递推式的通项公式[6]。
如果使用从边界条件正向递推的方法或从目标值倒推回溯的方法(在计算机算法理论中常简称为“递归法”),也可以用更一般的编程语言求解出数列中特定项的数值解。
提示:Fibonacci数列的计算也是计算机编程教程的常见案例。计算机从业者对它的兴趣可能并非来源于毕达哥拉斯学派信仰的数学神秘主义,而只是想说明某一种计算机编程语言可以如何实现递归算法(从而不会比同样可以实现递归算法的其它编程语言差劲)。
Mathematica
[编辑]通过定义函数求特定项
[编辑]最原始的方法是通过自定义递推关系式。例如:
fib[n_] := fib[n] = fib[n - 1] + fib[n - 2]; (* 以递推的形式设置新的自定义函数fib(n) *)
fib::usage = "这个函数是通过Fibonacci数列的递推关系式定义的"; (* 对自定义函数的用法说明 *)
fib[1] = fib[2] = 1; (* 给定2个初始项的值 *)
fib[200]; (* 计算第200项的值 *)
提示:在Mathematica的Wolfram语言中,“=”表示赋值,“==”表示相等,“:=”表示符号的定义。
只要问题可解,按这种逐个递推的笨方法总能够推算出任意的特定项,即使所给的递推式没有明显的通项公式求法。
通过内置命令求特定项
[编辑]使用内置命令求解第100个Fibonacci数[7]:
Fibonacci[100];
使用内置命令求解第100个卢卡斯数[8]:
LucasL[100];
Mathematica在2008年推出的7.0版本中引入了可以按递推关系式求出一连串项的“RecurrenceTable”命令,其语法格式为[9]:
RecurrenceTable[eqns, expr, {n, nmax}]; (* 以求解递归方程 eqns 为基础,产生一组关于连续 n 的 expr 的值的列表 *)
RecurrenceTable[eqns, expr, nspec]; (* 在 nspec 指定的 n 值范围上,产生一组 expr 的值 *)
RecurrenceTable[eqns, expr, {n1, …}, {n2, …}, …]; (* 为连续的 n1,n2,… 产生 expr 的数组值 *)
根据递推关系式求解前几个Fibonacci数的示例:
RecurrenceTable[{a[n] == a[n - 1] + a[n - 2], a[1] == 1, a[2] == 1}, a, {n, 10}];
提示:注意区分Wolfram语言中的赋值号“=”和相等号“==”。
提示:如果RSolve命令没有输入错误,但是执行后出现“RSolve::deqn: Equation or list of equations expected instead of True in the first argument True.”一类的报错信息,一般是由于没有清除同名标识符中的已有信息。如果是这种情况:(1)可以先在其它地方输入独立命令“ClearAll[a]”清除标识符a中的内容,然后重新执行RSolve命令;(2)也可以改用除a以外的其它未使用过的标识符来命名要求解的数列。
通过内置命令求通项
[编辑]Mathematica在2003年推出的5.0版本中引入了可以求递推关系式一般项表达式的“RSolve”命令,其语法格式为[10]:
RSolve[eqn, a[n], n]; (* 求解递推方程 a[n] *)
RSolve[{eqn1, eqn2, …}, {a1[n], a2[n], …}, n]; (* 求解一个递推方程组 *)
RSolve[eqn, a[n1, n2, …], {n1, n2, …}]; (* 求解一个部分递推方程 *)
求解差分方程的示例:
RSolve[a[n+1] - 2 a[n] == 1, a[n], n];
包括边界条件的求解示例:
RSolve[{a[n+1] - 2 a[n] == 1, a[0] == 1}, a[n], n];
相关例题1: 已知数列满足,使用Mathematica求它的通项公式。
解答:
在Mathematica软件中输入命令(因为只有一行命令,分号此时可以不写):
RSolve[{a[n + 2] - 2 a[n + 1] - a[n] == 0, a[1] == 1, a[2] == 3}, a[n], n];
然后按组合键Shift + Enter即可得到结果为:。
答案:。
相关例题2: 已知数列满足,使用Mathematica求它的通项公式。
解答:
在Mathematica软件中输入命令:
RSolve[{a[n + 2] == a[n + 1] + 2 a[n] + 3, a[1] == 1, a[2] == 1}, a[n], n]
然后按组合键Shift + Enter即可得到结果为:。
答案:。
补充习题
[编辑]参考资料
[编辑]- ↑ 卢开澄; 卢华明. 第2章“递推关系与母函数”第2.6小节“线性常系数齐次递推关系”. (编) 张民 (责任编辑); 王冰飞 (责任编辑). 组合数学. 计算机科学组合学丛书. 白蕾 (责任校对) 4. 中国北京清华大学学研大厦A座: 清华大学出版社. 2006: 54–60. ISBN 7-302-13961-X (中文(中国大陆)).
- ↑ 2.0 2.1 2.2 (英文)Arash Farahmand(2016年).Section 8.2 notes: Solving Linear Recurrence Relations(pdf).University of California, Berkeley.
- ↑ 3.0 3.1 卢开澄; 卢华明. 第2章“递推关系与母函数”第2.7小节“关于线性常系数非齐次递推关系”. (编) 张民 (责任编辑); 王冰飞 (责任编辑). 组合数学. 计算机科学组合学丛书. 白蕾 (责任校对) 4. 中国北京清华大学学研大厦A座: 清华大学出版社. 2006: 61–67. ISBN 7-302-13961-X (中文(中国大陆)).
- ↑ (英文)Weisstein, Eric W..Rabbit Sequence..MathWorld--A Wolfram Web Resource.
- ↑ (英文)Ron Knott(2018年3月8日).The Golden String of 0s and 1s.University of Surrey.
- ↑ (简体中文)直接获得差分方程解的表达式——Mathematica 10的新功能.Wolfram Alpha官方(2020年).
- ↑ (简体中文)Fibonacci——Wolfram语言与系统 参考资料中心.Wolfram语言与系统 参考资料中心.
- ↑ (简体中文)LucasL——Wolfram语言与系统 参考资料中心.Wolfram语言与系统 参考资料中心.
- ↑ (简体中文)RecurrenceTable——Wolfram语言与系统 参考资料中心.Wolfram语言与系统 参考资料中心.
- ↑ (简体中文)RSolve——Wolfram语言参考资料.Wolfram语言与系统 参考资料中心.