回 帖 发 新 帖 刷新版面

主题:[讨论]一个简单问题,请各位指教

PROGRAM NUMBER
    REAL M1,C0,C1,K0
      DIMENSION XVEC(2000),YVEC(2000)
    OPEN(UNIT=200,FILE='DATA.TXT',STATUS='UNKNOWN')
    READ(200,*)
    READ(200,*)K0,K1,W
    READ(200,*)
    READ(200,*)M1,C0,C1
    READ(200,*)
    READ(200,*)KS,LS,CS
    READ(200,*)
    DO 300 I=1,1911

      READ(200,*) XVEC(I),YVEC(I)
C      PRINT*,XVEC(I),YVEC(I)
300    CONTINUE
C     PRINT*,K0,K1,W,M1,C0,C1,KS,LS,CS
      CLOSE(200)
    CALL  ENLG3(XVEC,YVEC,1911,a,b)
    READ*,a
    PRINT*,b     
    END
    
    
    SUBROUTINE ENLG3(X,Y,N,T,Z)
    DIMENSION X(N),Y(N)
    DOUBLE PRECISION X,Y,T,Z,S
    Z=0.0
    IF (N.LE.0) RETURN
    IF (N.EQ.1) THEN
      Z=Y(1)
      RETURN
    END IF
    IF (N.EQ.2) THEN
      Z=(Y(1)*(T-X(2))-Y(2)*(T-X(1)))/(X(1)-X(2))
      RETURN
    END IF
    IF (T.LE.X(2)) THEN
      K=1
      M=3
    ELSE IF (T.GE.X(N-1)) THEN
      K=N-2
      M=N
    ELSE
      K=1
      M=N
10      IF (IABS(K-M).NE.1) THEN
        L=(K+M)/2
        IF (T.LT.X(L)) THEN
          M=L
        ELSE
          K=L
        END IF
        GOTO 10
      END IF
      IF (ABS(T-X(K)).LT.ABS(T-X(M))) THEN
        K=K-1
      ELSE
        M=M+1
      END IF
    END IF
    Z=0.0
    DO 30 I=K,M
      S=1.0
      DO 20 J=K,M
        IF (J.NE.I) THEN
          S=S*(T-X(J))/(X(I)-X(J))
        END IF
20      CONTINUE
      Z=Z+S*Y(I)
30    CONTINUE
    RETURN
           END

用的是插值法计算,但是算出来的结果数量级差得太多了,应该是数据传递时出错了吧,请各位大侠指点![em2]

回复列表 (共6个回复)

沙发

程序加上 implicit none,在修改如下问题:


warning #6717: This name has not been given an explicit type.   [K1]
 warning #6717: This name has not been given an explicit type.   [W]
 warning #6717: This name has not been given an explicit type.   [KS]
 warning #6717: This name has not been given an explicit type.   [LS]
 warning #6717: This name has not been given an explicit type.   [CS]
 warning #6717: This name has not been given an explicit type.   [I]
 warning #6717: This name has not been given an explicit type.   [XVEC]
 warning #6717: This name has not been given an explicit type.   [YVEC]
 warning #6717: This name has not been given an explicit type.   [A]
 warning #6717: This name has not been given an explicit type.   [B]
 warning #6717: This name has not been given an explicit type.   [N]
: warning #6717: This name has not been given an explicit type.   [K]
: warning #6717: This name has not been given an explicit type.   [M]
: warning #6717: This name has not been given an explicit type.   [L]
: warning #6717: This name has not been given an explicit type.   [I]
: warning #6717: This name has not been given an explicit type.   [J]
 error #6633: The type of the actual argument differs from the type of the dummy argument.   [XVEC]
 error #6633: The type of the actual argument differs from the type of the dummy argument.   [YVEC]
 error #6633: The type of the actual argument differs from the type of the dummy argument.   [A]
 error #6633: The type of the actual argument differs from the type of the dummy argument.   [B]

板凳


      implicit none   
    REAL K0,K1,W,M1,C0,C1,KS,LS,CS,XVEC,YVEC,A,B
    INTEGER I
      DIMENSION XVEC(2000),YVEC(2000)
    OPEN(UNIT=200,FILE='DATA.TXT',STATUS='UNKNOWN')
    READ(200,*)
    READ(200,*)K0,K1,W
    READ(200,*)
    READ(200,*)M1,C0,C1
    READ(200,*)
    READ(200,*)KS,LS,CS
    READ(200,*)
    DO 300 I=1,1911

      READ(200,*) XVEC(I),YVEC(I)
C      PRINT*,XVEC(I),YVEC(I)
300    CONTINUE
C     PRINT*,K0,K1,W,M1,C0,C1,KS,LS,CS
      CLOSE(200)
    CALL  ENLG3(XVEC,YVEC,1911,a,b)
    READ*,a
    PRINT*,b     
    END


  SUBROUTINE ENLG3(X,Y,N,T,Z)
    DIMENSION X(N),Y(N)
    DOUBLE PRECISION X,Y,T,Z,S
    Z=0.0
    IF (N.LE.0) RETURN
    IF (N.EQ.1) THEN
      Z=Y(1)
      RETURN
    END IF
    IF (N.EQ.2) THEN
      Z=(Y(1)*(T-X(2))-Y(2)*(T-X(1)))/(X(1)-X(2))
      RETURN
    END IF
    IF (T.LE.X(2)) THEN
      K=1
      M=3
    ELSE IF (T.GE.X(N-1)) THEN
      K=N-2
      M=N
    ELSE
      K=1
      M=N
10      IF (IABS(K-M).NE.1) THEN
        L=(K+M)/2
        IF (T.LT.X(L)) THEN
          M=L
        ELSE
          K=L
        END IF
        GOTO 10
      END IF
      IF (ABS(T-X(K)).LT.ABS(T-X(M))) THEN
        K=K-1
      ELSE
        M=M+1
      END IF
    END IF
    Z=0.0
    DO 30 I=K,M
      S=1.0
      DO 20 J=K,M
        IF (J.NE.I) THEN
          S=S*(T-X(J))/(X(I)-X(J))
        END IF
20      CONTINUE
      Z=Z+S*Y(I)
30    CONTINUE
    RETURN

我改成这样,但输出数的数量级差的太大问题还没有解决,还有您能告诉我一下我这个程序是因为什么才出现这样的问题么?谢谢

3 楼

加强基本功训练吧,先来些简单的、自己能处理的程序。找一本合适的教科书很重要。

4 楼

5 楼

最近时间有点紧,全看不太可能了,麻烦您能跟我说说这个程序出的问题大概在书上什么章节么,万分感谢

6 楼

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

我来回复

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