回 帖 发 新 帖 刷新版面

主题:各位高手来看下怎么改

这程序运行不出结果来,大家来帮忙改改啊。灰常谢谢!!




implicit none
integer i,p,n
real q(20,20),a(20),b(20),c(20),h(20),y(20),x(20),D(20),K(20), qa(20),sx(20)
real t,z,ET,R,r1,r2
real,parameter::e=2.7128
  qa(0)=0.28
  n=20
  t=1
  z=2
  ET=0
  R=0.0208
   a(0)=0
   D(0)=1671.8*(qa(0)/0.462)**4.978
   K(0)=(2.7E-8)*(e**(47.3*qa(0)))
   b(0)=D(0)/z
   c(0)=-b(0)
   h(0)=R-K(0)-ET
   y(0)=h(0)/b(0)
   x(0)=c(0)/b(0)
   r1=t/z**2
   r2=t/(2*z)

   i=1
  do
   D(i)=1671.8*((qa(i)/0.462)**4.978)
   K(i)=(2.7E-8)*(e**(47.3*qa(i)))
   a(i)=-r1*(D(i)+D(i-1))/2
   c(i)=-r1*(D(i)+D(i+1))/2
   b(i)=1-(a(i)+c(i))
   h(i)=qa(i)-r2*(K(i+1)-K(i-1))
   y(i)=(h(i)-a(i)*y(i-1))/(b(i)-a(i)*x(i-1))
   x(i)=c(i)/(b(i)-a(i)*x(i-1))
  i=i+1
   if (i==n-2)exit
   qa(n-1)=(h(n-1)-a(n-1)*y(n-2))/(b(n-1)-a(n-1)*x(n-2))
   end do

   do i=n-2,0
   qa(i)=y(i)-x(i)*qa(i+1)
  print*,qa(i)
   end do

p=1
  do
q(i,p)=qa(i)
q(i,p-1)=q(i,p)
sx(p)=abs((q(i,p)-q(i,p-1))/q(i,p-1))
p=p+1
if(sx(p)<=0.01)exit
end do
qa(i)=q(i,p)
  
   print*,qa(i)
   end

回复列表 (共12个回复)

沙发

网上求助,建议你先把 read 语句换成赋值,否则,别人未必知道您输入值。

板凳

改好了

3 楼

我刚才复制到程序里测试了一下,发现你的很多数组时从零开始的,而你的声明却是默认的,就是从一开始,所以会发生错误,要把比如a(20)改成A(0:20)

4 楼

行,我去试试,有问题在问你行不?
非常谢谢!!

5 楼

经如下修改,程序可以运行,但还有 错误,因为不知道你程序到底是要干什么,所以,不好修改。

program main
  implicit none
 
  integer:: i, p, n
  real:: q(0 : 20, 0 : 20)
  real:: a(0 : 20),b(0 : 20),c(0 : 20)
  real:: h(0 : 20),y(0 : 20),x(0 : 20)
  real:: D(0 : 20), K(0 : 20)
  real:: qa(0 : 20), sx(20)
  real:: t,z,ET,R,r1,r2
  real, parameter:: e = 2.7128
  
  qa(0) = 0.28
  n = 20
  t = 1
  z = 2
  ET = 0
  R=0.0208
  a(0)=0
  D(0)=1671.8*(qa(0)/0.462)**4.978
  K(0)=(2.7E-8)*(e**(47.3*qa(0)))
  b(0)=D(0)/z
  c(0)=-b(0)
  h(0)=R-K(0)-ET
  y(0)=h(0)/b(0)
  x(0)=c(0)/b(0)
  r1=t/z**2
  r2=t/(2*z)

  i=1
  do
    D(i)=1671.8*((qa(i)/0.462)**4.978)
    K(i)=(2.7E-8)*(e**(47.3*qa(i)))
    a(i)=-r1*(D(i)+D(i-1))/2
    c(i)=-r1*(D(i)+D(i+1))/2
    b(i)=1-(a(i)+c(i))
    h(i)=qa(i)-r2*(K(i+1)-K(i-1))
    y(i)=(h(i)-a(i)*y(i-1))/(b(i)-a(i)*x(i-1))
    x(i)=c(i)/(b(i)-a(i)*x(i-1))
    i=i+1
    if (i==n-2)exit
    qa(n-1)=(h(n-1)-a(n-1)*y(n-2))/(b(n-1)-a(n-1)*x(n-2))
   end do

   do i = n - 2, 0, -1
     qa(i) = y(i)-x(i)*qa(i+1)
     write(*, *) qa(i)
   end do

  p=1
  do
    q(i,p)=qa(i)
    q(i,p-1)=q(i,p)
    sx(p)=abs((q(i,p)-q(i,p-1))/q(i,p-1))
    p=p+1
    if(sx(p)<=0.01)exit
  end do
  qa(i)=q(i,p)  
  write(*, *) qa(i)
 
  stop
