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

前端之家收集整理的这篇文章主要介绍了使用fsolve检查微分方程的稳定性前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

这是一个最小的工作示例

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是否稳定,雅可比行列的所有特征值必须具有负实部.然而,Jacobian没有保存在infodict中,而是QR分解被保存在infodict中.

如何从fsolve的QR分解中获得Jacoian?

我能做的就像是

eigenvalues = np.linalg.eigvals(infodict["fjac"])*infodict["r"][ind]

ind是r的对角线条目,但我怀疑这是最好的方法.

最佳答案
QR分解很便宜:与查找特征值(一个迭代过程)相比,它需要一个固定数,大约n ** 3个.实际上,特征值发现算法之一涉及QR分解的迭代.因此,了解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))

猜你在找的Python相关文章