首页 > 编程问答 >稀疏迭代求解器无矩阵方法预处理器

稀疏迭代求解器无矩阵方法预处理器

时间:2024-07-23 13:16:21浏览次数:14  
标签:python scipy iteration linear-algebra sparse-matrix

如何为无矩阵左侧的稀疏迭代方法(TFQMR、GMRES、CGS 等)定义预处理器(SPILU、SPAI 等)?我使用无矩阵 A(使用 LinearOperator 和 matvec)定义了 Ax=b。因此,我没有创建矩阵 A 并将其保存在内存中。例如,在这种情况下,我如何构建 SPILU 预处理器?我在所有教程和示例中看到预处理器是使用矩阵 LHS 创建的。

我使用无矩阵方法创建了左侧,如下所示:

def matvec(x, A, B):  
    First = B.dot(x)  
    Second = A.dot(First)  
    result = B.T.dot(Second)  
    return result

linop = LinearOperator((WWWa.shape[0], WWWa.shape[0]), 
                        matvec=lambda x: matvec(x, WWWa, Ap), 
                        rmatvec=lambda x: rmatvec(x, WWWa, Ap)
                       ) 

稀疏迭代求解器可以编写如下:|| |但是,当我想添加预处理器时,我无法弄清楚如何创建预处理器,因为我没有 LHS 的直接矩阵(而且我也不想获得矩阵;我有很大的稀疏矩阵)具有数十亿个元素的矩阵,我只想使用矩阵向量乘法)。

l_finest = A.dot(g) 
x_gmres, info_gmres = gmres(linop, l_finest.flatten(), callback=callback, tol=tolerance, atol=0,callback_type='x')

However, when I wanted to add the preconditioner, I could not figure out how to create the preconditioner since I don't have a direct matrix for the LHS (and I don't want to get a matrix either; I have large sparse matrices with billions of elements and I just want to use matrix-vector multiplication).


是对的,大多数预处理器(如 SPILU 和 SPAI)都需要对矩阵进行显式访问才能计算不完全分解或逼近。在不构建完整矩阵的情况下,可以在无矩阵设置中使用的一些预处理器方法包括:

1. 基于算子的预处理器:

  • 多重网格(MG): MG 方法特别适合于偏微分方程(PDE)产生的问题,它可以作为无矩阵预处理器工作。需要实现平滑算子(例如,加权 Jacobi 或 Gauss-Seidel)和粗网格层次结构,这些操作可以使用的矩阵向量乘积执行。
  • 代数多重网格(AMG): 与需要几何信息的 MG 不同,AMG 方法直接从矩阵构建粗网格层次结构。虽然经典的 AMG 需要矩阵,但也存在无矩阵 AMG 变体,它们仅依靠矩阵向量乘积,例如, 无矩阵代数多重网格 .
  • 基于低秩近似的预处理器: 这些方法使用低秩矩阵近似原始算子,并且可以以无矩阵方式应用。示例包括基于随机抽样的方法或使用 Krylov 子空间方法(例如 Lanczos 或 Arnoldi 算法)。

2. 预处理矩阵向量乘积:

  • 固定点迭代: 使用像 Jacobi 或 Gauss-Seidel 这样的简单迭代方法作为预处理器。每次预处理步骤都需要几次迭代,但这可以在没有显式矩阵的情况下完成。
  • 近似逆预处理器: 这些方法尝试使用矩阵向量乘积构建 A 的逆的近似。示例包括因子化稀疏近似逆(FSAI)和基于 Krylov 子空间的方法。

实现示例(使用 Python 中的 PyAMG):

import pyamg
import scipy.sparse.linalg as spla

# ... 定义的 matvec 函数和 LinearOperator ...

# 使用 AMG 作为预处理器
strength = 'symmetric'  # 选择 AMG 强度
smoother = 'jacobi'   # 选择 AMG 平滑器
presmoother = (smoother, {'omega': 1.0})
postsmoother = (smoother, {'omega': 1.0})
# 创建 AMG 预处理器
aml = pyamg.smoothed_aggregation_solver(linop, strength=strength, 
                                        presmoother=presmoother, 
                                        postsmoother=postsmoother)

