我想找到方程的最小范数,最小二乘解
<ControlTemplate TargetType="MenuItem">
<Border Margin="{TemplateBinding Margin}"
x:Name="B1"
Background="Transparent"
...
</Border>
...
</ControlTemplate>
在Fortran中使用LAPACK的驱动程序sgelsx。在其documentation中,它表示在调用此子例程后,最小二乘解决方案存储为Ax = b
,但b
和b
的维度通常不同,那么如何才能它被确定为解决方案?
我已经尝试计算一个提供的示例,以便我可以将我的代码的结果与解决方案进行比较,这显然是不同的。
我的节目是
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]
。
答案 0 :(得分:0)
问题解决了。事实证明,rcond
是用于设置阈值的参数,低于该阈值时,A的奇异值设置为零,因此rcond
应该像0.001或0.1,具体取决于A的条件数。 ,我在另一个例程的文档中找到了这个解释。我想知道为什么作者没有对rcond
中的sgelsx
使用相同的,更具描述性的解释。