我试图用C ++编写驱动程序,使用ARPACK提供的fortran函数计算非对称实值稀疏矩阵的特征值,但我在反向通信方法上遇到了一些麻烦。
一般来说,我试图解决正常的特征值方程:
A*v = lambda*v
与矩阵A的任何交互都是通过一个函数在ARPACK中完成的,' av'
av(n, workd[ipntr[0]], workd[ipntr[1]])
它将数组中保存的向量乘以'工作'从位置开始' ipntr [0]'并将结果插入数组' workd'从位置开始' ipntr [1]'。这种方法的示例在http://www.caam.rice.edu/software/ARPACK/手册中以及ARPACK / EXAMPLES / SIMPLE / dnsimp.f代码中给出。
我想知道的是如何实际涉及矩阵A?如果它没有传递给例程,那么如何才能在提供的向量上找到它的动作?
在示例代码dnsimp.f中,它们的矩阵A在函数“av”中计算,并且是从2维对流扩散算子的标准中心差分离度导出的。 ;。但是,我认为这是具体问题吗?将矩阵A的推导编码到函数中也似乎没有用处。我也无法从手册中找到相关信息。
它似乎不是一个太大的问题,因为它是一个用户定义的功能,我只能改变' av'的定义。包括矩阵A作为参数。但是,我想知道在遇到任何潜在的兼容性问题时如何正确完成。
谢谢!
答案 0 :(得分:2)
您不必将矩阵提供给ARPACK。
您所要做的就是将矩阵与返回的向量相乘(因此,反向通信),直到达到所需的收敛。
有关算法的信息,您应该查看users guide,尤其是chapter about the underlying algorithms。
对评论的回应:基础算法是 Arnoldi Iteration 的一种形式。基本算法显示在wikipedia中,并显示矩阵A无法访问。既不是直接的,也不是间接的。
特别地,算法以任意归一化向量q_1开始。该向量返回给用户。用户使用他们喜欢的例程(通常是一些有效的稀疏矩阵 - 向量乘法)将此向量与矩阵A相乘,并将结果返回到 Arnoldi迭代以计算Hessenberg矩阵H的一部分(其中特征值通常收敛于A)和下一个向量q_2的极端特征值。这必须重复,直到你的结果收敛。