数模竞赛-线性代数模型
特征值&特征向量
差分方程-Fibonacci数列
化为一阶差分方程组:
写成矩阵形式:
其中:
由递推式得:
设特征值为,矩阵为特征向量矩阵,即:
则:
代码:
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)
|
求特征根:
俩根互异,特征根可知,通解为:
求,即:
代码:
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种群模型
在某动物种群中,仅考查雌性动物的年龄和数量,设雌性动物的最大生存年龄为,把等分为个年龄组:
设第个年龄组的生育率为,存活率为,记为时第个年龄组雌性动物的数量,得到初始时刻种群数量分布向量:
则第个年龄组为:
其他年龄组则生存率:
记Leslie矩阵:
一般有。
例题:某动物雌性最大年龄为年,年为一间隔,分成个年龄组,已知,在时雌性动物数量为。
即:
于是有,求特征值得,对应特征向量为,记矩阵,则,于是有,即
因,有:
于是当充分大,近似成立:
其中为列向量的第一个元素。
代码:
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])
|
奇异值分解
有,存在正交矩阵,使得:
其中,且为矩阵的正特征值。
称下式为的奇异值分解,为的奇异值。
矩阵的F范数定义为:
例题1:
求矩阵的奇异值分解。
代码:
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) print(u,s,vt)
|