声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 7102|回复: 12

[Fortran] 用Jacobi法求实对称矩阵的特征值与特征向量(Fortran源程序)

[复制链接]
发表于 2005-12-19 20:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
本人编写的用Jacobi法求实对称矩阵的特征值与特征向量,采用Fortran程序,经测试正确无误

  1.         PROGRAM TEZHENG_Jacobi
  2. * 用Jacobi方法求正交矩阵的特征值与特征向量
  3. *   就是用平面旋转矩阵U不断对矩阵A作正交相似变换把A化为对角矩阵,
  4. *   从而求出A的特征值与特征向量
  5. *
  6. * Made by ZhaoZunsheng,2005.12.20
  7. *
  8.         IMPLICIT NONE
  9.         INTEGER NMAX,N,I,J,P,Q
  10.         PARAMETER(NMAX=50)
  11.         REAL A(NMAX,NMAX),AMAX,TEMP,ZEMP,COO,SII,CO,SI,APP,AQQ,APQ,API,AQI
  12.         REAL R(NMAX,NMAX),RIP,RIQ
  13.         CHARACTER NAME*12,NAMEO*12,CHR*1
  14. * 从文件中读入实对称矩阵A
  15.         WRITE(*,*)'输入实对称矩阵维数n(n<51):'
  16.         READ(*,*) N
  17.         WRITE(*,*)'输入矩阵文件:'
  18.         READ(*,*) NAME
  19.         OPEN(6,FILE=NAME)
  20.         DO I=1,N
  21.          READ(6,*) (A(I,J),J=1,I)
  22.          DO J=1,I
  23.          A(J,I)=A(I,J)
  24.          ENDDO
  25.         ENDDO
  26.         CLOSE(6)
  27. * R矩阵存放正交变换矩阵U,在这先初始化,即单位矩阵
  28.         DO I=1,N
  29.         DO J=1,N
  30.         R(I,J)=0
  31.         ENDDO
  32.         R(I,I)=1
  33.         ENDDO
  34. * 在矩阵A的非主对角线元素中,找出按模最大的元素Apq
  35. 100        AMAX=ABS(A(2,1))
  36.         P=2
  37.         Q=1
  38.         DO I=2,N
  39.          DO J=1,I-1
  40.          IF(ABS(A(I,J)).GT.AMAX) THEN
  41.          AMAX=ABS(A(I,J))
  42.          P=I
  43.          Q=J
  44.          ENDIF
  45.          ENDDO
  46.         ENDDO

  47. *        do i=1,n
  48. *                WRITE(*,*)(A(I,J),J=1,N)
  49. *        enddo

  50. * 当非主对角线元素化为0,即小于给定精度时,输出特征值与特征向量
  51.         IF(AMAX.LE.1.0E-7) THEN
  52.         WRITE(*,*) 'A的特征值为:'
  53.         WRITE(*,*) (A(I,I),I=1,N)
  54.         WRITE(*,*) 'A的特征向量为:'
  55.         WRITE(*,*) '  X1      X2     X3     ...:'
  56.         DO I=1,N
  57.         WRITE(*,*)(R(I,J),J=1,N)
  58.         ENDDO

  59.         WRITE(*,*) '是否将结果存入文件(Y/N)?'
  60.         READ(*,*) CHR
  61.         IF(CHR.EQ.'Y'.OR.CHR.EQ.'y') THEN
  62.         WRITE(*,*) '输入文件名(小于12字符):'
  63.         READ(*,*) NAMEO
  64.         OPEN(8,FILE=NAMEO)
  65.         WRITE(8,*) 'A的特征值为:'
  66.         WRITE(8,*) (A(I,I),I=1,N)
  67.         WRITE(8,*) 'A的特征向量为:'
  68.         WRITE(8,*) '  X1      X2     X3     ...:'
  69.         DO I=1,N
  70.         WRITE(8,*)(R(I,J),J=1,N)
  71.         ENDDO
  72.         CLOSE(8)
  73.         ENDIF

  74.         STOP
  75.         ENDIF
  76. * 开始准备计算平面旋转矩阵U
  77.         TEMP=2*A(P,Q)/(A(P,P)-A(Q,Q)+1.0e-30)
  78.         ZEMP=(A(P,P)-A(Q,Q))/(2*A(P,Q))
  79.        
  80.         IF(ABS(TEMP).LT.1.0) THEN
  81.         COO=(1+TEMP**2)**(-0.5)
  82.         SII=TEMP*(1+TEMP**2)**(-0.5)
  83.         ELSE
  84.         COO=ABS(ZEMP)*(1+ZEMP**2)**(-0.5)
  85.         SII=SIGN(1.0,ZEMP)*(1+ZEMP**2)**(-0.5)
  86.         ENDIF
  87.        
  88.         CO=SQRT(0.5*(1+COO))
  89.         SI=SII/(2*CO)
  90. * 计算平面旋转矩阵U
  91.         DO I=1,N
  92.         RIP=R(I,P)*CO+R(I,Q)*SI
  93.         RIQ=-R(I,P)*SI+R(I,Q)*CO
  94.         R(I,P)=RIP
  95.         R(I,Q)=RIQ
  96.         ENDDO
  97. * 对A进行变换       
  98.         APP=A(P,P)*CO**2+A(Q,Q)*SI**2+2*A(P,Q)*CO*SI
  99.         AQQ=A(P,P)*SI**2+A(Q,Q)*CO**2-2*A(P,Q)*CO*SI
  100.         APQ=0.5*(A(Q,Q)-A(P,P))*SII+A(P,Q)*COO
  101.         A(P,P)=APP
  102.         A(Q,Q)=AQQ
  103.         A(P,Q)=APQ
  104.         A(Q,P)=A(P,Q)
  105.        
  106.         DO I=1,N
  107.         IF(I.EQ.P.OR.I.EQ.Q) THEN
  108.         ELSE
  109.         API=A(P,I)*CO+A(Q,I)*SI
  110.         AQI=-A(P,I)*SI+A(Q,I)*CO
  111.         A(P,I)=API
  112.         A(Q,I)=AQI
  113.         A(I,P)=A(P,I)
  114.         A(I,Q)=A(Q,I)
  115.         ENDIF
  116.         ENDDO
  117.        
  118.       GOTO 100  
  119.         END
