【发布时间】:2014-05-31 23:00:44
【问题描述】:
我有一个A*x = B 形式的方程组,其中[A] 是一个三对角系数矩阵。使用 Numpy 求解器 numpy.linalg.solve 我可以求解 x 的方程组。
请参阅下面的示例,了解我如何开发三对角线 [A] martix。 {B} 向量,求解x:
# Solve system of equations with a tridiagonal coefficient matrix
# uses numpy.linalg.solve
# use Python 3 print function
from __future__ import print_function
from __future__ import division
# modules
import numpy as np
import time
ti = time.clock()
#---- Build [A] array and {B} column vector
m = 1000 # size of array, make this 8000 to see time benefits
A = np.zeros((m, m)) # pre-allocate [A] array
B = np.zeros((m, 1)) # pre-allocate {B} column vector
A[0, 0] = 1
A[0, 1] = 2
B[0, 0] = 1
for i in range(1, m-1):
A[i, i-1] = 7 # node-1
A[i, i] = 8 # node
A[i, i+1] = 9 # node+1
B[i, 0] = 2
A[m-1, m-2] = 3
A[m-1, m-1] = 4
B[m-1, 0] = 3
print('A \n', A)
print('B \n', B)
#---- Solve using numpy.linalg.solve
x = np.linalg.solve(A, B) # solve A*x = B for x
print('x \n', x)
#---- Elapsed time for each approach
print('NUMPY time', time.clock()-ti, 'seconds')
所以我的问题与上述示例的两个部分有关:
- 由于我正在处理
[A]的三对角矩阵,也称为带状矩阵,有没有比使用numpy.linalg.solve更有效的方法来求解方程组? - 另外,有没有更好的方法来创建三对角矩阵而不是使用
for-loop?
根据time.clock()函数,上面的例子在大约0.08 seconds的Linux上运行。
numpy.linalg.solve 函数工作正常,但我正在尝试找到一种利用 [A] 的三对角形式的方法,希望进一步加快解决方案的速度,然后将该方法应用于更复杂的示例.
【问题讨论】:
-
你的意思是像 scipy.linalg.solve_banded()?
-
@CraigJCopi
scipy.linalg.solve_banded()需要 LU 元组。计算 LU 元组然后用 solve_banded 求解会更快吗? -
这里可以使用 Thomas 算法,可能会更快。维基百科有一个实现en.wikipedia.org/wiki/Tridiagonal_matrix_algorithm#Python
-
@Gavin 计算 LU 元组?您的意思是指定上下对角线数量的两个整数?对于三对角矩阵,这是 (1,1)。
-
@CraigJCopi 我试过
sp.solve_banded((1, 1), A, B)但它不起作用,我得到上下对角线数量的错误
标签: python performance numpy matrix scipy