我正在尝试求解具有全等级矩阵A和右侧B的AX = 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
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分解一次,并重新使用它以根据需要求解。
我只是尝试编程'talonmies'所说的:
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)
以及结果:time_factorization:0.6500372886657715time_solve:0.9420537948608398
似乎这种分解(获得LU和枢轴(确实有效。