Professional Documents
Culture Documents
求解递推数列第n项的MATLAB实现讲解
求解递推数列第n项的MATLAB实现讲解
求解递推数列第 n 项的 MATLAB 实现
1 绪论
1.1 MATLAB 简介
随着计算机技术的不断发展,计算机已成为应用数学工作者解决数学问题的主要
运算工具,数学运算软件如:MATLAB,Mathematica,Maple 等,已经被广泛使用。
MATLAB 是面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数
值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能
集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须要进行有效数值计
算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式
程序设计语言的的编辑模式。MATLAB 可以进行矩阵运算、绘制函数和数学、实现算法、
创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理
与通讯、图像处理、信号检测、金融建模设计与分析等领域。
1.2 课题的背景
在生活中,很多计数问题到最后都归结为一些递推公式,如果单依赖数学的方法 ,
有些递推公式按照如今的数学发展水平是很难找出通项公式的,在解决实际问题中,
不免涉及到求解第 n 项的值,如果 n 比较大,手算的话得从第一项一直计算到第 n 项,
也许算到其中的某一项突然算错了,最后得到的值和预估的值不一样,又得从头算起,
这样费时费力。数学软件的形成为这一计算提供了很大的方便,只需要根据递推关系编
一个程序,很快就能得出计算结果。本文选了特殊的并且很有代表性的四个递推数列,
给出求解其第 n 项的算法,解决和递推数列相关的应用型问题。
MATLAB 作为一个数学运算工具,它将矩阵作为基本的存储单元。矩阵运算很快 ,
代码复杂度小。它定义数据时无需声明数据类型,各种函数的运算可以直接进行符号运
算,更加的面向于用户。MATLAB 的工具箱也很丰富,在图像处理、信号处理、仿真等
方面的工具箱里的工具、示例非常多,功能非常强大。
2 用 MATLAB 求解递推数列第 项
数列是按一定次序排列的一列数。数列中的每一个数都叫做这个数列的项。排在第
一位的数称为这个数列的第 1 项,排在第二位的数称为这个数列的第 2 项……排在第
数学与统计学院课程设计(实习)报告 第 2 页
2.1 Fibonacci 数列
Fibonacci 数列,又称黄金分割数列、小兔子数列,因数学家斐波那契以兔子繁殖为
例而引入。在现代物理、化学、准晶体等领域,Fibonacci 数列都有直接应用。
数学上,Fibonacci 被递归的方法定义为:
f (n) f (n
f (0) 1, f
Fibonacci 数列有很多漂亮的数学性质,比如:从第二项开始,每个奇数项的平方都
比前后两项之积少 1,每个偶数项的平方都比前后两项之积多 1;第 项代表了集合
中所有不包含相邻正整数的子集个数。
Fibonacci 数列中的 Fibonacci 数经常出现在我们的生活中,比如松果、凤梨、树叶的
排列、某些花朵的花瓣数,超越数 ,黄金矩阵、黄金分割、等螺旋线、杨辉三角等。
1.递归算法
%建立 M 函数文件
function f=fib(n)
if n==0||n==1
f=1;
%特殊情况,递归结束的标志
else
f=fib(n-1)+fib(n-2);
%递归调用fib函数
end
end
2.循环算法
数学与统计学院课程设计(实习)报告 第 3 页
%建立 M 函数文件
function f=fib(n)
a=1;b=1;
if n==0||n==1
f=1;
%前两项为特殊情况
else
for x=2:2:n %两个项一循环
a=a+b;
%奇数项把前面最近的偶数项和奇数项加起来
b=a+b;
%偶数项把前面最近的奇数项和偶数项加起来
end
if mod(n,2)
f=b;
%奇数时函数返回b
else
f=a;
%偶数时函数返回a
end
end
end
3.矩阵计算
原理:Fibonacci 数列的递推公式可以转换为:
f ( n 1) 1
%建立 M 函数文件
f ( n) 1
function f=fib(n)
a=[
11
数学与统计学院课程设计(实习)报告 第 4 页
10
];
b=a^(n-1)*[1;1];
f=b(1);
end
问:把一对兔子(雌、雄各一只)在某年的开始放到围栏中,每个月这对兔子都生
出一对新兔,其中雌、雄各一只。由第二个月开始,每对新兔每个月也生出一对新兔,
也是雌、雄各一只,问一年后围栏中有多少对兔子?
解:对于 令 表示第 个月开始时围栏中的兔子对数,显然有
, 。在第 个月的开始,那些第 个月初已经在围栏中的兔子仍然存
在,而且每对在第 个月初就存在的兔子将在第 个月生出一对新兔来,再令
有:
f ( n) f (n
f (0) 1, f (
用 MATLAB 求解,在控制台下输入代码
fib(12)
得 ans=233
用 MATLAB 画出小兔子数列的增长曲线,在 M 文件里输入代码
for n=1:12
A(1,n)=fib(n);
%循环得出第 n 月的小兔子个数
end
plot(1:12,A)
%以横坐标为月份,纵坐标为小兔子个数作图
得出的 figure 如下图:
数学与统计学院课程设计(实习)报告 第 5 页
图 2.1 小兔子数列增长曲线
2.2 Catalan 数列
Catalan 数 是 组 合 数 学 中 常 出 现 在 各 种 计 算 问 题 中 的 数 列 , 前 几 项 为 :
1,1,2,5,14,132,429,1430,…
Catalan 数满足递推式:
h( n) h
目前发现的 Catalan 数的应用已有上百种,比如:括号化乘积表达式的方案数;一
个栈的进栈序列为 1,2,3,…, ,的出栈序列;凸多边形的三角划分;给定 个节点组成
二叉树的种数,非降路径不穿过对角线的路径的方法数。
%建立 M 函数文件
h (0)
function c=catalan(n)
if n==0||n==1
c=1;
1
%特殊情况,递归结束的标志
else
c=0;
for x=0:(n-1)
数学与统计学院课程设计(实习)报告 第 6 页
c=c+catalan(x)*catalan(n-1-x);
%递归调用catalan函数
end
end
end
等价于第 项 catalan 数
用 MATLAB 求解,在控制台下输入代码
catalan(5)
得 ans=42
例如,把 四个球放到两个盒子里,不允许有空盒,则放球的方法数有以
下 7 种:
a |
.
数学与统计学院课程设计(实习)报告 第 7 页
所以
4
7
2
第二类 Stirling 数具有的性质:
1.初始条件:
2.满足下面的递推方程:
nn
n 1
证明:要把
有的放法分成两类:
个不同的球恰好放入
r
r 0,
个盒子,先取一个球,比如是 ,然后把所
0 r
单独放在一个盒子里,放法为
不是单独放在一个盒子里,可以先把其余的
种放法。对于其中的任何一种放法,加入
的方法有
个球放到 个盒子里,有
种,由乘法法则,放球的方法
n 1
r
数是 r
根据加法法则,等式成立。
%建立 M 函数文件
function s=striling(n,r)
if n==r||r==1
s=1;
%特殊情况,递归结束的标志
elseif r==0||n<r
s=0;
else
s=r*striling(n-1,r)+striling(n-1,r-1);
数学与统计学院课程设计(实习)报告 第 8 页
%递归调用striling函数
end
end
2.4 杨辉三角
2.4.1 杨辉三角简介
杨辉三角,又称贾宪三角,帕斯卡三角形,是二项式系数在三角形中的一种几何
排列。杨辉三角有多种重要的性质。
前提:端点的数为 1。
1. 每个数等于它上方两数之和。
2. 每行数字左右对称,由 1 开始逐渐变大。
3. 第 行的数字有 项。
4. 第 行数字和为 。
5. 第 行的个数可表示为 , 即为从 个不同元素中取 个元
素的组合数。
6. 第 行的第 个数和第 个数相等。
7. 的展开式中各项系数依次对应杨辉三角的第 行中的每一项。
8. 将第 行第 个数,跟第 行第 个数,第 行第 个数……连
成一线,这些数的和是第 个斐波那契数;将第 行第 个数 ,跟第
行第 个数,第 行第 个数……这些数之和是第 个斐波那契数。
1 1
2 1 1
3 1 2 1
4 1 3 3 1
5 1 4 6 4 1
6 1 5 10 10 5 1
7 1 6 15 20 15 6 1
8 1 7 21 35 35 21 7 1
9 1 8 28 56 70 56 28 8 1
10 1 9 36 84 126 126 84 36 9 1
11 1 10 45 120 210 252 210 120 45 10 1
12 1 11 55 165 330 462 462 330 165 55 11 1
13 1 12 66 220 495 792 924 792 495 220 66 12 1
数学与统计学院课程设计(实习)报告 第 9 页
14 ...
15
16
图 2.2 杨辉三角
function yh=YH(x,y)
if x==1||y==x+1
yh=1;
%特殊情况,递归结束的标志
else
yh=YH(x-1,y-1)+YH(x-1,y);
%递归调用 YH 函数
end
结 论
对于递推数列的求第 项值的问题,本文给出了在 MATLAB 下求解的过程,虽然
只选择了四个代表性的递推公式,但是这一过程适用于所有的递推公式求解的应用型
问题。
通过这次课程设计,我初步了解了如何用 MATLAB 进行编程,对递归算法也有了
较深的理解,接触到了这四种特殊的递推数列在实际中的应用。
由于本人的编程能力不高,所以有些递归算法无法转换为循环算法,建立递归工
作栈,甚至队列来实现。从而增加了计算机计算的时间。希望有水平高的读者能在这篇
论文的基础上加以完善。
参考文献
[1] 胡良剑, 孙晓君. MATLAB 数学实验(第二版)[M]. 北京: 高等教育出版社, 2014.
[2] Fibonacci number[OL].https://en.wikipedia.org/wiki/Fibonacci_number.
[3] Catalan number[OL].https://en.wikipedia.org/wiki/Catalan_number.
[4] Striling number[OL].https://en.wikipedia.org/wiki/Catalan_number.
[5] 杨辉三角[OL].http://baike.baidu.com/view/7804.htm.
[6] 耿素云,屈婉玲,王捍平. 离散数学教程[M]. 北京: 北京大学出版社, 2002.