# 创建预处理的线性算子
precond = spla.LinearOperator(linop.shape, aml.solve)

# 使用预处理器求解系统
x_gmres, info_gmres = spla.gmres(linop, l_finest.flatten(), M=precond,
                                callback=callback, tol=tolerance, atol=0, 
                                callback_type='x')

此示例演示了如何使用 PyAMG 库作为 GMRES 求解器的预处理器创建一个无矩阵代数多重网格(AMG)预处理器。

选择最佳预处理器取决于的特定问题和可用资源。通常值得尝试不同的方法以查看哪种方法最有效。

标签:python,scipy,iteration,linear-algebra,sparse-matrix
From: 78781633

相关文章

  • Python 类型提示和 linter
    我一直在向我们的python项目添加静态类型检查,例如像这样:fromtypingimportListfromsomethingimportMyOtherClassclassMyClass:def__init__(self)->None:self.some_var=None#type:List[MyOtherClass]但是,现在我们使用的linter(flake8和......
  • eclipse如何写python程序
    本文主要介绍在Windows系统环境下,搭建能在Eclipse中运行python程序的环境。一、Eclipse下载与安装:Eclipse是写JAVA的IDE,下载地址为:http://www.eclipse.org/downloads/下载安装,网上教程很多,不赘述。二、pydev插件下载与安装:启动Eclipse,点击Help—>EclipseMarketplace......
  • 运行 python 3 代码时出现 python 2 语法错误
    我有一个如下所示的类classExperimentResult(BaseDataObject):def__init__(self,result_type:str,data:dict,references:list):super().__init__()self.type=result_typeself.references=referencesself.data=data......
  • 如何让 python 类型检查器知道它应该返回其类的新实例?
    我想使用classmethod返回当前类的新实例,并且我尝试了如下代码,但它引发了NameError('name'T'isnotDefined')PutthecodeT=TypeVar('T',bound=A)on|||以上也不起作用。classA有什么好主意来处理它吗?Isthereanygoodideatohandleit?......
  • 由于循环依赖而导致的Python注释错误
    我有两个相互依赖的类,并且无需注释即可正常工作。不幸的是,当我尝试注释返回值时,它会导致预期循环依赖错误。Network.pydefprocessors(self)->List[Processor]:#implementationProcessor.pydefnetwork(self)->Network:......
  • 如何在python中发送带有请求的“multipart/form-data”?
    如何在Python中使用multipart/form-data发送requests?如何发送文件,我明白,但是如何通过这种方法发送表单数据无法理解。可以使用Python中的requests库来发送multipart/form-data请求。说得对,requests库可以轻松发送文件,并且发......
  • 我安装了哪个版本的 Python?
    我必须在Windows服务器上运行Python脚本。我如何知道我拥有哪个版本的Python,这真的很重要吗?我正在考虑更新到最新版本的Python。确定在Windows服务器上安装的Python版本至关重要,因为它可以确定脚本的兼容性和可用库。以下是检查方法:使用命令提......
  • @classmethod 在 Python 的类之外做什么?
    在下面的代码中,如果存在@classmethod注释,则允许内部defnew()代替目标的__new__()--但该类会传递两次。如果@classmethod被删除,那么我们会收到类似“”的错误。@classmethod这里在做什么,有没有办法不用它?(我的动机是清晰的:我不理......
  • 三种语言实现快速选择(C++/Python/Java)
    题目给定一个长度为......
  • 如何让SublimeText支持Python 3的注释?
    我测试了SublimeText2和3,两者都有错误:如果您测试此代码,您会注意到:之后的所有代码都不会正确突出显示语法。deffoo(a,b)->str:#Nothinggetsproperlycoloredfromhere#Abunchofcode…return"bar"我发现了一些链接,解释了如何......