sgelsx无法生成正确的解决方案

时间:2016-12-07 07:49:03

标签: fortran lapack least-squares

我想找到方程的最小范数,最小二乘解 <ControlTemplate TargetType="MenuItem"> <Border Margin="{TemplateBinding Margin}" x:Name="B1" Background="Transparent" ... </Border> ... </ControlTemplate> 在Fortran中使用LAPACK的驱动程序sgelsx。在其documentation中,它表示在调用此子例程后,最小二乘解决方案存储为Ax = b,但bb的维度通常不同,那么如何才能它被确定为解决方案? 我已经尝试计算一个提供的示例,以便我可以将我的代码的结果与解决方案进行比较,这显然是不同的。

我的节目是

x

我得到的program test_svd implicit none integer:: m,n,nrhs,LDA,LDB,RANK,INFO,i,nwork integer, allocatable, dimension(:)::JPVT real, allocatable, dimension(:):: work real, allocatable, dimension(:,:):: a real, allocatable, dimension(:,:):: b real:: RCOND m = 5 n = 2 nrhs = 1 LDA = 10 LDB = 10 RCOND = 500.0 nwork = maxval( [minval([m,n])+3*n, 2*minval([m,n])+nrhs ]) allocate(b(LDB,nrhs)) allocate(a(LDA,n)) allocate(JPVT(n)) allocate(work(nwork )) JPVT = (/ (1.0 , i = 1,n) /) a(1,1) = 1.0 a(2,1) = 1.0 a(3,1) = 1.0 a(4,1) = 1.0 a(5,1) = 1.0 a(1,2) = -2.0 a(2,2) = -1.0 a(3,2) = 0.0 a(4,2) = 2.0 a(5,2) = 3.0 b(1,1) = 4.0 b(2,1) = 2.0 b(3,1) = 1.0 b(4,1) = 1.0 b(5,1) = 1.0 !print *, a, size(a) !print *, b, size(b) call sgelsx(m,n,nrhs,a,LDA,b,LDB,JPVT,RCOND,RANK,work,INFO) print *, b end (解决方案)是b,应该是[1.55172420 0.620689809 -1.36653137 -0.703225672 -0.371572882]

1 个答案:

答案 0 :(得分:0)

问题解决了。事实证明,rcond是用于设置阈值的参数,低于该阈值时,A的奇异值设置为零,因此rcond应该像0.001或0.1,具体取决于A的条件数。 ,我在另一个例程的文档中找到了这个解释。我想知道为什么作者没有对rcond中的sgelsx使用相同的,更具描述性的解释。