- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
最小二乘法-Fortran版本
!
subroutine Lsqnonneg(A,b,x,m,n)
!http://QFT
!代码文件调用方式:
!call Lsqnonneg(A,b,x,m,n)
!求解方程组 Ax=b
!其中系数矩阵 A 为 m×n 的矩阵,
!本算法对于 m n时(即超定方程组)有效。
!mn 时计算结果不一定有效
!*****************
! 用最小二乘法计算方程组
! 传进来 Amatrix Bvector
use constants
use vars_fangchengzu_shuju
!use qiujie_jieguo
implicit none
integer, intent(in) :: m,n
logical, allocatable :: p(:),r(:)
real, allocatable :: w(:),s(:)
real,intent(in),dimension(m,n) :: A
real,intent(in),dimension(m) :: b
real,intent(inout),dimension(n) :: x
real, allocatable :: AT(:,:),bAx(:)
! transpose of A
! b-Ax
real, allocatable :: norm_lie(:)
! 放矩阵A中,n列数据的绝对值的和
real :: tol
real :: arg_min
! arg_mig=||A^T(b-Ax)||
real :: max_wi
integer :: i,jc,j(1),iter
integer :: itmax
iter=0;
!ishape=shape(Amatrix)
!m=ishape(1);n=ishape(2)
allocate(p(n),r(n))
p=.false.
r=.true.
allocate(w(n),s(n))
w=0.;s=0.
allocate(at(n,m),bAx(m))
!A=Amatrix;b=Bvector;
at=transpose(A);
!deallocate(Amatrix,Bvector)
x=0.
!********************
! 获得误差的判定值
allocate(norm_lie(n))
norm_lie=0.
do i=1,n
do jc=1,m
norm_lie(i)=norm_lie(i)+abs(A(jc,i));
enddo
enddo
tol=1.0e-9*maxval(norm_lie)*m
itmax=3*n;
! 最大的迭代次数。
!******************
bAx=b-matmul(A,x)
w=matmul(at,bAx)
!****************************************************
do while (any(R) .and. maxval(w)tol) !***! do while
j=MAXLOC(w)
! j=argmax(wi)
p(j(1))=.true.;
r(j(1))=.false.
!******************
iter=iter+1;
call lsq_sp(A,b,x,p,r,m,n,tol)
! 返回了新的 x p, r
!******************
!******************
bAx=b-matmul(A,x)
w=matmul(at,bAx)
!*******************
write(*,*) iter=,iter
write(*,*) max_w=,maxval(w)
if(iteritmax) then
write(*,*)迭代次数过多,请增大 tol 的值,即增大误差。
write(*,*) tol= ,tol
return
endif
enddo !***! do while
!****************************************************
return
end subroutine Lsqnonneg
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!*****************************************************!
!
文档评论(0)