- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个形式为 A*x = B
的方程组,其中 [A]
是一个三对角系数矩阵。使用 Numpy 求解器 numpy.linalg.solve
我可以求解 x 的方程组。
请参阅下面的示例,了解我如何开发三对角线 [A]
矩阵。 {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 .解决
?for-loop
?根据 time.clock()
函数,以上示例在 Linux 上运行大约 0.08 秒
。
numpy.linalg.solve
函数工作正常,但我试图找到一种利用 [A]
的三对角形式的方法,希望进一步加快求解速度,然后将该方法应用于更复杂的示例。
最佳答案
有两个直接的性能改进 (1) 不使用循环,(2) 使用 scipy.linalg.solve_banded()
。
我会把代码写得更像
import scipy.linalg as la
# Create arrays and set values
ab = np.zeros((3,m))
b = 2*ones(m)
ab[0] = 9
ab[1] = 8
ab[2] = 7
# Fix end points
ab[0,1] = 2
ab[1,0] = 1
ab[1,-1] = 4
ab[2,-2] = 3
b[0] = 1
b[-1] = 3
return la.solve_banded ((1,1),ab,b)
可能有更优雅的方法来构造矩阵,但这行得通。
在 ipython
中使用 %timeit
原始代码在 m=1000 时花费了 112 毫秒。当 m=10,000 时,此代码耗时 2.94 毫秒,问题大了一个数量级,但仍然快了将近两个数量级!我没有耐心等待m = 10,000 的原始代码。原来大部分时间可能是在构造数组,这个我没测试。无论如何,对于大型数组,仅存储矩阵的非零值会更有效。
关于python - 优化三对角系数矩阵的 A*x = B 解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23120164/
我真的不知道这个问题以前是否有人问过(我真的找不到) 所以,我正在学习如何创建基本的颜色切换游戏(随机颜色球下降,你需要旋转轮子与相同颜色的球碰撞) 通过这种轮换,我遇到了一个非常大的问题。我需要以某
我必须找到具有 M 对角线和 M << N 的对称方 NxN 矩阵的行列式.有没有比LU分解矩阵更快的方法? 最佳答案 是的,带(ed)矩阵有特殊的方法可以解决复杂度为 O(N*M^2) 的消元问题。
我有一个列数和行数相等的二维 numpy 数组。我想将它们排列成一个更大的阵列,对角线上有较小的阵列。应该可以指定起始矩阵在对角线上的频率。例如: a = numpy.array([[5, 7],
我是一名优秀的程序员,十分优秀!