数模竞赛-线性代数模型

特征值&特征向量

差分方程-Fibonacci数列

化为一阶差分方程组:

$$
\begin{cases}
\displaylines{
F_{k+1}=F_{k+1},\\
F_{k+2}=F_{k+1}+F_k,
}
\end{cases}k=0,1,2,\cdots
$$

写成矩阵形式:

$$
\alpha_{k+1}=A\alpha_{k}
$$

其中:

$$
A=\left[
\begin{matrix}
\displaylines{
0&1\\
1&1
}
\end{matrix}
\right],
\alpha_k=\left[
\begin{matrix}
\displaylines{
F_k\\
F_{k+1}
}
\end{matrix}
\right],
\alpha_0=\left[
\begin{matrix}
\displaylines{
1\\1
}
\end{matrix}
\right]
$$

由递推式得:

$$
\alpha_k=A^k\alpha_0,k=1,2,3,\cdots
$$

设特征值为$\lambda_1,\lambda_2$,矩阵$P$为特征向量矩阵,即:

$$
A^k=P\left[
\begin{matrix}
\displaylines{
\lambda_1^k&0\\
0&\lambda_2^k
}
\end{matrix}
\right]P^{-1}
$$

则:

$$
a_k=A^k\left[
\begin{matrix}
\displaylines{
1\\1
}
\end{matrix}
\right]
$$

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import sympy
sympy.var('k',positive=True,integer=True)
a=sympy.Matrix([[0,1],[1,1]])
val=a.eigenvals() #求特征值 无用
vec=a.eigenvects() #求特征向量 无用
P,D=a.diagonalize() #相似对角化
ak=P@(D**k)@(P.inv())
F=ak@sympy.Matrix([1,1])
s=sympy.simplify(F[0])
print(s) #输出递推式
sm=[]
for i in range(20):
sm.append(s.subs(k,i).n())
print(sm)

求特征根:

$$
|\lambda E-A|=\lambda^2-\lambda-1
$$

俩根互异,特征根可知,通解为:

$$
F_k=c_1\lambda_1^k+c_2\lambda_2^k
$$

求$c_1,c_2$,即:

$$
\begin{cases}
\displaylines{
c_1+c_2=1,\\
c_1\lambda_1+c_2\lambda_2=1
}
\end{cases}
$$

代码:

1
2
3
4
5
6
7
import sympy
sympy.var('t c1 c2')
t0=sympy.solve(t**2-t-1)
eq1=c1+c2-1
eq2=c1*t0[0]+c2*t0[1]-1
s=sympy.solve([eq1,eq2])
print(s[c1],s[c2])

或者直接尝试求解通项公式:

1
2
3
4
5
6
import sympy
sympy.var('k')
y=sympy.Function('y')
f=y(k+2)-y(k+1)-y(k)
s=sympy.rsolve(f,y(k),{y(0):1,y(1):1})
print(s)

Leslie种群模型

在某动物种群中,仅考查雌性动物的年龄和数量,设雌性动物的最大生存年龄为$L$,把$[0,L]$等分为$n$个年龄组:

$$
\left[0,\dfrac{L}{n}\right),\left[\dfrac{L}{n},\dfrac{2L}{n}\right),\cdots,\left[\dfrac{n-1}{n}L,L\right]
$$

设第$i$个年龄组的生育率为$a_i$,存活率为$b_i$,记$x_i^{0}$为$t=0$时第$i$个年龄组雌性动物的数量,得到初始时刻种群数量分布向量:

$$
x^{(0)}=\left[x_1^{(0)},x_2^{(0)},\cdots,x_n^{(0)}\right]^{\mathrm T}
$$

则第$1$个年龄组为:

$$
x_1^{(k)}=\sum_{i=1}^na_ix_i^{(k-1)}
$$

其他年龄组则生存率:

$$
x_{i+1}^{(k)}=b_ix_i^{(k-1)}
$$

记Leslie矩阵:

$$
L=\left[
\begin{matrix}
\displaylines{
a_1&a_2&\cdots&a_{n-1}&a_n\\
b_1&0&\cdots&0&0\\
0&b_2&\cdots&0&0\\
\vdots&\vdots&&\vdots&\vdots\\
0&0&\cdots&b_{n-1}&0
}
\end{matrix}
\right]
$$

一般有$x^{(k)}=Lx^{(k-1)}=L^kx^{(0)}$。

例题:某动物雌性最大年龄为$15$年,$5$年为一间隔,分成$3$个年龄组,已知$a_1=0,a_2=4,a_3=3,b_1=0.5,b_2=0.25$,在$t=0$时雌性动物数量为$500,1000,500$。

