除了lu()可以选择将置换矩阵应用于下三角矩阵之外,这两个函数之间有什么区别吗?我希望了解哪一个更好,更快,和/或最不可能失败。
kmbjn2e31#
这里有一个函数上的区别。假设你只想进行LU分解;那么你使用scipy.linalg.lu。然而,假设你将求解很多具有不同右侧的线性系统。然后你通过lu_factor获得低级LAPACK表示,然后你在scipy.linalg.lu_solve函数中使用这个表示,而不需要一次又一次地显式获得相同的LU分解。这样,每当您想在管道中的另一个操作中使用因子分解时,就可以保存一个O(n^2)操作。
scipy.linalg.lu
lu_factor
scipy.linalg.lu_solve
O(n^2)
vybvopom2#
对于lu_factor,进一步使用文档中的lu_solve:
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
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是一些比较
2条答案
按热度按时间kmbjn2e31#
这里有一个函数上的区别。假设你只想进行LU分解;那么你使用
scipy.linalg.lu
。然而,假设你将求解很多具有不同右侧的线性系统。然后你通过lu_factor
获得低级LAPACK表示,然后你在scipy.linalg.lu_solve
函数中使用这个表示,而不需要一次又一次地显式获得相同的LU分解。这样,每当您想在管道中的另一个操作中使用因子分解时,就可以保存一个
O(n^2)
操作。vybvopom2#
对于lu_factor,进一步使用文档中的
lu_solve
:字符串
或者对于非方阵(这里是超定系统)
型
对于underdetermined,可以得到许多解,不同的是,solver/algo可以给予
使用
lu
和使用solve
型
p.s. here是一些时间
P.P.S. here是一些比较