我需要求解一个(573或更多)方程的大系统,其形式为(A0-A1*t)*x=b
,其中A0,A1
是矩阵t
是实数,x,b
是向量。我已经使用了Lapack的dgesv
和MUMPS来解决一系列t
的值,并且两个求解器都失败了t
的某些值但不是同一个值。如果t
的步长足够小(1.0e-6
),两个求解器都会显示明确定义的区域,它们可以解决或不解决,但他们不同意这些区域。
两个求解器报告的误差是矩阵在无法求解时是奇异的。在我看来,这似乎是一个病态的矩阵问题,所以我尝试在我准备的一个小得多的矩阵上使用Lapack的专业例程dgesvx和dgesvxx作为例子。我知道这些例程会搜索预处理器来解决,但我并不完全确定。
示例中的矩阵以这样的方式构造:改变参数lam
,在0
时使矩阵的行列式lam=0
和系统的解是[2,3} ,5,7]无论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
不会发生这种情况。我使用命令sudo apt-get install liblapack-dev
在我的Ubuntu机器上安装了lapack版本3.5.0-2ubuntu1。