numpy.linalg.Solve,具有多个依赖性右侧



我正在尝试求解具有全等级矩阵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_factorlu_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和枢轴(确实有效。

相关内容

  • 没有找到相关文章

最新更新