Python:求解线性Toeplitz系统西皮.利纳格.索洛.托普利茨是s

2024-06-23 02:49:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试在Python3.6中有效地解决以下线性系统:

b=A x

其中A是nxn Toeplitz矩阵(即,从左到右的对角线是常数),x,b是nxn矩阵。在Scipy as中实现的Durbin Levinson西皮.利纳格.索洛.托普利茨当x,b是向量时,利用A的结构可以有效地解决上述问题。在

然而,当x,b是矩阵时,它比两者都慢得多西皮·利纳格·索尔夫以及numpy.linalg.求解(请参阅我的测试脚本的输出)

执行时间在我的应用程序中很关键。我有什么选择来加速这个过程,或者使用Toeplitz结构?在

可能的解释西皮.利纳格.索洛.托普利茨慢是指它对矩阵输入使用慢for循环来解决x,b是向量的单个线性系统(一次求解每列)。在

"""This script serves to benchmark several methods for solving a
linear equation involving a Toeplitz matrix and determine which one is
faster.

We consider the equation: b = A x, where A is Toeplitz, b and x are matrices and we wish to
solve for x.
"""
import numpy as np
import numpy.linalg
import scipy.linalg
import time

N = 500
np.random.seed(1)

# Construct random vectors/matrices
x = np.random.rand(N, N)
c,r = np.random.rand(2, N)
A = scipy.linalg.toeplitz(c, r)
b = A.dot(x)

# Validate various solutions
x_sol = []
x_sol.append(('numpy.linalg.solve(A, b)', numpy.linalg.solve(A, b)))
x_sol.append(('scipy.linalg.solve(A, b)', scipy.linalg.solve(A, b)))
x_sol.append(('scipy.linalg.solve_toeplitz((c, r), b)', scipy.linalg.solve_toeplitz((c, r), b)))
for solution in x_sol:
    print("Method: {} - error: {}".format(solution[0], numpy.linalg.norm(solution[1] - x)))

# Time the solutions
x_time = []
for solution in x_sol:
    t_start = time.time()
    eval(solution[0])
    t_end = time.time()
    x_time.append(t_end - t_start)
print("Timings:")
print(x_time)

脚本输出:

^{pr2}$

文档:https://docs.scipy.org/doc/scipy-0.17.0/reference/generated/scipy.linalg.solve_toeplitz.html


Tags: importnumpyfortimenp矩阵randomscipy