0

我正在尝试使用 ARPACK 提供的 fortran 函数在 C++ 中编写一个驱动程序来计算不对称实值稀疏矩阵的特征值,但是我在使用反向通信方法时遇到了一些麻烦。

一般来说,我试图解决正常的特征值方程:

A*v = lambda*v

并且与矩阵 A 的任何交互都是通过函数 'av' 在 ARPACK 中完成的:

av(n, workd[ipntr[0]], workd[ipntr[1]])

它将数组'workd'中从位置'ipntr [0]'开始的向量相乘,并将结果插入从位置'ipntr [1]'开始的数组'workd'中。此方法的示例在http://www.caam.rice.edu/software/ARPACK/的手册中以及 ARPACK/EXAMPLES/SIMPLE/dnsimp.f 代码中给出。

我想知道的是我如何实际涉及矩阵A?如果它没有传递给例程,那么如何找到它对提供的向量的作用?

在示例代码 dnsimp.f 中,它们的矩阵 A 在函数“av”内计算,并且“源自二维对流-扩散算子的标准中心差分离散化”。但是,我相信这是特定于问题的?将矩阵 A 的推导编码到函数中似乎也不太有用。我也无法从手册中找到太多关于此的信息。

这似乎不是什么大问题,因为它是一个用户定义的函数,我可以更改“av”的定义以将矩阵 A 作为参数包含在内。但是,我想知道如果出现任何潜在的兼容性问题,它是如何正确完成的。

谢谢!

4

1 回答 1

2

您不必将矩阵提供给 ARPACK。

您所要做的就是将矩阵与返回的向量相乘(因此,反向通信),直到达到所需的收敛。

有关算法的信息,您应该查看用户指南,尤其是关于底层算法的章节

对评论的回应:底层算法是Arnoldi Iteration的一种形式。基本算法显示在wikipedia中,并显示矩阵 A 将不会被访问。不是直接的,也不是间接的。

特别是,算法从任意归一化向量 q_1 开始。该向量返回给用户。用户使用他们最喜欢的例程(通常是一些有效的稀疏矩阵向量乘法)将此向量与矩阵 A 相乘,并将结果返回到Arnoldi 迭代以计算 Hessenberg 矩阵 H 的一部分(其特征值通常收敛到极端特征值A) 和下一个向量 q_2。这必须迭代,直到你的结果收敛。

于 2014-09-29T18:27:32.363 回答