Fortran Coder

标题: 我用k表示个数,为什么出来的个数和k对应不起来? [打印本页]

作者: 小范范1989    时间: 2014-4-11 07:45
标题: 我用k表示个数,为什么出来的个数和k对应不起来?
[Fortran] 纯文本查看 复制代码
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





作者: teddy2003    时间: 2014-4-13 22:09
是怎么对应不起来啊,程序看样没问题啊。
作者: Saphy    时间: 2014-4-14 12:09
本帖最后由 Saphy 于 2014-4-14 12:11 编辑

虽然不了解你算的东西,但纯从代码方面来看,问题有两个
1. 当F=F1,T=T1时,不会输出E
2. 当F,T<-1时,也不会输出E
其中2是主要问题,你可以从这方面检查你的计算公式
作者: 小范范1989    时间: 2014-4-17 09:20
Saphy 发表于 2014-4-14 12:09
虽然不了解你算的东西,但纯从代码方面来看,问题有两个
1. 当F=F1,T=T1时,不会输出E
2. 当F,T ...

谢谢,我会好好看看的,之前没太注意
作者: 小范范1989    时间: 2014-4-17 09:21
teddy2003 发表于 2014-4-13 22:09
是怎么对应不起来啊,程序看样没问题啊。

按我的分子,k和个数应该是相等的,但是算出来后确实不相等的




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2