scipy.linalg.lu()vs scipy.linalg.lu_factor()

dojqjjoe  于 2024-01-09  发布在  其他
关注(0)|答案(2)|浏览(104)

除了lu()可以选择将置换矩阵应用于下三角矩阵之外,这两个函数之间有什么区别吗?我希望了解哪一个更好,更快,和/或最不可能失败。

kmbjn2e3

kmbjn2e31#

这里有一个函数上的区别。假设你只想进行LU分解;那么你使用scipy.linalg.lu。然而,假设你将求解很多具有不同右侧的线性系统。然后你通过lu_factor获得低级LAPACK表示,然后你在scipy.linalg.lu_solve函数中使用这个表示,而不需要一次又一次地显式获得相同的LU分解。
这样,每当您想在管道中的另一个操作中使用因子分解时,就可以保存一个O(n^2)操作。

vybvopom

vybvopom2#

  • 因式分解 * 和 * 解 * 是不同的目的。因式分解通过不同的运算简化了x系数的矩阵,如求逆,行列式等-给出线性独立向量的更简单的投影(我希望)。

对于lu_factor,进一步使用文档中的lu_solve

import numpy as np
from scipy.linalg import lu_factor, lu_solve

A = np.array([[2, 5, 8, 7], [5, 2, 2, 8], [7, 5, 6, 6], [5, 4, 4, 8]])
b = np.array([1, 1, 1, 1])
lu, piv = lu_factor(A)
x = lu_solve((lu, piv), b)
np.allclose(A @ x - b, np.zeros((4,))) 
print(x)

字符串
或者对于非方阵(这里是超定系统)

import numpy as np
from scipy.linalg import lu_factor, lu_solve

A = np.array([[2, 5, 8], [5, 2, 2], [7, 5, 6], [5, 4, 4]])
b = np.array([1, 1, 1, 1])
A = np.column_stack((np.ones(len(b)),A))    # slack variable

lu, piv = lu_factor(A.T @ A)
x = lu_solve((lu, piv), A.T @ b)
print(x)
print(np.allclose(A @ x - b, np.zeros(4,)) )
print(np.linalg.norm( (A @ x - b)  -np.zeros(4,), 2))


对于underdetermined,可以得到许多解,不同的是,solver/algo可以给予
使用lu和使用solve

import numpy as np
from scipy.linalg  import solve
from scipy import  linalg

A = np.array([[2, 5, 8], [5, 2, 2], [7, 5, 6], [5, 4, 4]])
b = np.array([1, 1, 1,1])
A = np.column_stack((np.ones(len(b)),A))    # slack variable

p,l,u= linalg.lu(A)
res = solve(u, solve(l, p.T@b))
print(res)


p.s. here是一些时间
P.P.S. here是一些比较

相关问题