使用fsolve检查微分方程的稳定性

时间:2018-09-13 08:29:48

标签: python matrix scipy

我想找到一个微分方程的平衡点,并检查平衡点是否稳定。

这是一个最小的工作示例

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]

indr的对角线条目,但是我怀疑这是最好的方法。

2 个答案:

答案 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)