我需要解决一个大型的(573个或更多)方程组,其形式为(A0-A1*t)*x=b,其中A0,A1是矩阵t是实数,而x,b是向量。我已经使用Lapack的dgesv和MUMPS来解决一定范围的t值,并且两个求解器对于某些t值均失败,但并非相同。如果将t的步长做得足够小(1.0e-6),则两个求解器都会显示明确定义的区域,在该区域中可以求解或不能求解,但是他们对此并不一致。

两位求解器都报告的错误是,当求解器求解失败时,矩阵是奇异的。在我看来,这就像一个病态的矩阵问题,因此我尝试在一个较小的矩阵上使用Lapack的专家例程dgesvx和dgesvxx作为示例。我知道这些例程正在寻找要解决的前提条件,但我不确定。

The demonstration I made

示例中的矩阵以这样的方式构造:改变参数lam,当0且系统的解为[2,3,5,7]时,改变矩阵的行列式lam=0而不考虑值的lam。我可以毫无问题地进行dgesvx的编译和解决,但是我对从dgesv返回的错误中得到的任何改进几乎不满意。

因此,我尝试使用dgesvxx代替,但是gfortran不会编译它。我运行命令

$ gfortran ill_conditioned.f90 -o ill_conditioned -llapack

并得到一个错误

/tmp/ccaC8jCk.o: In function `MAIN__':ill_conditioned.f90:(.text+0x38e): undefined reference to `dgesvxx_'collect2: error: ld returned 1 exit status

dgesvdgesvx不会发生。我在Ubuntu计算机上使用命令sudo apt-get install liblapack-dev安装了lapack版本3.5.0-2ubuntu1。

最佳答案

对我来说似乎有些发行问题。

在我的发行版(OpenSUSE)中,尽管dgesvxx.f将C接口定义为lapacke.h,但我也缺少dgesvxx

在共享库中搜索符号dgesvx

nm -D /usr/lib64/liblapack.so | grep dgesvx


也只能找到dgesvx而不能找到dgesvxx

我建议您从netlib下载LAPACK源,并使用一些高性能BLAS自己构建。您也可以尝试OpenBLAS,它也包含LAPACK。

08-03 16:49