【python数学建模】特征值与特征向量运用

本文探讨了如何通过矩阵运算求解斐波那契数列的通项公式,以及利用特征根法和Leslie模型分析种群动态,同时介绍了PageRank算法中的状态转移矩阵概念。
Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

1、求数列通项

(1)转化为求矩阵的幂次问题

例:求斐波那契数列的通项公式
已知斐波那契数列满足:Fk+2=Fk+1+FkF_{k+2}=F_{k+1}+F_{k}Fk+2=Fk+1+Fk

(a) 降阶:将二阶差分方程转化为一阶差分方程组

{Fk+1=Fk+1Fk+2=Fk+1+Fk\begin{cases} F_{k+1}=F_{k+1}\\ F_{k+2}=F_{k+1}+F_{k} \end{cases}{Fk+1=Fk+1Fk+2=Fk+1+Fk 写成矩阵形式:ak+1=Aak k=0,1,2,...a_{k+1}=Aa_{k}\ k=0,1,2,...ak+1=Aak k=0,1,2,...
其中A=(0111) , ak=(FkFk+1) , a0=(11)A=\left(\begin{matrix} 0&1\\1&1 \end{matrix}\right)\ , \ a_k=\left(\begin{matrix} F_k\\F_{k+1} \end{matrix}\right)\ , \ a_0=\left(\begin{matrix} 1\\1 \end{matrix}\right)A=(0111) , ak=(FkFk+1) , a0=(11)
推导得有:ak=Aka0a_k=A^ka_0ak=Aka0

(b) 求矩阵的Jordan标准形
矩阵的特征方程为:λ2−λ−1\lambda^2-\lambda-1λ2λ1,特征根为1±52\frac{1\pm \sqrt5}{2}21±5,特征向量为 , (1±521)\ , \ \left(\begin{matrix} \frac{1\pm \sqrt5}{2}\\1 \end{matrix}\right) , (21±51),取特征向量为列向量构成矩阵PPP
则有A=P(1+52001−52)P−1A=P\left(\begin{matrix} \frac{1+ \sqrt5}{2}&0\\0&\frac{1- \sqrt5}{2} \end{matrix}\right)P^{-1}A=P(21+500215)P1
从而ak=Aka0a_k=A^ka_0ak=Aka0,斐波那契数列的通项公式为aka_kak的第一行元素。

(c) python实现

import sympy as sp
sp.var('k',positive=True,integre=True)
a=sp.Matrix([[0,1],[1,1]])
val=a.eigenvals()
vec=a.eigenvects()
P,D=a.diagonalize()
ak=P@(D**k)@(P.inv())
F=ak@sp.Matrix([1,1])
print(sp.latex(sp.simplify(F[0])))

求出通项公式为:Fk=2−k(2(1−5)k+5(1+5)k+3(1+5)k)5+5F^k=\frac{2^{- k} \left(2 \left(1 - \sqrt{5}\right)^{k} + \sqrt{5} \left(1 + \sqrt{5}\right)^{k} + 3 \left(1 + \sqrt{5}\right)^{k}\right)}{\sqrt{5} + 5}Fk=5+52k(2(15)k+5(1+5)k+3(1+5)k)
取值:

f = sp.lambdify(k,F[0])
print(f(9))

(2)特征根法求通项

由于斐波那契数列的特征根是互异的,故可设通项为:
Fk=c1(1+52)k+c2(1−52)k F_k=c_1(\frac{1+\sqrt5}{2})^k+c_2(\frac{1-\sqrt5}{2})^kFk=c1(21+5)k+c2(215)k
代入初值条件求解上述二元一次方程:F0=F1=1F_0=F_1=1F0=F1=1
{c1+c2=1c1(1+52)+c2(1−52)=1\begin{cases} c_1+c_2=1\\ c_1(\frac{1+\sqrt5}{2})+c_2(\frac{1-\sqrt5}{2})=1 \end{cases}{c1+c2=1c1(21+5)+c2(215)=1
解得{c1=12+510c2=12−510\begin{cases} c1=\frac{1}{2}+\frac{\sqrt5}{10}\\c2=\frac{1}{2}-\frac{\sqrt5}{10} \end{cases}{c1=21+105c2=21105,从而得到通项公式。

python实现:

import sympy as sp
x=sp.symbols('x')
c=sp.symbols('c:2')
f=sp.Eq(x**2,x+1)
vals=list(sp.solveset(f))
eq1=c[0]+c[1]-1
eq2=c[0]*vals[0]+c[1]*vals[1]-1
s=sp.solve([eq1,eq2])

(3)利用rsolve函数求解有理系数单变量递推式

import sympy as sp
k=sp.symbols('k')
y=sp.Function('y')
f=y(k+2)-y(k+1)-y(k)
F=sp.rsolve(f,y(k),{y(0):1, y(1):1})

2、Leslie种群模型

Leslie模型是研究动物种群数量增长的模型,研究了种群中雌性生物的年龄分布和数量增长的规律。
仅考察雌性动物的年龄和数量:设最大生存年龄为L,把年龄区间[0,L][0,L][0,L]等分成nnn个年龄组。设第iii个年龄组的生育率为aia_iai,存活率为bib_ibi。则ai≥0,0<bi≤1a_i\geq 0,0<b_i\leq 1ai0,0<bi1
且至少有一个ai>0a_i>0ai>0,即至少有一个年龄组的雌性是具有生育能力的。
记第iii组的雌性动物数量在第kkk个时刻的数量为xikx_i^{k}xik,若以年龄组的间隔Ln\frac{L}{n}nL,记第kkk个时刻为tk=kLnt_k=\frac{kL}{n}tk=nkL
tkt_ktk时刻,第1个年龄组的雌性动物数量,应该该等于在tk−1t_{k-1}tk1tkt_ktk之间出生的所有雌性动物数量之和:
x1(k)=a1x1(k−1)+a2x2(k−1)+....+anxn(k−1)x_1^{(k)}=a_1x_1^{(k-1)}+a_2x_2^{(k-1)}+....+a_nx_n^{(k-1)}x1(k)=a1x1(k1)+a2x2(k1)+....+anxn(k1)
而第i个年龄组在tkt_ktk时刻的雌性动物数量,应该由在tk−1t_{k-1}tk1tkt_ktk之间存活的第i-1个年龄组的雌性动物数量决定,即:
xi+1(k)=bixi(k−1)x_{i+1}^{(k)}=b_ix_i^{(k-1)}xi+1(k)=bixi(k1)
由此可以得到线性方程组,蕴含了tk−1t_{k-1}tk1tkt_ktk之间各年龄组之间雌性动物数量的关系。
{x1(k)=a1x1(k−1)+a2x2(k−1)+....+anxn(k−1)x2(k)=b1x1(k−1)x3(k)=b2x2(k−1).......xn(k)=bn−1xn−1(k−1)\begin{cases}x_1^{(k)}=a_1x_1^{(k-1)}+a_2x_2^{(k-1)}+....+a_nx_n^{(k-1)}\\ x_{2}^{(k)}=b_1x_1^{(k-1)}\\x_{3}^{(k)}=\quad \quad b_2x_2^{(k-1)} \\ .......\\x_{n}^{(k)}=\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad b_{n-1}x_{n-1}^{(k-1)}\end{cases}x1(k)=a1x1(k1)+a2x2(k1)+....+anxn(k1)x2(k)=b1x1(k1)x3(k)=b2x2(k1).......xn(k)=bn1xn1(k1)
系数矩阵记为LLL,成为莱斯利矩阵,则上述线性方程组可以写成:
x(k)=Lx(k−1)x^{(k)}=Lx^{(k-1)}x(k)=Lx(k1)
显然可推导出公式:
x(k)=Lkx(0)x^{(k)}=L^kx^{(0)}x(k)=Lkx(0)
故若已知初始时刻的种群数量分布向量,就可以推出任何一个时刻的种群数量分布向量。
莱斯利模型在分析动物种群的年龄分布和总量增长方面有广泛应用,这一模型也可以应用于人口增长的年龄分布问题。

3、Pagerank算法

如果网页A有一个指向网页B的链接,则认为存在一条从顶点A到顶点B的有向边,这样就可以利用图论来研究网络的拓扑结构。
设网络对应图的邻接矩阵为WWW,为了能够将网页的页面等级值平均分给该网页链接指向的网页,对WWW各行向量作行归一化处理,记为矩阵PPP
矩阵PPP称为状态转移矩阵,它的各行向量元素之和为1。PTP^TPT的最大特征值(一定为1)所对应的归一化特征向量即为各顶点的Pagerank值。
WWW矩阵的行和为ri=∑j=1Nwijr_i=\sum\limits_{j=1}^N w_{ij}ri=j=1Nwij,它给出了页面i的链出链接数。
则矩阵PPP定义如下:
pij=wijrip_{ij}=\frac{w_{ij}}{r_i}pij=riwij
PPP是马尔科夫链的状态转移概率矩阵。pijp_{ij}pij表示了从页面i跳转到页面j的概率。
求马尔科夫链的平稳分布x=(x1,x2,...,xN)Tx=(x_1,x_2,...,x_N)^Tx=(x1,x2,...,xN)T,它满足:
PTx=x , ∑i=1Nxi=1P^Tx=x\ , \ \sum\limits_{i=1}^{N}x_i=1PTx=x , i=1Nxi=1
xxx表示在极限情况(转移次数接近于无限)下各网页被访问的概率分布,Google将其定义为各网页的Pagerank值。

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值