scipy 动态Riccati方程

2uluyalo  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(97)

你好,我有一个问题,解决以下动态Riccati方程:

这是我写的代码:

import numpy as np
from scipy.integrate import odeint
import networkx as nx
import matplotlib.pyplot as plt

def deriv(sigma, t, A, B, Md):
    sigma = np.reshape(sigma, s)
    return (-np.matmul(A, sigma) - np.matmul(sigma, A.transpose()) + B - 2 * np.matmul(sigma, Md, sigma)).flatten()

n = 100
alpha = 5
beta = 5

G = nx.barabasi_albert_graph(n=n, m=2, seed=10374196, initial_graph=None)
A = nx.adjacency_matrix(G).toarray()  # Convert to dense matrix
B = alpha * np.identity(n)
Md = np.identity(n)
Md[1, 1] = beta
s = (n, n)
sigma0 = np.ones(n**2)
t = np.linspace(0, 100, 101)

sol = odeint(deriv, sigma0, t, args=(A, B, Md)) 
sol = np.reshape(sol, (len(t),) + s)  
Y = np.linalg.eigvals(sol[-1])  
Y.sort()
X = [i for i in range(n)]
plt.plot(X, Y)
plt.xlabel("eigenvalue rank")
plt.ylabel("eigenvalue")
plt.show()

我在测试稳态解,得到一个零矩阵,尽管我知道这是不可能的,因为这些是,黎卡提方程的期望解,稳态解的特征值。enter image description here有人知道我哪里犯了错误吗?

w80xi6nr

w80xi6nr1#

复制并运行您的确切代码,我无法得到一个解决方案,由于溢出错误。我修改了你的代码,使用更现代的scipy.integrate.solve_ivp ODE求解器,并修改了你的deriv函数,使用一些numpy的简写。通过这些变化,我得到了所有时间的非零解矩阵。我不确定您的问题是否与使用odeint(过时的scipy ODE求解器)或其他有关。

import numpy as np
from scipy.integrate import solve_ivp
import networkx as nx
import matplotlib.pyplot as plt

plt.close("all")

def deriv(t, sigma, A, B, Md):
    sigma = np.reshape(sigma, s)
    return (-A@sigma - sigma@A.T + B - 2*sigma@Md@sigma).ravel()

n = 100
alpha = 5
beta = 5

G = nx.barabasi_albert_graph(n=n, m=2, seed=10374196, initial_graph=None)
A = nx.adjacency_matrix(G).toarray()
B = alpha * np.identity(n)
Md = np.identity(n)
Md[1, 1] = beta
s = (n, n)
sigma0 = np.ones(n**2)
t = np.linspace(0, 100, 101)

sol = solve_ivp(deriv, [t.min(), t.max()], sigma0, t_eval=t, args=(A, B, Md,))
sigma = sol.y.T.reshape(len(t), n, n)

相关问题