我正在尝试求解一个方程系统,比如Ax=b,它有满秩矩阵A和右边的b,包括两列,代表两个相同左边的不同系统。(Ax=b1,Ax=b2,b=concatenate((b1,b2),axis=1))。重点是我们对两个系统有相同的A。因此,我们应该能够将来自第一个系统的信息用于第二个系统,即A的逆。
numpy.linalg.solve很容易解决这个系统,如果b的列是独立的,那不是我的情况。在我的例子中,b的第二列取决于第一个系统的解。
我尝试分解矩阵A,并使用这种分解来解决两个系统。但是,它一点也不高效。考虑到A不对称,我使用了RQ和LU分解。
from scipy.linalg import lu
import numpy as np
from scipy.linalg import solve_triangular
def qr_solver(a, b):
q, r = np.linalg.qr(a)
z = solve_triangular(r, b, lower=False)
ans = np.dot(q.T, z)
return ans
def plu_solver(a, b):
per, l, u = lu(kkt_matrix)
z = np.dot(per.T , b)
x = solve_triangular(l, z, lower=True)
ans = solve_triangular(u, x)
return ans
发布于 2019-08-05 08:14:40
scipy为这类问题暴露了lu_factor
和lu_solve
:
from scipy.linalg import lu_factor, lu_solve
# Solving Ax = b1, Ay = f(x) with same A
lu, pivot = lu_factor(A)
x = lu_solve((lu, pivot), b1)
b2 = f(x)
y = lu_solve((lu, pivot), b2)
因此,如果RHS向量不是线性独立的(隐式Runge-Kutta格式就是一个很好的例子),您可以将LHS分解一次,并根据需要重复使用它来求解。
发布于 2019-08-05 19:08:40
from scipy.linalg import lu_factor, lu_solve
from scipy.linalg import cho_factor
from scipy.linalg import solve
import numpy as np
import time
# Solving Ax = b1, Ay = f(x) with same A
A = np.random.normal(1, 10, (2000, 2000))
b1 = np.random.normal(1, 10, (2000, 1))
b2 = np.random.normal(1, 10, (2000, 1))
start = time.time()
lu, pivot = lu_factor(A)
x = lu_solve((lu, pivot), b1)
y = lu_solve((lu, pivot), b2)
end = time.time()
time_factorization = start-end
start = time.time()
x = np.linalg.solve(A, b1)
y = np.linalg.solve(A, b1)
end = time.time()
time_solve = start-end
print('time_factorization:', time_factorization, 'time_solve:', time_solve)
似乎这种因式分解(得到lu和轴心)真的很有效。
https://stackoverflow.com/questions/57346212
复制