我需要解决一个大型的(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
dgesv
或dgesvx
不会发生。我在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。