即:

$$
x^{(0)}=\left[500,1000,500\right]^{\mathrm{T}},L=\left[
\begin{matrix}
\displaylines{
0&4&3\\
0.5&0&0\\
0&0.25&0
}
\end{matrix}
\right]
$$

于是有$x^{(i)}=Lx^{(i-1)}$,求特征值$\mid\lambda E-L\mid=0$得$\lambda_1,\lambda_2,\lambda_3$,对应特征向量为$\alpha_1,\alpha_2,\alpha_3$,记矩阵$P=\left[\alpha_1,\alpha_2,\alpha_3\right],\Lambda=\operatorname{diag}(\lambda_1,\lambda_2,\lambda_3)$,则$L=P\Lambda P^{-1}$,于是有$x^{(k)}=L^kx^{(0)}$,即

$$
\dfrac{1}{\lambda_1^k}x^{(k)}=P\left[
\begin{matrix}
\displaylines{
1&0&0\\
0&\left(\dfrac{\lambda_2}{\lambda_1}\right)^k&0\\
0&0&\left(\dfrac{\lambda_3}{\lambda_1}\right)^k
}
\end{matrix}
\right]
$$

因$\displaystyle\left|\dfrac{\lambda_2}{\lambda_1}\right|<1,\left|\dfrac{\lambda_3}{\lambda_1}\right|<1$,有:

$$
\lim_{k\rightarrow\infty}\dfrac{1}{\lambda_1^k}=P\operatorname{diag}(1,0,0)P^{-1}x^{(0)}
$$

于是当$k$充分大,近似成立:

$$
x^{(k)}=\dfrac{2250}{19}\left(\dfrac{3}{2}\right)^k\left[
\begin{matrix}
\displaylines{
18\\6\\1
}
\end{matrix}
\right]
$$

其中$c=\dfrac{2250}{19}$为列向量$P^{-1}x^{(0)}$的第一个元素。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import numpy,sympy
X0=numpy.array([500,1000,500])
L=numpy.array([[0,4,3],[0.5,0,0],[0,0.25,0]])
X1=L@X0
X2=L@X1
X3=L@X2
Ls=sympy.Matrix([[0,4,3],[sympy.Rational(1,2),0,0],[0,sympy.Rational(1,4),0]])
sympy.var('lmbda')
p=Ls.charpoly(lmbda) #计算特征多项式
w1=sympy.roots(p) #计算特征值
w2=Ls.eigenvals() #直接计算特征值
v=Ls.eigenvects() #特征向量
print(w2,v)
P,D=Ls.diagonalize() #相似对角化
Pinv=P.inv()
Pinv=sympy.simplify(Pinv)
cc=Pinv@X0
print(P,cc[0])

奇异值分解

有$A=(a_{ij})_{m\times n},\operatorname{rank}(A)=r$,存在正交矩阵$U,V$,使得:

$$
U^{\mathrm T}AV=\left[
\begin{matrix}
\displaylines{
    \Sigma&0\
    0&0
}
\end{matrix}
\right]
$$

其中$\Sigma=\operatorname{diag}{\sigma_1,\sigma_2,\cdots,\sigma_r},\sigma_1\geqslant\sigma_2\geqslant\cdots\geqslant\sigma_r>0$,且$\sigma_1^2,\sigma_2^2,\cdots,\sigma^2_r$为矩阵$A^{\mathrm T}A$的正特征值。

称下式为$A$的奇异值分解,$\sigma_i,i=1,2,\cdots,r$为$A$的奇异值。

$$
A=U\left[
\begin{matrix}
\displaylines{
    \Sigma&0\
    0&0
}
\end{matrix}
\right]V^{\mathrm T}
$$

矩阵的F范数定义为:

$$
\begin{Vmatrix}A\end{Vmatrix}^2_{\mathrm F}=\operatorname{tr}\left(A^{\mathrm T}A\right)=\sum_{i=1}^m\sum_{j=1}^na_{ij}^2=\sum_{i=1}^r\sigma_i^2
$$

例题1:

求矩阵$A$的奇异值分解。

$$
A=\left[
\begin{matrix}
\displaylines{
    1&0&1\
    0&1&1\
    0&0&0
}
\end{matrix}
\right]
$$

代码:

1
2
3
4
import numpy
a=numpy.array([[1,0,1],[0,1,1],[0,0,0]])
u,s,vt=numpy.linalg.svd(a) #即a=u@numpy.diag(s)@vt
print(u,s,vt)