| [Fortran] syntaxhighlighter_viewsource syntaxhighlighter_copycode program test
implicit none
integer :: k, j
real :: E, T1, F1, F, T, V, a
real, PARAMETER :: pi = 3.1415926535897932
write (*,*) '输入V和a,都是原子单位'
read (*,*) V, a
open (unit=100,file='E.dat')
open (unit=200,file='k.dat')
k=int(a*sqrt(2.0*V)/pi)+1   !解的总个数,通过横坐标ε进行判断
write (200,*) k             !看一下解的个数,和后面得到的E的个数应该是相等的
j=1                         !初始解个数为1个
E=0.001                     !开始寻找时E的初始数值
F1=-1.0                     !偶宇称时,表达式在E=0时的初始值
T1=-1.0                     !奇宇称时,表达式在E=0时的初始值
do while (j .LE. k)         !和解的总个数K比较,得到进行的循环的次数
  F=sqrt(E/(V-E))*tan(0.5*a*sqrt(2.0*E))-1.0  ! 偶宇称时化简后的表达式
  T=sqrt(E/(V-E))*tan(0.5*a*sqrt(2.0*E)+pi/2.0)-1.0   !奇宇称时化简后的表达式
  if (F*F1 .LE. 0.0) then                           !寻找满足的E,它使f的符号变化。
    if(abs(F) .LT. abs(F1) .and. F .GT. -1.0) write (100,*) V, E !看看谁和0更近,去进的时候的E
 if(abs(F) .GT. abs(F1) .and. F .GT. -1.0) write (100,*) V, E-0.001  !因为0.001是E的步长
    j=j+1                    !偶宇称得到一个解
   end if
  if (T*T1 .LE. 0.0)  then
    if (abs(T) .LT. abs(T1) .and. T .GT. -1.0) write (100,*) V, E
    if (abs(T) .GT. abs(T1) .and. T .GT. -1.0) write (100,*) V, E-0.001
    j=j+1                    !奇宇称时的一个解
  end if
 F1=F       !把新的f放到f1中,进行下一步的比较
 T1=T       !把新的t放到t1中,在进行下一步比较
 E=E+0.001 ! E的步长
 end do   !do 循环结束,这样随着E的增大,得到了k个解
 end program test
 
 
 
 |