end program main

6 楼

我现在把整个程序分解成几个小的

implicit none
real a(20),b(20),c(20),h(20),y(20),x(20),D(20),K(20),qa(20)
real t,z,r1,r2    
real,parameter::e=2.7128
read*,t,z
   qa(0)=0.28
   D(0)=138.2131
   K(0)=1.4843927E-02
   h(0)=5.9560733E-03
   a(0)=0
   x(0)=-1
   b(0)=D(0)/z
   c(0)=-b(0)
   y(0)=h(0)/b(0)
   r1=t/(z**2)
   r2=t/(2*z)
   
   qa(1)=(y(0)-qa(0))/x(0)
   D(1)=1671.8*((qa(1)/0.462)**4.978)
   K(1)=(2.7E-8)*(e**(47.3*qa(1)))
   a(1)=-r1*D(0)
   c(1)=-r1*D(1)
   b(1)=1-(a(1)+c(1))
   h(1)=qa(1)-r2*(K(1)-K(0))
   y(1)=(h(1)-a(1)*y(0))/(b(1)-a(1)*x(0))
   x(1)=c(1)/(b(1)-a(1)*x(0)) 

    
   qa(2)=(y(1)-qa(1))/x(1)
   D(2)=1671.8*((qa(2)/0.462)**4.978)
   K(2)=(2.7E-8)*(e**(47.3*qa(2)))
   a(2)=-r1*D(1)
   c(2)=-r1*D(2)
   b(2)=1-(a(2)+c(2))
   h(2)=qa(2)-r2*(K(2)-K(1))
   y(2)=(h(2)-a(2)*y(1))/(b(2)-a(2)*x(1))
   x(2)=c(2)/(b(2)-a(2)*x(1)) 
print*,qa(2),D(2),K(2),a(2),b(2),c(2),h(2),y(2),x(2)
end


目前的问题是 那些数组这样从1开始带入能运行 用循环(i)就运行不出来 

7 楼

唉~ 楼主你没看明白楼上几位为什么帮你改那个"0"!!
不知道你是否有C的基础, C语言的数组序数默认是由0到n-1; 但是Fortran恰好不是. (估计没翻书或者翻书不认真)
所以你调用qa(0)本身就是越界, 越界不一定不能运行, 但是编程不允许的. 你一定要序数有0开始就用3楼和5楼的定义.

8 楼


[em8] 我C和FORTRAN都看过,会混了,丢人啊,呵呵

9 楼

犯错误不丢人, 改过来就是了. 那个初学都这样走过来. 
我也是学了C在转过来的, 只要注意一下Fortran的特点, 其实有C的基础Fortran挺好上手的.

10 楼


深圳华信群英科技有限公司,目前主要从事软件外包开发、高级软件人才定向输送等业务,面对日益严峻的大学生就业难和IT企业招聘难,自2006以来,与知名通信软件公司正式签订定向输送人才的合作协议,针对想进入软件行业的人员提供企业实训,实训课程采用“2+3”分段教学模式,分为2个月理论强化和3个月项目实训两个阶段,共计900学时。
企业订单委培,内训前签订就业安置协议,100%保证就业。实训结束之后,在华信群英科技及其战略合作伙伴从事通信软件研发工作。欢迎有意向者加QQ:649846168咨询。

我来回复

您尚未登录,请登录后再回复。点此登录或注册