复制代码

评分

1

查看全部评分

本帖被以下淘专辑推荐:

回复
分享到:

使用道具 举报

发表于 2005-12-22 08:14 | 显示全部楼层

回复:(zzs608)用Jacobi法求实对称矩阵的特征值与特...

学习学习
发表于 2005-12-23 15:42 | 显示全部楼层
<P>好好学学!!</P>
发表于 2005-12-24 19:25 | 显示全部楼层
<P>谢谢楼主分享[em01]</P>
发表于 2005-12-25 11:25 | 显示全部楼层

回复:(zzs608)用Jacobi法求实对称矩阵的特征值与特...

谢谢分享
发表于 2005-12-30 14:37 | 显示全部楼层
学习一下。谢谢了
发表于 2006-1-2 14:48 | 显示全部楼层
<P>非常感谢楼主啦!!我正好有急用啊~~!!!</P>
发表于 2006-1-3 21:29 | 显示全部楼层
谢谢,好好学习一下!!!!!!!
发表于 2006-2-20 09:14 | 显示全部楼层
谢谢楼主了
发表于 2006-3-16 09:40 | 显示全部楼层
<P>谢谢分享,学习中!!</P>
发表于 2010-4-6 21:15 | 显示全部楼层
nice
3q for sharing
发表于 2010-7-6 08:33 | 显示全部楼层
perfect! thanks
发表于 2010-7-13 12:04 | 显示全部楼层

回复 楼主 zzs608 的帖子

非常感谢~~~:handshake
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-9-20 17:58 , Processed in 0.056010 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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