我想找到一个微分方程的平衡点,并检查平衡点是否稳定。
这是一个最小的工作示例
import numpy as np
from scipy.optimize import fsolve
dim = 2
A = np.random.uniform(size = (dim,dim))
sol, infodict, ier, mesg = fsolve(lambda x: 1-np.dot(A,x),
np.ones(dim), full_output = True)
要确定解sol
是否稳定,雅可比行列式的所有特征值必须具有负实部。但是,雅可比行列式不保存在infodict
中,而QR分解保存在infodict
中。
如何从fsolve
的QR分解中获取Jacoian?
我所能做的只是
eigenvalues = np.linalg.eigvals(infodict["fjac"])*infodict["r"][ind]
ind
是r
的对角线条目,但是我怀疑这是最好的方法。
答案 0 :(得分:2)
QR分解很便宜:与寻找一个迭代过程的特征值相比,它需要大约n**3
的固定数量的操作。实际上,特征值发现算法之一涉及QR分解的 iteration 。因此,了解QR因子并不能真正使您更接近具有特征值。与通过乘法(也小于n**3
运算)重建矩阵的成本相比,找到特征值的成本可以忽略不计。
结论是,通过乘法重建雅可比矩阵是解决问题的方法。您正在做什么(仅查找Q因子的特征值?)是不正确的。首先,使用np.triu_indices
从给定的平面形式恢复R矩阵;然后将Q乘以R;然后找到特征值。
r = np.zeros((dim, dim))
r[np.triu_indices(dim)] = infodict["r"]
eigenvalues = np.linalg.eigvals(infodict["fjac"].dot(r))
答案 1 :(得分:1)
还需要对infodict["fjac"]
进行转置以获得Q。如果我将矩阵标记为“ r”,我也会遇到一个错误。我也建议直接检查Jacobian So:
import numpy as np
matrixr=np.zeros((dim,dim)) # dim= number of linear equations
matrixr[np.triu_indices(dim)]=infodict["r"] # to unpack "r" into matrix
Jacobian=(infodict["fjac"].T).dot(matrixr) # needs .T to get Q
eigenvalues=np.linalg.eigvals(Jacobian)