展开全部
具体幂法的原理可参考书籍,包含一个3x3的矩阵的程序如下:
======
module power
contains
subroutine solve(A,N,namda,u,tol)
implicit real*8 (a-h,o-z)
integer :: n,i,k
real*8 :: A(n,n),u(n),u0(n),v(n),m0,m1,namda
!迭代初始向量
u0(:) = 1.0d0
u = u0
!设置模最大分量初值,进入循环
m0 = 0.0d0
do k = 1,500
v = matmul(A,u)
call max_rou(v,n,m1)
u = v/m1
!判断迭代停止
if(dabs(m1-m0)<tol) exit
!更新m值
m0 = m1
end do
namda = m1
end subroutine
subroutine max_rou(r,n,ma)
implicit real*8 (a-h,o-z)
integer :: n,i,k
real*8 :: r(n),ma
ma = dabs(r(1))
do i = 2,n
if(dabs(r(i))>ma) then
ma = dabs(r(i))
k = i
end if
end do
ma = r(k)
end subroutine
end module
program main
use power
implicit real*8 (a-h,o-z)
real*8 :: A(3,3),u(3),namda
a = reshape((/-1.0d0,2.0d0,1.0d0, &
2.0d0,-4.0d0,1.0d0, &
1.0d0,1.0d0,-6.0d0 /),(/3,3/))
call solve(A,3,namda,u,1.0d-7)
write(*,101) namda,u
101 format(T5,'幂法计算主特征值及特征向量',//,&
T3,'主特征值为: ',F12.7,//,&
T3,'主特征向量为: ',3(/F12.7))
stop
end program
======
运行结果
======
幂法计算主特征值及特征向量
主特征值为: -6.4210663
主特征向量为:
-0.0461457
-0.3749207
1.0000000
======
======
module power
contains
subroutine solve(A,N,namda,u,tol)
implicit real*8 (a-h,o-z)
integer :: n,i,k
real*8 :: A(n,n),u(n),u0(n),v(n),m0,m1,namda
!迭代初始向量
u0(:) = 1.0d0
u = u0
!设置模最大分量初值,进入循环
m0 = 0.0d0
do k = 1,500
v = matmul(A,u)
call max_rou(v,n,m1)
u = v/m1
!判断迭代停止
if(dabs(m1-m0)<tol) exit
!更新m值
m0 = m1
end do
namda = m1
end subroutine
subroutine max_rou(r,n,ma)
implicit real*8 (a-h,o-z)
integer :: n,i,k
real*8 :: r(n),ma
ma = dabs(r(1))
do i = 2,n
if(dabs(r(i))>ma) then
ma = dabs(r(i))
k = i
end if
end do
ma = r(k)
end subroutine
end module
program main
use power
implicit real*8 (a-h,o-z)
real*8 :: A(3,3),u(3),namda
a = reshape((/-1.0d0,2.0d0,1.0d0, &
2.0d0,-4.0d0,1.0d0, &
1.0d0,1.0d0,-6.0d0 /),(/3,3/))
call solve(A,3,namda,u,1.0d-7)
write(*,101) namda,u
101 format(T5,'幂法计算主特征值及特征向量',//,&
T3,'主特征值为: ',F12.7,//,&
T3,'主特征向量为: ',3(/F12.7))
stop
end program
======
运行结果
======
幂法计算主特征值及特征向量
主特征值为: -6.4210663
主特征向量为:
-0.0461457
-0.3749207
1.0000000
======
更多追问追答
追问
你的方法是Fortran科学计算与工程-宋叶志里面的吧 而且那上面的源代码好像有点问题 改完后我在4.0上运行不出来 可能是我水平比较差找不到具体原因. 我想找的是一个一般的n*n 阶矩阵的 不需要具体的输出 一个子程序就行 运行环境是4.0 。
不过还是非常感谢你的回答
追答
(1) 这个代码的确摘抄至《Fortran科学计算与工程》. 这3x3只是一个例子, 经过修改应该可以运行的.
(2) 我测试的环境是Linux(Debian), Intel Fortran Compiler, 完全没有问题.
(3) 如果要做任意n*n的矩阵, 可以用动态数组.
(4) 如果要做成一个子程序, 接收输入, 给出输出, 只需修改program main那段代码即可.
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询