找回密码
 注册
Simdroid-非首页
查看: 196|回复: 11

[3. Fortran] 用FORTRAN怎样对矩阵做LU分解

[复制链接]
发表于 2008-3-31 09:48:09 | 显示全部楼层 |阅读模式 来自 湖南长沙
请问各位,用FORTRAN怎样对矩阵做LU分解,我在IMSL里面好像没看到
发表于 2008-3-31 10:12:47 | 显示全部楼层 来自 黑龙江哈尔滨
Simdroid开发平台
不要局限于某种语言,算法是关键!
回复 不支持

使用道具 举报

 楼主| 发表于 2008-3-31 15:58:29 | 显示全部楼层 来自 湖南长沙
不是的,我现在是F程序里面要用到,想直接从IMSL调用这个功能的函数,在一本算法集上面看到应该是LUDCMP函数,但IMSL里搜不到,不知道是不是盗版软件的原因,难道是IMSL不全,要自己把子程序编了也可以,但没那个必要
回复 不支持

使用道具 举报

发表于 2008-4-3 13:07:33 | 显示全部楼层 来自 黑龙江哈尔滨
imsl里面有 不过请尽量支持正版
回复 不支持

使用道具 举报

发表于 2008-4-7 14:21:38 | 显示全部楼层 来自 黑龙江哈尔滨
在何光渝的《VISUAL FORTRAN 常用数值算法集》的第一章里也有,现成的一个源程序。
回复 不支持

使用道具 举报

 楼主| 发表于 2008-4-7 21:24:51 | 显示全部楼层 来自 湖南长沙
呵呵,谢谢各位了,我的矩阵是复数矩阵,所以麻烦一点,现在LU已经解决,还要用到QR分解,IMSL里的LQRRR只对实矩阵分解,不像LU有另外的函数对复矩阵分解,问题还没解决,有哪位知道的话指点一下,感激不尽,谢谢。
回复 不支持

使用道具 举报

发表于 2008-4-11 17:29:32 | 显示全部楼层 来自 LAN
到网上下载一个 Blas 和 Lapack 库(www.netlib.org),有针对不同 CPU 及相应平台下二进制文件,当然也有 Windows 下的函数库。
个人觉得 Blas 库或 Lapack 库的稳定性和速度远优于算法集中的函数。你所提到的几种分解,在 Lapack 中都有。
回复 不支持

使用道具 举报

发表于 2008-4-29 12:25:23 | 显示全部楼层 来自 台湾台北

回复 6# 的帖子

huangfen,
你可以看看IMSL中的ORTH函数,是否可以解决你的问题。

或是直接到IMSL的论坛
http://www.vni.com.tw/forums/
发问~


[ 本帖最后由 andytsai 于 2008-4-29 12:27 编辑 ]
回复 不支持

使用道具 举报

发表于 2008-5-3 20:21:44 | 显示全部楼层 来自 北京
长见识了,好多库都不懂
回复 不支持

使用道具 举报

发表于 2008-5-5 19:31:01 | 显示全部楼层 来自 北京工业大学
高斯分解
SUBROUTINE sparin_gauss(kv,kdiag)
!
! This subroutine performs Gaussian factorisation of a skyline matrix.
!
IMPLICIT NONE
INTEGER,PARAMETER::iwp=SELECTED_REAL_KIND(15)
INTEGER,INTENT(IN)::kdiag(
REAL(iwp),INTENT(OUT)::kv(:)
REAL(iwp)::num,den,fac,zero=0.0_iwp
INTEGER::n,ii,i,j,k,l,kk,l1,l2,l3
n=UBOUND(kdiag,1)
DO j=1,n-1
   den=kv(kdiag(j))
   ii=0                 
   DO i=j+1,n
     ii=ii+1
     l=kdiag(i)-ii
     IF(l-kdiag(i-1)>zero)THEN
       num=kv(l)
       fac=num/den
       kk=-1
       DO k=i,n
         kk=kk+1
         l1=kdiag(i+kk)-kk
         l2=l1-ii
         l3=kdiag(i+kk-1)
         IF(l2-l3>zero)kv(l1)=kv(l1)-fac*kv(l2)
       END DO
     END IF
   END DO
END DO
RETURN
END SUBROUTINE sparin_gauss
回复 不支持

使用道具 举报

发表于 2008-5-5 19:35:14 | 显示全部楼层 来自 北京工业大学
subroutine banred(bk,n)
! gaussian reduction on a vector stored as an upper triangle
implicit none
real,intent(in out)::bk(;integer,intent(in)::n
integer::i,il1,kbl,j,ij,nkb,m,ni,nj,iw ; real::sum
iw = ubound(bk,1)/n-1
       do i=2,n
          il1=i-1;kbl=il1+iw+1
          if(kbl-n>0)kbl=n
          do j=i,kbl
             ij=(j-i)*n+i;sum=bk(ij);nkb=j-iw
             if(nkb<=0)nkb=1
             if(nkb-il1<=0)then
                do m=nkb,il1
                   ni=(i-m)*n+m ; nj=(j-m)*n+m
                   sum=sum-bk(ni)*bk(nj)/bk(m)
                end do
             end if
             bk(ij)=sum
           end do
       end do
return
end subroutine banred
回复 不支持

使用道具 举报

发表于 2008-5-20 20:53:10 | 显示全部楼层 来自 湖南长沙
谢谢各位!
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-11-1 15:20 , Processed in 0.050185 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表